Поддержка Плагины Как отключить hook myCRED?

  • Добрый день. Есть такой код. Как я понял все это вызывается хуком mycred_load_hooks. Я планирую выключить все это, если мета поля не соответствуют нужным данным. Remove_actions не работает внутри add_actions. add_filter также не работает. Менял хуки, вообще перестает работать. По умолчанию этот плагин начисляет баллы при прохождении курса, я эту функцию пытаюсь удалить. Можете помочь?
    Класс не пустой, его не смог перенести в сообщение. Думаю, дело только в хуках. Не понимаю как можно отключть этот хук.

    
    
    add_filter('mycred_setup_hooks', 'Learndash_myCRED_Hook');
    
    function Learndash_myCRED_Hook($installed) {
    
        $installed['hook_learndash'] = array(
            'title' => __('LearnDash', 'mycred'),
            'description' => __('Awards %_plural% for LearnDash actions.', 'mycred'),
            'callback' => array('myCRED_Hook_Learndash')
        );
    
        return $installed;
    }
    
    /**
     * Hook for LearnDash
     */
    add_action('mycred_load_hooks', 'mycred_load_learndash_hook', 10);
    
    function mycred_load_learndash_hook() {
        if (!class_exists('myCRED_Hook_Learndash') && class_exists('myCRED_Hook')) {
    
            class myCRED_Hook_Learndash extends myCRED_Hook {}
    }
    
    add_action("wp", "custom_learndash_automatically_mark_complete");
    //function for Mark Complete Button Removal
    function custom_learndash_automatically_mark_complete() { 
      global $post, $current_user; 
      $course_id = learndash_get_course_id(); 
    
      $course_turn = get_post_meta($course_id, 'turn')[0];
      if(empty($course_id) || $course_turn !== "turned"){
    
        echo $course_turn;
        return;
      }else{
        add_filter( 'mycred_setup_hooks', 'Learndash_myCRED_Hook0');
        function Learndash_myCRED_Hook0(){
            unset( $installed['hook_learndash'] );
            return $installed;
        }
        if( !empty($current_user->ID) && !empty($post->post_type) && $post->post_type == "sfwd-lessons") { 
            learndash_process_mark_complete($current_user->ID, $post->ID); 
          }
        
          if( !empty($current_user->ID) && !empty($post->post_type) && $post->post_type == "sfwd-topic") { 
            learndash_process_mark_complete($current_user->ID, $post->ID); 
          }
      }
    }
    • Тема изменена 2 года, 8 месяцев назад пользователем Yui. Причина: #17

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Плагин Mycred-learndash

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Попробуйте так:

    
    function remove_mycred_hooks() {
    	// Проверяем произвольные поля
    	if ( ... ) {
    		remove_filter( 'mycred_setup_hooks', 'Learndash_myCRED_Hook' );
    		remove_action( 'mycred_load_hooks', 'mycred_load_learndash_hook' );
    		remove_action( 'wp', 'custom_learndash_automatically_mark_complete' );
    	}
    }
    add_action( 'init', 'remove_mycred_hooks' );
    

    Смысл в том, чтобы удалять фильтры и действия после того, как они добавлены (иначе они снова добавятся), но до того, как они выполнены.

    Если приведённый код выполняется сразу при загрузке файла без привязки к какому-либо действию, то для удаления подойдёт действие init.

    Спасибо, что исправили мои сообщения. Я в первый раз пишу такой большой код на форуме и не знал как правильно поступить.
    В примере, есть одна загвоздка, произвольные поля принадлежат курсу, а получить их можно с помощью страницы.

    function remove_mycred_hooks() {
    	global $post;
            print_r($post);
    }
    add_action( 'init', 'remove_mycred_hooks' );

    В этом примере $post ничего не дает а значит и свойство $post->ID не покажет. Исходя из этого я не смогу получить произвольные поля этой страницы. Может быть есть другой подход?
    Произвольные поля я собираюсь получить с помощью функции get_post_meta($post->ID);

    • Ответ изменён 2 года, 8 месяцев назад пользователем wpedgar.
    • Ответ изменён 2 года, 8 месяцев назад пользователем wpedgar.

    do_action(‘mycred_load_hooks’);
    Записан прямо в плагине. Я не до конца понимаю в какой момент он регистрируется и в какой момент он выполняются, чтобы между этими 2 действиями вставить свою функцию. В принципе регистрируется хук довольно рано, но как проверить когда выполняется, чтобы вставить свою функцию?

    Модератор Yuri

    (@yube)

    Я не до конца понимаю в какой момент он регистрируется и в какой момент он выполняются

    Обработчик регистрируется там, где add_action('mycred_load_hooks', ....);.
    Его может и не быть, если этот хук предназначен для аддонов к плагину.

    Выполняется именно там, где вызов do_action('mycred_load_hooks');

    Юрий, это я знаю. Мне непонятно, как достать хуки между этими двумя действиями и внедрить свой. Между add_action и do_action, и параллельно получить массив $post с мета данными.
    mycred_load_hooks относится к плагину mycred_learndash
    mycred_learndash является аддоном к myCred и к Learndash. Он связывает эти плагины.

    • Ответ изменён 2 года, 8 месяцев назад пользователем wpedgar.

    do_action(‘mycred_load_hooks’) находится в mycred_learndash
    add_action(‘mycred_load_hooks’, ….); находится в mycred

    Модератор Yuri

    (@yube)

    как достать хуки

    Их не надо доставать, их надо использовать 🙂

    и внедрить свой.

    Внедрить свой хук Вы можете только в свой код. Разумеется, если не курочить чужие скрипты, что чревато.

    Между add_action и do_action

    Найдите, где (когда) выполняется add_action. Если в основном потоке, то можно использовать хук init, как самый ранний, для снятия с регистрации обработчика. Но см. ниже про wp.

    получить массив $post с мета данными

    $post — объект. Массив — $posts. Если мы о глобальных переменных. До испольнения хука ‘wp’ они не определены, то есть ничего из них извлечь нельзя.
    Метаданные в общем случае не содержатся в объекте $post, их нужно получать функцией get_post_meta().

    и параллельно

    Какой смысл Вы вкладываете в это слово, с учетом того, что мы тут говорим о программировании на php?

    Да, еще, у функций регистрации обработчиков есть параметр «приоритет», позволяющий указать движку, что регистрируемый обработчик нужно выполнять раньше или позже, чем обработчики с дефолтным приоритетом 10. Так что если движок или какой-то плагин добавляет на каком-то хуке свой обработчик, то его можно и уволить на том же хуке, выполнив свой код гарантировано позже.

    Модератор Yuri

    (@yube)

    do_action(‘mycred_load_hooks’) находится в mycred_learndash
    add_action(‘mycred_load_hooks’, ….); находится в mycred

    Скачал оба. Всё наоборот. do_action( 'mycred_load_hooks' ); в mycred/mycred.php. И там же куча add_action( 'mycred_load_hooks',...

    В mycred-learndash попался всего один add_action('mycred_load_hooks', 'mycred_load_learndash_hook', 10);.

    do_action( 'mycred_load_hooks' ); выполняется на хуке ‘after_setup_theme’, то есть до того, как движок поймет, что он показывает. Так что вряд ли можно проверить метаданные (чего?), чтобы «отменить» обработчики этого хука. Надо копать глубже, разбираться, что обработчики делают и тогда, возможно, получится найти место, в котором можно что-то проверить и что-то отменить/изменить.

    Спасибо Юрий, но как раз всей этой информацией я и владел🙂
    Единственное, вы сказали что do_action( 'mycred_load_hooks' ); выполняется на хуке «after_setup_theme». Такой вопрос, а можно ли в своем коде переопределить хук на более поздний,например «wp» или это чревато?

    Слово «Параллельно» звучало бессмысленно. Прошу прощения🙂. Я имел ввиду включить в хук функцию, которая будет проверять метаданные.

    • Ответ изменён 2 года, 8 месяцев назад пользователем wpedgar.
    Модератор Yuri

    (@yube)

    можно ли в своем коде переопределить хук на более поздний,

    Нет. Куда автор вставил do_action, там ему и жить. В своем коде можно маневрировать с обработчиками, но не с точками их подключения.

    Теоретически можно (но крайне нежелательно) изменить код плагина, но более позднее выполнение обработчиков может привести к абсолютно неправильной работе плагина и его довесков. Надо смотреть, что делает каждый из обработчиков, висящих на этом хуке, и если хотя бы один добавляет другие обработчики для хуков, выполнившихся ранее, то точно сломается.

    Судя по всему, обработчики хука mycred_load_hooks подключают другие обработчики для разных событий. Я бы посмотрел, какой/какие из них делает «ненужную» работу и отстреливал именно его/их по одному.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Как отключить hook myCRED?» закрыта для новых ответов.