Разъяснение по фильтрам и крючкам
Я собираюсь начать свой первый проект WordPress, и у меня есть задача переместить настроенный основной код, который переопределяет ядро, в отдельные функции/файлы (таким образом, его будет легче поддерживать при обновлении в будущем.
Я проводил исследования, и похоже, что add_filter
и apply_filter
и do_action
и add_action
, похоже, это правильный путь. Хотя я все еще не уверен в том, как они работают. Являются ли эти методы тем, что я использую для перезаписи основных методов? Я в замешательстве, потому что add_filter
использует слово add
, когда я чувствую, что оно больше похоже на replace
или overwrite
(если я не ошибаюсь)
Я только что прочитал первый ответ на этот (тот, что о тако)
Таким образом, автор использовал три шага при описании того, как использовать add_filter:
Шаг 1: статическое значение переменной $taco
<?php $taco = 'chicken'; ?>
Шаг 2:
<?php
$taco = apply_filters( 'get_taco', 'chicken' );
?>
Шаг 3:
<?php
add_filter( 'get_taco', 'my_special_order' );
function my_special_order( $content ) {
return 'shredded beef';
}
?>
Итак, в этом ситуация заключается в том, что apply_filter
просто создает динамический метод на лету и заставляет его возвращать строку chicken
? Или здесь предполагается, что существует основной метод WordPress под названием get_taco
и что использование apply_filter
поможет переопределить любую исходную функциональность?
Кроме того, можете ли вы только apply_filter
что-то, что вы add_filter
отредактировали? Другими словами, не сработало бы apply_filter('get_taco');
, если бы я сначала не определил add_filter('get_taco', 'my_special_order');
И function my_special_order ($content) ...
?
Помещаю ли я эти фильтры в свой functions.php досье? Простите за бомбардируя вас вопросами, я пришел из Ruby on Rails, так что я совершенно не разбираюсь в WordPress.
2 answers
Я в замешательстве, потому что add_filter использует слово добавить, когда я чувствую, что оно больше похоже на строки заменить или перезаписать (если я не ошибаюсь)
Вы неправильно поняли. И add_action
, и add_filter
вставляют обратные вызовы функций в своего рода очередь. Вы можете добавить много обратных вызовов к одному и тому же крючку, и они будут срабатывать в добавленной последовательности, за исключением случаев, когда приоритет включен в качестве третьего параметра.
Итак, в этой ситуации используется apply_filter просто создаете динамический метод на лету и заставляете его возвращать куриную строку?
apply_filters
-- обратите внимание, что "s" - более или менее создает фильтр, но обычно ему передается переменная, а не строка, и эта переменная передается обратному вызову, который затем изменяет ее и возвращает.
Фильтры "слизни", как правило, не являются названиями основных функций или методов WordPress, хотя некоторые функции имеют фильтры с тем же именем. Например, the_content()
вызывает фильтр the_content
.
Крючки обычно не переопределяют всю функцию целиком, только ее части, но есть исключения и почти исключения.
Кроме того, можете ли вы применить только тот фильтр, который вы добавили?
Нет. Все наоборот. Вы можете только add_filter
что-то, что является apply_filter
ред. Вы можете использовать add_filter('whatever','abc');
, но ничего не произойдет, если где-то не будет apply_filter('whatever',...
.
В значительной степени то же самое относится и к add_action
/do_action
но действия предназначены для того, чтобы делать что-то, а не возвращаемые значения.
Крючки выполняются в разное время при загрузке страницы и в разных местах функций и методов. Например, save_post
выполняется ближе к концу wp_insert_post
в то время как pre_get_posts
выполняется в верхней части get_posts
метод класса WP_Query
. Другие выполняются в в середине загрузки страницы, а не в функции или методе вообще. Они выполняются там, где когда-либо возникает необходимость (по определению разработчиков) либо изменить, либо добавить информацию, либо запустите другие функции, перенаправьте страницу и т.д.
Дополнительная информация
Я думаю, вы немного ошибаетесь.
Фильтры и действия - это функции, которые вы "назначаете" крючкам. Во многих местах WordPress вызывает функции do_action
или apply_filter
. Первым параметром этих функций является имя крючка.
Так, например, когда вы видите
do_action('blabla');
Это означает, что будут вызваны все действия, назначенные крюку "blabla".
add_filter
и add_action
ничего не перезаписывает. Он делает именно то, что говорит - он назначает вашу функцию заданной крюк.
Итак, ваш шаг 2. применяет фильтр get_taco
к статическому значению chicken
. И под применяемым фильтром я подразумеваю, что он вызывает все функции, назначенные get_taco
крюку.
Ваш шаг 3. создает новую функцию my_special_order
и назначает ее крюку get_taco
. Поэтому всякий раз, когда происходит вызов apply_filter('get_taco')
, ваша функция будет вызвана.
Если для данного крючка не назначен фильтр/действие, ничего не будет сделано.
Вы можете прочитать больше по этой теме здесь: http://codex.wordpress.org/Plugin_API