Проблемы с тегом заголовка и частями заголовка документа


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

Author: cjbj, 2016-05-12

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 );
 14
Author: cjbj, 2017-01-18 08:32:20

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

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

 3
Author: Pieter Goosen, 2016-06-30 09:16:28

Если родительская тема не объявляет поддержку 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
Author: Nikhil Chavan, 2016-06-29 05:29:39