Почему фильтр the_title() также применяется в заголовке меню?
Я создал функцию ниже, чтобы скрыть заголовок страницы. Но когда я выполняю его, он также скрывает имя меню.
function wsits_post_page_title( $title ) {
if( is_admin())
return $title;
$selected_type = get_option('wsits_page_show_hide');
if(!is_array($selected_type)) return $title;
if ( ( in_array(get_post_type(), $selected_type ) ) && get_option('wsits_page_show_hide') )
{
$title = '';
}
return $title;
}
add_filter( 'the_title', array($this, 'wsits_post_page_title') );
Ответы
Ответ 1
Никола прав:
Поскольку пункты меню также имеют заголовки, и их необходимо отфильтровать:).
Чтобы сделать этот единственный вызов в сообщениях, а не в меню, вы можете добавить чек на in_the_loop()
- если это правда, вы находитесь в сообщении.
Итак, измените первую строку в функции на:
if( is_admin() || !in_the_loop() )
и все должно быть хорошо.
Ответ 2
Вы можете сделать что-то вроде этого:
В function.php
:
add_filter( 'the_title', 'ze_title');
function ze_title($a) {
global $dontTouch;
if(!$dontTouch && !is_admin())
$a = someChange($a);
return $a;
}
В вашем шаблоне:
$dontTouch = 1;
wp_nav_menu( array('menu' => 'MyMenu') );
$dontTouch = 0;
Ответ 3
Это немного взломать, но вы можете решить это, добавив свое действие в loop_start.
function make_custom_title( $title, $id ) {
// Your Code Here
}
function set_custom_title() {
add_filter( 'the_title', 'make_custom_title', 10, 2 );
}
add_action( 'loop_start', 'set_custom_title' );
Встраивая фильтр the_title внутри действия loop_start, мы избегаем переписывания атрибутов заголовка меню.
Ответ 4
Проводя этот ответ, потому что это был результат поиска, на котором я нажимал кнопку во время поиска по таргетингу на крючок фильтра the_title
, игнорируя эффект фильтра для элементов навигации.
Я работал над разделом в теме, в которой я хотел добавить кнопки в заголовок страницы в теге заголовка.
Он выглядел примерно так:
<?php echo '<h1>' . apply_filters( 'the_title', $post->post_title ) . '</h1>'.PHP_EOL; ?>
Я тогда "подключался" следующим образом:
add_filter( 'the_title', 'my_callback_function' );
Тем не менее, выше цели буквально все, что вызывает the_title
фильтр, и это включает элементы навигации.
Я изменил определение крючка фильтра следующим образом:
<?php echo '<h1>' . apply_filters( 'the_title', $post->post_title, $post->ID, true ) . '</h1>'.PHP_EOL; ?>
Практически каждый вызов фильтра the_title
передает параметр 1 как $post->post_title
и параметр 2 как $post->ID
. Найдите основной код WordPress для apply_filters( 'the_title'*
, и вы сами увидите.
Итак, я решил добавить третий параметр для ситуаций, когда я хочу настроить таргетинг на определенные элементы, которые вызывают фильтр the_title
. Таким образом, я по-прежнему получаю выгоду от всех обратных вызовов, которые применяются к привязке фильтра the_title
по умолчанию, а также имеют возможность полу-однозначно нацеливать элементы, которые используют привязку фильтра the_title
с третьим параметром.
Это простой параметр boolean
:
/**
* @param String $title
* @param Int $object_id
* @param bool $theme
*
* @return mixed
*/
function filter_the_title( String $title = null, Int $object_id = null, Bool $theme = false ) {
if( ! $object_id ){
return $title;
}
if( ! $theme ){
return $title;
}
// your code here...
return $title;
}
add_filter( 'the_title', 'filter_the_title', 10, 3 );
Обозначьте переменные, как хотите. Это то, что сработало для меня, и оно делает именно то, что мне нужно для этого. Этот ответ может быть не 100% релевантным заданному вопросу, но именно здесь я пришел, когда искал решение этой проблемы. Надеюсь, это поможет кому-то в подобной ситуации.
Ответ 5
Глобальный $ dontTouch; Решение почему-то не работает для меня. Поэтому я просто удалил фильтр вокруг меню, таким образом, в header.php:
remove_filter( 'the_title', 'change_title' );
get_template_part( 'template-parts/navigation/navigation', 'top' );
add_filter( 'the_title', 'change_title' );
И все хорошо.
Ответ 6
Я думаю, что вы ищете это:
function change_title($title) {
if( in_the_loop() && !is_archive() ) { // This will skip the menu items and the archive titles
return $new_title;
}
return $title;
}
add_filter('the_title', array($this, 'change_title'), 10, 2);