Intereting Posts
Существует ли «лучшая практика» для настройки нескольких доменов в многоузловом экземпляре? Показать таксономии от конкретного CPT Как я могу получить текущий идентификатор меню с множественным вхождением Просмотр комментариев / оценок (в целом) на странице в виде сетки (кладки) Простая проверка спама на действительный домен в адресе электронной почты комментатора Получить идентификатор категории из навигационного меню Почему meta_query WP_Query не фильтрует результаты? _prime_post_caches в wordpress Как использовать WP_query с несколькими идентификаторами сообщений? Самый простой способ показать общее количество подстраниц почему в каталоге wpmu есть большой файл с именем core? Доступ к DOM Accessizer – jQuery Удалить текущую страницу_страницы из страницы с сообщениями в меню навигации WordPress Как добавить социальные кнопки, такие как facebook и twitter в нижнем колонтитуле темы? Как изменить добавить новую ссылку для персонализированного типа сообщения

Я не понимаю, как работает этот параметр.?

Хорошо, у меня есть этот простой код для простого плагина, который добавляет названия сообщений со словом TESTING. Я действительно не понимаю, как этот параметр работает здесь. Я понимаю, как параметры работают в PHP, но ничто не было передано внутри этого параметра для WordPress, чтобы знать, что переменная – это название. Если это имеет смысл? Не понимаю, как это работает.

Я все еще довольно дерьмо в разработке WordPress – я всегда начинаю, застрял и не очень далеко.

add_filter('the_title', 'cm_title'); /** * Modify the title prepending the article title with the word 'TESTING' */ function cm_title($text) { return 'TESTING  ' . $text; } 

Solutions Collecting From Web of "Я не понимаю, как работает этот параметр.?"

Посмотрим, сможем ли мы сломать его, так что это легко понять.

У вас есть функция PHP с именем 'cm_title':

 function cm_title($text) { return 'TESTING  ' . $text; } 

Это только 1 вещь. Требуется то, что ему дано, «$ text», и возвращает этот текст с текстом «Testing», добавленным к нему.

Как WordPress знает, что такое «текст»?

Он знает / присваивает данные параметру $ text из-за этого фильтра WP:

 add_filter('the_title', 'cm_title'); 

Этот фильтр проверяется WP, когда он создает 'the_title'. Поэтому перед тем, как WP выплюнет «the_title», он проверяет, есть ли фильтр для использования. В этом случае мы говорим WP, чтобы применить этот фильтр (функция 'cm_title') перед выплеском заголовка.

Все, что сказать, WP отправляет то, что у него есть до сих пор для 'the_title' (т. Е. «Это сообщение обо мне») и запускает его через этот фильтр, прежде чем выплевывать его.

Таким образом, в этом случае «Это сообщение обо мне» – это данные в текстовом параметре в функции cm_title.

Ваш конечный результат станет «ИСПЫТАНИЕ Это сообщение обо мне».

Это помогает прояснить это?

WordPress использует крючки, чтобы помочь разработчикам делать то, что им нужно сделать относительно простым способом. Некоторые из этих hooks являются apply_filter() и do_action() которые определены WordPress. Давайте посмотрим, что происходит, когда мы вызываем the_title() до the_title() пока не the_title() крюк, который вы определили.

 <?php the_title(); ?> 

Ресурсы разработчика – the_title()

 function the_title($before = '', $after = '', $echo = true) { $title = get_the_title(); if ( strlen($title) == 0 ) return; $title = $before . $title . $after; if ( $echo ) echo $title; else return $title; } 

Наверху он вызывает get_the_title() где мы найдем наш фильтр. Давайте посмотрим на это:

