it-swarm.com.ru

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

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, фактический заголовок сайта все еще отображается в источнике.

11
hookedonwinter

Я запустил ваш фильтр в моей области разработки. Это не сработало. Затем я отключил плагин 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 );
11
cjbj

После некоторых экспериментов я пришел к следующему предложению: может ли быть так, что тег <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');
}
6
tillinberlin

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

3
Pieter Goosen

Если родительская тема не объявляет поддержку 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' );

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

2
Nikhil Chavan