Проблемы с title-tag и document_title_parts

12

Wordpress version 4.5.1

Я пытаюсь динамически обновлять заголовки страниц для определенного шаблона. После множества копаний и изучения wp_title()изменений я пытаюсь их использовать document_title_parts. Однако я не могу заставить фильтр работать вообще.

Я в детской теме, functions.php:

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

Я пробовал оба варианта добавления поддержки тем, как показано выше, но, просматривая мой журнал, ничего не появляется при перезагрузке страницы. Это error_logработало с другими функциями (такими как wp_title), поэтому ведение журнала ошибок работает.

Я также пытался pre_get_document_title, который запускается при загрузке страницы, хотя я не могу заставить его фактически изменить заголовок.

Так! Я неправильно использую фильтр, неправильно настроил тему или что-то еще, о чем я не знаю. Любая помощь будет принята с благодарностью!

изменить, чтобы добавить больше деталей

Попытка инициализировать функцию, но она также не работает: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Кроме того, хотя я удалил любую ссылку <title>из header.php, фактическое название сайта все еще отображается в источнике.

hookedonwinter
источник
Почему вы закомментировали эту строку //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Это правильное использование добавления поддержки темы.
Sumit
@Sumit Я попробовал как закомментированную версию, так и активную версию.
hookedonwinter
Возможно попробуйте добавить add_theme_support()функцию в хуке инициализации . Другое дело, чтобы гарантировать, что вы перезаписываете свой header.phpфайл, чтобы не иметь HTML- <title>тег.
Howdy_McGee
@Howdy_McGee Только что попробовал, все еще ничего. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter
@hookedonwinter А ты уверен, что <title>в твоих тегах нет header.php? Может быть, попробовать заменить 10на PHP_MAX_INT. Также переданный параметр является массивом вместо строкового значения.
Howdy_McGee

Ответы:

13

Я запустил ваш фильтр в моей области разработки. Это не сработало. Затем я отключил плагин Yoast SEO, который, как я знал, также портил заголовок страницы. Тогда это сработало. Так что мое предложение было бы другим плагином возиться с ним.

В случае с Yoast это был вызов фильтра для pre_get_document_titleвозврата непустого значения. В этом случае wp_get_document_titleпроисходит короткое замыкание, а остальная часть функции, включая documents_title_partsфильтр, не оценивается, как вы можете видеть из первых строк кода:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

Итак, я взял твой фильтр и поменял крючок на pre_get_document_title. Это не сработало. Затем я изменил приоритет на более высокий уровень, чем тот же фильтр в Yoast. Тогда это сработало. Итак, я не знаю о вашей настройке, но я предлагаю вам попробовать:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );
cjbj
источник
1
Ты получил это! Я нашел то же самое и отключил Йоаст. Я просто активировал и использовал ваш приоритет, и это сработало. СПАСИБО!
hookedonwinter
Немного больше о
ловушках
С моего сайта pre_get_document_titleприоритет 15 достаточно.
ви
7

После некоторых экспериментов я пришел к следующему предложению: может быть, <title>тег «жестко закодирован» внутри родительской темы header.php? Если это так, вы можете попытаться удалить <title>тег из дочерней темы header.php(скопировать родительский элемент header.phpв папку дочерней темы), а затем добавить поддержку темы обратно через functions.php:

add_theme_support( 'title-tag' );

Я попытаюсь объяснить, что привело меня к этому предложению: я попытался, как вы и другие предложили, - но оказалось, что я нашел два <title>тега в исходном коде. Первый имел стандартный заголовок , второй - измененный . Но (конечно) в строке заголовка браузера я мог видеть только заголовок по умолчанию.

Затем я проверил header.phpродительскую тему, которую я использовал (двадцать четыре), и <title>тег был действительно жестко закодирован в этом шаблоне следующим образом:

<title><?php wp_title( '|', true, 'right' ); ?></title>

После того, как я удалил его, я добавил следующий код в дочернюю тему, functions.phpи он заработал:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