Ресурсы разработчика – get_the_title()

 function get_the_title( $post = 0 ) { $post = get_post( $post ); $title = isset( $post->post_title ) ? $post->post_title : ''; $id = isset( $post->ID ) ? $post->ID : 0; if ( ! is_admin() ) { if ( ! empty( $post->post_password ) ) { /** * Filter the text prepended to the post title for protected posts. * * The filter is only applied on the front end. * * @since 2.8.0 * * @param string $prepend Text displayed before the post title. * Default 'Protected: %s'. * @param WP_Post $post Current post object. */ $protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s' ), $post ); $title = sprintf( $protected_title_format, $title ); } else if ( isset( $post->post_status ) && 'private' == $post->post_status ) { /** * Filter the text prepended to the post title of private posts. * * The filter is only applied on the front end. * * @since 2.8.0 * * @param string $prepend Text displayed before the post title. * Default 'Private: %s'. * @param WP_Post $post Current post object. */ $private_title_format = apply_filters( 'private_title_format', __( 'Private: %s' ), $post ); $title = sprintf( $private_title_format, $title ); } } /** * Filter the post title. * * @since 0.71 * * @param string $title The post title. * @param int $id The post ID. */ return apply_filters( 'the_title', $title, $id ); } 

Вы заметите непосредственно в нижней части функции, которую он вызывает apply_filters() и передает имя function_name как строку , $title как строку и $id как int, а затем возвращает все, что возвращает apply_fitlers() , что является вашим крюком . Давайте посмотрим на apply_filters() :

Ресурсы разработчика – apply_filters()

 function apply_filters( $tag, $value ) { global $wp_filter, $merged_filters, $wp_current_filter; $args = array(); // Do 'all' actions first. if ( isset($wp_filter['all']) ) { $wp_current_filter[] = $tag; $args = func_get_args(); _wp_call_all_hook($args); } if ( !isset($wp_filter[$tag]) ) { if ( isset($wp_filter['all']) ) array_pop($wp_current_filter); return $value; } if ( !isset($wp_filter['all']) ) $wp_current_filter[] = $tag; // Sort. if ( !isset( $merged_filters[ $tag ] ) ) { ksort($wp_filter[$tag]); $merged_filters[ $tag ] = true; } reset( $wp_filter[ $tag ] ); if ( empty($args) ) $args = func_get_args(); do { foreach( (array) current($wp_filter[$tag]) as $the_ ) if ( !is_null($the_['function']) ){ $args[1] = $value; $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); } } while ( next($wp_filter[$tag]) !== false ); array_pop( $wp_current_filter ); return $value; } 

Он выглядит сложным, но прежде чем мы перейдем к этому, давайте перейдем к наиболее важной части этой функции, $wp_filter . Теперь этот маленький искатель содержит ВСЕ фильтры, добавленные вами и WordPress. Вы можете распечатать его прямо под своим wp_head() чтобы просмотреть полный список. Это выглядит примерно так (больше, я просто выбрал the_title так как это на тему!)

 [the_title] => Array ( [10] => Array ( [wptexturize] => Array ( [function] => wptexturize [accepted_args] => 1 ) [convert_chars] => Array ( [function] => convert_chars [accepted_args] => 1 ) [trim] => Array ( [function] => trim [accepted_args] => 1 ) ) [11] => Array ( [capital_P_dangit] => Array ( [function] => capital_P_dangit [accepted_args] => 1 ) ) ) 

Таким образом, это многомерный массив фильтров, индексированный тегом , затем по приоритету и, наконец, по имени функции . Довольно аккуратный, я думаю! Добавленный вами фильтр, поскольку вы не передали приоритет, по умолчанию считается индексом 10 и будет добавлен прямо под trim а затем дополнительно индексируется по имени функции cm_title .

Вернемся немного назад. Если мы посмотрим на конец функции get_the_title() выше, мы увидим, что она apply_filters три переменные в функцию apply_filters но, поскольку мы можем ясно видеть, что она принимает только два параметра! Мне пришлось немного разобраться в этом, и это похоже на эту небольшую функцию, func_get_args() мы видим, замусоренной внутри apply_filters() самом деле захватит все, что угодно, и все будет передано ему. Вот пример , Codepen также хорош. Теперь, даже если что-либо может быть передано, если мы посмотрим на наш многомерный массив, есть технически accepted_args параметры accept_args, вы не можете даже, хотя это и позволяет .

фу

Наконец, он проходит через каждый из этих фильтров, используя массив $wp_filters :

 do { foreach( (array) current($wp_filter[$tag]) as $the_ ) if ( !is_null($the_['function']) ){ $args[1] = $value; $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); } } while ( next($wp_filter[$tag]) !== false ); 

Итак, давайте приведем все это вместе!

  • the_title() вызывает get_the_title()
  • get_the_title() возвращает apply_filters() , передавая: 'the_title' (имя функции), $title (название столбца строки), $id (int post id).
  • apply_filters() просматривает глобальный массив, в котором хранятся все фильтры, затем запускается их передача в переданной ему информации ( $title и $id ).

Функция, которую вы вызываете add_filter фактически добавляет ваше имя функции, приоритет и args к глобальному массиву $wp_filters . Вы можете видеть это ниже:

Ресурсы разработчика – add_filter()

 function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { global $wp_filter, $merged_filters; $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority); $wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args); unset( $merged_filters[ $tag ] ); return true; } 

На самом деле, это the_title() до того, как the_title() будет вызван the_title() . Ваши функции загружаются с помощью wp_head() и поэтому любые фильтры, добавляемые через плагины или functions.php , также будут добавлены в этот глобальный массив.


Это было долго, но, надеюсь, теперь это немного больше, если у вас есть какие-либо вопросы в комментариях!