Попробуйте так:
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 подключают другие обработчики для разных событий. Я бы посмотрел, какой/какие из них делает «ненужную» работу и отстреливал именно его/их по одному.