Я несколько раз перечитывал по документации и был нелегко пытаться выяснить то, что продолжает функцию. Я все более смущен после рассмотрения документации, просматривая исходный код также.
add_filter($tag, $hook, $priority, $args);
это кажется мне, новая функция расширяет родительскую функцию. Какая загадка меня - то, какие части рычага становится переопределенным. в некоторых примерах в документации я вижу, что некоторые переменные заменяются $args в Вашем новом $tag.
Я почти понял все это здесь: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/
но затем я не мог выяснить, как Вы передаете аргументы и который в конечном счете переопределяется.
заранее спасибо.
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;
}
Я разместил ловушку здесь, в файле шаблона:
<div id="content" <?php content_class() ?>>
ловушка выполняется самостоятельно в файле функций:
function content_class() {
do_action('content_class');
}
с моим фильтром я пытаюсь передать классы этой функции.
function content_class_filter($classes='') {
$output 'classes="'. $classes.'"';
return $output;
}
и, наконец, я действительно не понимаю, как писать фильтр ...