Так что это в основном также работало до удаления <title>тега из шаблона - только то, что тогда было два тега, <title>последний из которых был проигнорирован. Может ли это быть той же проблемой с вашей темой?

Начиная с wp 4.4.0, однако, <title>тег создается динамически функцией, _wp_render_title_tag()которая в основном вызывает другую функцию wp_get_document_title()и оборачивает html-теги вокруг результата. Короче говоря: если в вашей теме header.phpотсутствует <title>тег, есть вероятность, что вы можете переопределить заголовок напрямую pre_get_document_titleили document_title_partsкак описано здесь :

1) изменить название напрямую:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) фильтрация заглавных частей:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}
tillinberlin
источник
3

Прочитав ваш пост сверху донизу и снизу вверх, вы, вероятно, получите фильтр, который пропускает заголовок через pre_get_document_titleфильтр. Подсказка здесь следующее утверждение:

Я также пытался pre_get_document_title, который срабатывает при загрузке страницы,

Глядя на код soure дляwp_get_document_title() , мы видим следующий код:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

Это означает, что всякий раз, когда непустое значение проходит через pre_get_document_titleфильтр, wp_get_document_title()функция возвращает любое значение, которое было передано через pre_get_document_titleфильтр. В этом случае document_title_separatorфильтр и document_title_partsфильтр никогда не будут выполнены, поскольку они запускаются только после pre_get_document_titleфильтра.

Глядя на то, что вы сказали немного дальше:

... хотя я не могу заставить его изменить название.

у вас определенно есть pre_get_document_titleфильтр с полномочиями, который переопределяет ваш экземпляр того же фильтра, и из-за этого фильтра функция возвращает все, что ему передано, что приводит к тому, что ваш document_title_partsфильтр не выполняется.

Что вам нужно сделать, это использовать либо grepхороший редактор, и искать wp-contentэтот pre_get_document_titleфильтр во всей папке . Как только вы нашли этот фильтр, вы можете взять его оттуда, чтобы удалить этот фильтр и заменить его своим собственным

Питер Гусен
источник
Спасибо за ответ! К сожалению, поиск по всему wp-контенту document_title_partsили pre_get_document_titleвозвращает 0 результатов. Я использую SublimeText 2 для поиска всего wp-контента ...
hookedonwinter
Это действительно бьет меня. Действительно странно, что один фильтр в функции срабатывает правильно, а фильтр после этого - нет. Попробуйте очистить все кэши и переустановите WordPress, если вы уверены, что это не плагин или ваша тема. Что происходит при установке vanilla со связанной темой, что происходит, если вы напрямую изменяете родительскую тему. Это, к сожалению, насколько я могу помочь с приведенной информацией. Если у вас есть какая-либо дополнительная информация, внесите изменения, чтобы мы могли помочь вам в решении этой проблемы
Питер Гусен
@PieterGoosen Когда первый фильтр возвращает не пустой, функция замыкается накоротко, а второй фильтр не оценивается.
cjbj
@cjbj да, правильно, это то, что я сказал в своем ответе, вопрос в том, что. Как сказал ОП, он не может найти фильтр pre_get_document_title, что полностью объясняет, почему второй фильтр не срабатывает. Это оставляет pre_get_document_titleфильтр пустым, что означает, что два других фильтра в функции должны срабатывать, но они не работают. Мне остается сделать вывод о поврежденном ядре Wordpress.
Питер Гусен
За исключением того, что я получил этот фильтр, чтобы работать легко.
cjbj
2

Если родительская тема не объявляет поддержку, title-tagвы можете сделать это следующим образом в дочерней теме.

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Отфильтруйте document_title_partsожидаемый массив возвращаемого типа, например, обязательно измените условие if в соответствии с вашими требованиями или полностью удалите его, чтобы изменить заголовок по всему сайту только для проверки его работоспособности.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Можете ли вы попробовать эти две функции?

Нихил Чаван
источник
Спасибо за ответ. Я попробовал его, удалив оператор if, чтобы сделать его более широким, и добавил журналы ошибок, чтобы узнать, что случилось. Вот код , Только add_theme_support_childвошел в систему.
hookedonwinter