документация по фильтрам WordPress?Пытаюсь понять add_filter () - PullRequest
9 голосов
/ 06 июня 2010

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

add_filter($tag, $hook, $priority, $args);

мне кажется, что новая функция расширяет родительскую функцию. Что за загадка, так это то, какие части крючка переопределяются. в некоторых примерах из документации я вижу, что некоторые переменные заменены на $ args в вашем новом теге $.

Я почти все понял здесь: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

но тогда я не мог понять, как вы передаете аргументы и которые в итоге переопределяются.

заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 08 июня 2010

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

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

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;
}
4 голосов
/ 23 марта 2011

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

  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. То же самое касается действий.
2 голосов
/ 07 февраля 2011

это очень хорошая статья, но, тем не менее, я должен сделать какую-то глупую ошибку ...

Я пытаюсь удалить некоторые элементы в меню навигации WP3 + в разделе «Параметры экрана» с помощью метода «add_filter»:

сор-админ / включает / нав-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' => _ ('Связь между ссылками (XFN)'), 'description' => __ ('Description'), непосредственно в ядре WP все выглядит нормально, поэтому я не уверен, что таким способом можно переопределить все функции WP.

Большое спасибо за ваш совет. С наилучшими пожеланиями, Мило

0 голосов
/ 06 июня 2010

Я поместил хук здесь в файле шаблона:

<div id="content" <?php content_class() ?>>

хук сам выполняет в файле функций:

function content_class() {
 do_action('content_class');
}

с моим фильтром я пытаюсь передать классы этой функции.

function content_class_filter($classes='') {
   $output 'classes="'. $classes.'"';
   return $output;
}

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

...