Как фильтры и хуки на самом деле работают в WordPress?
Я спрашиваю о чем-то продвинутом. Как это реализовано в PHP? Например, как он собирает все хуки из разных плагинов и «прикрепляет» их к основным хукам и т. Д.
Как фильтры и хуки на самом деле работают в WordPress?
Я спрашиваю о чем-то продвинутом. Как это реализовано в PHP? Например, как он собирает все хуки из разных плагинов и «прикрепляет» их к основным хукам и т. Д.
Ответы:
По сути, « Plugin API », который вызывает Filters и Hooks, состоит из следующих функций:
apply_filters()
- выполнитьdo_action
- выполнитьapply_filters_ref_array()
- выполнитьdo_action_ref_array()
- выполнитьadd_filter()
- добавить в стекadd_action()
- добавить в стекВ целом, есть пара глобальных (что еще в мире WordPress):
global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;
Первый $wp_filter
- глобальный, Array
который содержит все имена фильтров в виде подмассивов. Каждый из этих подмассивов тогда содержит еще больше подмассивов, которые являются обратными вызовами, вызванными в массиве приоритетов.
Поэтому, когда вызывается функция execute , WordPress ищет в этих глобальных массивах ключи с этим именем. Затем прикрепленные обратные вызовы получают приоритет выполнения после приоритета. Единственное, что происходит заранее - это обратные вызовы, прикрепленные к all
фильтру.
Когда вы добавляете обратный вызов с помощью add_action
или add_filter
, WordPress сначала вычисляет «уникальный» идентификатор, чтобы не перезаписывать уже присоединенные обратные вызовы.
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
Затем он добавляет ваш обратный вызов в global $wp_filter
стек:
$wp_filter[ $tag ][ $priority ][ $idx ] = array(
'function' => $function_to_add,
'accepted_args' => $accepted_args
);
Как вы можете видеть, основным подмассивом является $tag
(или имя действия / фильтра), затем все вызывается с определенным приоритетом, а затем в качестве ключа используется «уникальная» строка обратного вызова / идентификатора.
Позже, когда вызывается фильтр - происходит с $tag
/ action- / filter-name - в массиве производится поиск и вызывается обратный вызов. Поскольку он используется call_user_func_array
, не имеет значения, сколько аргументов приложено. WordPress решает это сам.
foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
call_user_func_array(
$the_['function'],
array_slice(
$args,
0,
(int) $the_['accepted_args']
)
);
}
Хуки включены как в файлы ядра WordPress, так и в некоторые файлы родительских тем. Они позволяют подключать контент в определенном месте в файле.
Примером является хук wp_head в WordPress. Вы можете использовать этот хук в своей дочерней теме, чтобы добавить контент в это место.
Пример:
add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}
Некоторые премиальные темы также включают в себя действия, которые вы можете использовать в дочерней теме, чтобы сделать то же самое. Вот визуальная карта, которая включает все хуки действий и позицию, в которой они выводят ваш контент в рамках темы Genesis.
Пример:
add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}
Вот как выглядит ловушка, если вы открыли файл header.php в каркасе темы Genesis:
do_action( 'genesis_header' );
Вот список хуков WordPress, которые вы можете использовать разными способами.
Фильтры позволяют изменять выходные данные существующей функции и включены как в основные файлы WordPress, так и в некоторые каркасы родительских тем, такие как Genesis.
Вот список фильтров, которые вы можете использовать с Genesis Design Framework
Вот список фильтров, включенных в WordPress
Вот пример того, как вы можете использовать фильтр в рамках темы, такой как Genesis:
add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}
Приведенный выше код можно использовать в дочерней теме, чтобы изменить текст автора в комментариях. Работает в любой теме.
Вот еще один пример, который настраивает длину выдержки до 50 слов:
add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50;
}
Вы найдете функцию the_excerpt () в файле wp-includes / post-template.php.
Вот как это выглядит:
function the_excerpt() {
echo apply_filters('the_excerpt', get_the_excerpt());
}
Вы также можете использовать ловушки и фильтры в плагинах, чтобы делать то же самое, и код не будет потерян при обновлении родительской темы или WordPress.
По сути, хуки и фильтры позволяют настраивать и изменять как WordPress, так и вашу родительскую тему, не редактируя основные файлы WordPress или файлы родительских тем.
Настроить дочернюю тему значительно проще, когда инфраструктура родительской темы включает в себя хуки и фильтры, поскольку вам никогда не нужно редактировать файлы шаблонов родительских тем. Таким образом, вы можете смело менять темы.