2010-06-06 3 views
8

Несколько раз я читал документацию и с трудом пытался выяснить, что происходит с этой функцией. Я все больше и больше смущен, посмотрев документацию, просматривая исходный код.документация Wordpress фильтрует? Попытка понять add_filter()

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

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

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

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

благодарит заранее.

+0

Я думаю, что tut только более запутанным, если у вас уже возникли проблемы с пониманием фильтров и действий. Можете ли вы объяснить контекст, в котором вы пытаетесь их использовать? Тогда мы можем более точно ответить на ваши потребности, а не просто повторять Кодекс. – TheDeadMedic

ответ

12

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

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

do_action - совсем другой крюк. Для того, чтобы отправить информацию в вашу функцию фильтра, выполните следующие действия (взято из вашего примера):

<div id="content" <?php $class='post post_content'; echo apply_filters('my_custom_classes', $class); ?>> 

И тогда в ваших функциях.php file, добавьте это:

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

Wow thanks. Вы упростили понимание. – chrisjlee

0

я поставил крюк здесь в файле шаблона:

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

крючок только самостоятельно выполняет в файле функций:

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

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

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

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

2

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

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

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

4

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

  1. Фильтры и действия не связаны (они оба типа того, что WP называет «крюк» , но в остальном не связаны). Вы уже сказали «с моим фильтром ...», но do_action() для действий не Фильтры.
  2. Тег (т.е. параметр тега add_filter, apply_filter, add_action, do_action не имеет ничего общего с тегами в XML/HTML смысле (-., Может быть, вы знаете, что)
  3. При вызове действия, используя do_action() вам вероятно, хотите передать аргумент в дополнение к обязательным именам тегов. Вы вызывается do_action ('content_class'), который, во-первых, не будет иметь эффекта, если вы не зарегистрировали сначала действие с именем тега «content_class», а во-вторых , в вашей функции действия content_class_filter (который лучше назван content_class_action as is не имеет ничего общего с фильтрами), имеет необязательный параметр $ classes, который всегда будет '', поскольку вы не предоставили аргумент do_action после имени тега Обратите внимание, что вы, вероятно, хотели написать $ output = ..
  4. Фильтры не «переопределяют» что-либо (особенно в смысле языка OO). Добавление нескольких фильтров с одним и тем же тегом приведет к тому, что все они будут вызываться при вызове apply_filters для тега. Вы можете управлять порядком, используя параметр приоритета. То же самое касается действий.
+0

Хорошие баллы. Я ценю это. – chrisjlee

Смежные вопросы