Почему фильтр the_title () также применяется в заголовке меню?

php wordpress filter themes wrap

4663 просмотра

5 ответа

Я создал ниже функцию, чтобы скрыть заголовок страницы. Но когда я его выполню, он также скрывает название меню. Может ли кто-нибудь помочь в этом, он будет высоко оценен.

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') );
Автор: softsdev Источник Размещён: 17.05.2019 03:36

Ответы (5)


11 плюса

Решение

Никола прав:

Потому что пункты меню также имеют заголовки, и их нужно фильтровать :).

Чтобы сделать этот единственный вызов в сообщениях, а не в меню, вы можете добавить чек in_the_loop() - если это правда, вы находитесь в сообщении.

Поэтому измените первую строку функции:

if( is_admin() || !in_the_loop() )

и все должно быть хорошо.

Автор: Paul Gregory Размещён: 19.11.2012 03:43

4 плюса

Вы можете сделать что-то вроде этого:

В вашем 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;
Автор: Cyril Размещён: 11.12.2012 10:09

4 плюса

Это немного взломать, но вы можете решить эту проблему, добавив свое действие в 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, мы избегаем переписывания атрибутов заголовка меню.

Автор: Imperative Размещён: 16.10.2014 08:52

1 плюс

Проводя этот ответ, потому что это был результат поиска, я в конечном итоге нажал, ища поиск касательно привязки фильтра 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% релевантным заданному вопросу, но именно здесь я пришел, когда искал решение этой проблемы. Надеюсь, это поможет кому-то в подобной ситуации.

Автор: Michael Ecklund Размещён: 23.01.2017 11:01

0 плюса

Глобальный $ dontTouch; решение почему-то не сработало для меня. Поэтому я просто удалил фильтр вокруг меню, таким образом, в header.php :

remove_filter( 'the_title', 'change_title' );
get_template_part( 'template-parts/navigation/navigation', 'top' ); 
add_filter( 'the_title', 'change_title' );

И все хорошо.

Автор: arathra Размещён: 20.11.2018 03:34
Вопросы из категории :
32x32