Документация по фильтрам 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_filterMsgstr "Фильтры должны отправлять хотя бы одно значение (любого типа: строка, массив, целое число и т. Д.), И они ожидают, что функция вернет одно значение.

Они предоставляют вам способ манипулировать вводом перед отправкой обратно.

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;
}

Крис, вы, кажется, смущены несколькими вещами:

  1. Фильтры и Действия не связаны (они оба являются типом того, что WP называет "крючком", но в остальном не связаны). Выше вы сказали "с моим фильтром...", но do_action() предназначен для действий, а не фильтров.
  2. Тег (т. Е. Параметр тега для add_filter, apply_filter, add_action, do_action не имеет ничего общего с тегами в смысле XML/HTML (- может быть, вы это знаете).
  3. При вызове Action с помощью do_action() вы, вероятно, захотите передать аргумент в дополнение к обязательному имени тега. Выше вы назвали do_action('content_class'), что, во-первых, не будет иметь никакого эффекта, если вы сначала не зарегистрируете действие с именем тега "content_class", а во-вторых, в вашей функции действия content_class_filter (которая лучше будет называть content_class_action как is не имеет ничего общего с фильтрами), имеет необязательный параметр $classes, который всегда будет '', поскольку вы не указали аргумент для do_action после имени тега. Обратите внимание, что вы, вероятно, хотели написать $output = ..
  4. Фильтры ничего не "переопределяют" (особенно в смысле языка ОО). Добавление нескольких фильтров с одним и тем же тегом приведет к тому, что все они будут вызваны при вызове 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;
}

тогда, наконец, я действительно запутался в том, как написать фильтр...

Другие вопросы по тегам