Wordpress фильтрует документацию? Попытка понять add_filter ()

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

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

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

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

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

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

9
задан chrisjlee 6 June 2010 в 08:45
поделиться

2 ответа

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;
}
12
ответ дан 4 December 2019 в 11:40
поделиться

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

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

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

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

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

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

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

0
ответ дан 4 December 2019 в 11:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: