Проблемы с тегом заголовка и частями заголовка документа
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
, фактическое название сайта все еще отображается в источнике.
4 answers
Я запустил ваш фильтр в своей области разработки. Это не сработало. Затем я отключил SEO-плагин Yoast, который, как я знал, также испортил заголовок страницы. Тогда это сработало. Так что я бы предложил, чтобы с ним возился другой плагин.
В случае 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 );
После некоторых экспериментов я пришел к следующему предположению: может быть, тег <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');
}
Прочитав свой пост сверху донизу и снизу вверх, у вас, по всей вероятности, есть фильтр, который пропускает заголовок через фильтр pre_get_document_title
. Ключ здесь в следующем утверждении:
Я также пробовал
pre_get_document_title
, который срабатывает при загрузке страницы,
Глядя на исходный код для 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
. Как только вы нашли этот фильтр, вы можете взять его оттуда, чтобы удалить этот фильтр и заменить его своим собственным
Если родительская тема не объявляет поддержку 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' );
Можете ли вы попробовать эти две функции?