Почему фильтр 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);