Документация по фильтрам WordPress? Пытаюсь понять add_filter()
Я несколько раз перечитал документацию и с трудом пытался понять, что происходит с этой функцией. Я все больше и больше путаюсь после просмотра документации, а также просмотра исходного кода.
add_filter($tag, $hook, $priority, $args);
мне кажется, новая функция расширяет родительскую функцию. Что за загадка, так это то, какие части крючка переопределяются. в некоторых примерах из документации я вижу, что некоторые переменные заменены на $args в вашем новом теге $.
Я почти все понял здесь: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/
но потом я не мог понять, как вы передаете аргументы и которые в конечном итоге переопределяются.
заранее спасибо.
4 ответа
add_filter()
является сопутствующей функцией apply_filters()
, До apply_filters
запускается для определенного фильтра ($tag
аргумент в add_filter()
), ты можешь использовать add_filter
зарегистрировать фильтр для тега. когда apply_filters()
выполняется с этим именем тега, он вызывает все зарегистрированные фильтры по порядку. Фильтры используются для передачи данных через функции для манипуляции. Например, я часто использую фильтр wp_list_pages. Я использую его для удаления разрывов строк из списка страниц. Итак, вот как это работает:
Сначала я определяю функцию, которая принимает один параметр и возвращает его после работы с ним:
function my_list_pages_filter($pages){
$pages = preg_replace( array("\n","\r"), '', $pages );
return $pages;
}
Затем я добавляю ловушку фильтра: add_filter( 'wp_list_pages', 'my_list_pages_filter');
add_filter
сообщает WordPress "Когда функция apply_filters
вызывается с первым аргументом 'wp_list_pages', вызов my_list_pages_filter
Msgstr "Фильтры должны отправлять хотя бы одно значение (любого типа: строка, массив, целое число и т. Д.), И они ожидают, что функция вернет одно значение.
Они предоставляют вам способ манипулировать вводом перед отправкой обратно.
do_action
это совершенно другой крючок. Чтобы отправить информацию в функцию фильтра, сделайте следующее (взято из вашего примера):
<div id="content" <?php $class='post post_content'; echo apply_filters('my_custom_classes', $class); ?>>
И затем в вашем файле functions.php, добавьте это:
add_filter('my_custom_classes','my_custom_classes_function');
function my_custom_classes_function($classes){
$output 'class="'. $classes.'"';
return $output;
}
Это довольно простое использование фильтров, но это только начало. Вы можете действительно получить представление о том, что вы можете сделать с фильтрами на том же примере с некоторыми улучшениями:
function my_custom_classes_function($classes){
$classes = explode( ' ', $classes );
if(is_home())
$classes[] = 'home_content';
if(is_single())
$classes[] = 'single_content';
if(is_page())
$classes[] = 'page_content';
if(is_tag())
$classes[] = 'tag_content';
$output 'class="'. implode( ' ', $classes ) .'"';
return $output;
}
Крис, вы, кажется, смущены несколькими вещами:
- Фильтры и Действия не связаны (они оба являются типом того, что WP называет "крючком", но в остальном не связаны). Выше вы сказали "с моим фильтром...", но do_action() предназначен для действий, а не фильтров.
- Тег (т. Е. Параметр тега для add_filter, apply_filter, add_action, do_action не имеет ничего общего с тегами в смысле XML/HTML (- может быть, вы это знаете).
- При вызове Action с помощью do_action() вы, вероятно, захотите передать аргумент в дополнение к обязательному имени тега. Выше вы назвали do_action('content_class'), что, во-первых, не будет иметь никакого эффекта, если вы сначала не зарегистрируете действие с именем тега "content_class", а во-вторых, в вашей функции действия content_class_filter (которая лучше будет называть content_class_action как is не имеет ничего общего с фильтрами), имеет необязательный параметр $classes, который всегда будет '', поскольку вы не указали аргумент для do_action после имени тега. Обратите внимание, что вы, вероятно, хотели написать $output = ..
- Фильтры ничего не "переопределяют" (особенно в смысле языка ОО). Добавление нескольких фильтров с одним и тем же тегом приведет к тому, что все они будут вызваны при вызове apply_filters для тега. Вы можете контролировать порядок, используя параметр priority. То же самое касается действий.
Это очень хорошая статья, но я все же должен сделать какую-то глупую ошибку...
Я пытаюсь удалить некоторые элементы в меню навигации WP3+ в разделе "Параметры экрана" с помощью метода "add_filter":
WP-администратора / включает / нав-menus.php:
function wp_nav_menu_manage_columns() {
return array(
'_title' => __('Show advanced menu properties'),
'cb' => '<input type="checkbox" />',
'link-target' => __('Link Target'),
'css-classes' => __('CSS Classes'),
'xfn' => __('Link Relationship (XFN)'),
'description' => __('Description'),
);
}
MyTheme/function.php:
Кажется, оригинальные функции не являются частью некоторого КЛАССА:
add_filter('wp_nav_menu_manage_columns', 'new_wp_nav_menu_manage_columns');
function new_wp_nav_menu_manage_columns() {
return array(
'_title' => __('Show advanced menu properties'),
'cb' => '<input type="checkbox" />',
'link-target' => __('Link Target'),
);
}
Но в результате я вижу оригинальные "Опции экрана" со всеми пунктами. Если я уберу строки: 'css-classes' => _('CSS-классы'), 'xfn' => _('Link Relationship (XFN)'), 'description' => __ ('Description'), напрямую в ядре WP все выглядит нормально, поэтому я не уверен, что таким способом можно переопределить все функции WP.
Большое спасибо за ваш совет. С наилучшими пожеланиями, Майло
Я поместил хук здесь в файле шаблона:
<div id="content" <?php content_class() ?>>
хук сам выполняет в файле функций:
function content_class() {
do_action('content_class');
}
с моим фильтром я пытаюсь передать классы этой функции.
function content_class_filter($classes='') {
$output 'classes="'. $classes.'"';
return $output;
}
тогда, наконец, я действительно запутался в том, как написать фильтр...