Конфликт между add_theme_support('title-tag') и функцией пользовательских заголовков

3 февр. 2015 г., 16:47:51
Просмотры: 23.5K
Голосов: 4

'Title-tag' - это функция темы, представленная в версии 4.1, и я хочу использовать ее как заголовок по умолчанию в моей теме. Эта функция должна быть добавлена в хуке after_setup_theme или init. Это рекомендовано здесь. Использование этой функции работает отлично. НО:

Кроме того, у меня есть пользовательская функция заголовков, которую можно включать/отключать с помощью фреймворка Option-Tree. Этот фреймворк загружается напрямую в functions.php. Затем у меня есть остальные функции, добавленные в after_setup_theme с приоритетом 2:

add_action( 'after_setup_theme', 'theme_functions', 2);

А это фильтр, добавленный для моих пользовательских заголовков:

add_filter( 'wp_title', 'custom_titles', 10, 2 );

Когда я отключаю мою функцию custom_titles(), новая функция title-tag работает отлично, но когда я включаю пользовательские заголовки, он возвращает заголовок дважды. Точнее так:

<title>Пример мета-заголовка главной страницы</title>

Пример мета-заголовка главной страницы<title></title>

Первый правильный и использует функцию wp_title(), вставленную в header.php между тегами title, но второй включается в первую строку функции wp_head().

Фактически, моя функция custom_titles() работала отлично без использования новой функции title-tag. Так что похоже, конфликт возникает, когда я пытаюсь использовать обе.

Как вы думаете, будет ли хорошим решением поместить обе функции в after_theme_setup с приоритетом 1 в простом условном операторе, или есть лучший способ сделать это? Кажется, решение должно быть проще.


ОБНОВЛЕНИЕ: Это безумие. Если я удаляю теги title из header для использования новой функции, theme-check возвращает:

ОБЯЗАТЕЛЬНО: Тема должна иметь теги title, в идеале в файле header.php.

Если я удаляю новую функцию, чтобы использовать свою пользовательскую функцию, theme-check возвращает:

РЕКОМЕНДУЕТСЯ: В теме не найдено ссылки на add_theme_support("title-tag"). Рекомендуется реализовать эту функциональность для WordPress 4.1 и выше.

Честно говоря: LOL. Добавление add_theme_support в functions.php и тегов title в header.php, как они «РЕКОМЕНДУЮТ» и «ТРЕБУЮТ» соответственно, всегда возвращает заголовок дважды!

2
Комментарии

Подсказка: При использовании поддержки 'title-tag' вы можете посмотреть исходный код функции function wp_get_document_title() - там есть следующие фильтры (WP 4.7.3): pre_get_document_title, document_title_separator и document_title_parts. Первый дает полный контроль над заголовком, вместо указанного в вашем вопросе фильтра wp_title, который теперь кажется устаревшим и вскоре может быть объявлен deprecated.

Minister Minister
21 апр. 2017 г. 10:54:25
Все ответы на вопрос 2
7

Ваша проблема в том, что вы не можете использовать wp_title() в теме, если тема уже поддерживает title-tag. Секция <head> вашей темы должна выглядеть так:

<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?php wp_head(); ?>
</head>

Фильтр и поддержка title-tag:

add_action( 'after_setup_theme', 'theme_functions' );
function theme_functions() {

    add_theme_support( 'title-tag' );

}

add_filter( 'wp_title', 'custom_titles', 10, 2 );
function custom_titles( $title, $sep ) {

    // Проверяем, включены ли пользовательские заголовки в вашей опционной структуре
    if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
        // Простой пример
        $title = "Другой заголовок" . $title;;
    }

    return $title;
}

Если вы сделаете это, всё будет работать идеально.

3 февр. 2015 г. 18:52:23
Комментарии

Понятно. Спасибо. Я знал, что должно быть проще... Думаю, моя ошибка была в функции пользовательских заголовков, без вызова переменных $title и $sep. Давайте попробую :)

Unix Unix
3 февр. 2015 г. 18:58:06

Я добавил проверку опции enable_custom_titles.

cybmeta cybmeta
3 февр. 2015 г. 18:59:19

Лучше ли использовать проверку внутри функции?

Unix Unix
3 февр. 2015 г. 19:02:48

Есть одна проблема: в этой функции я не сохраняю заголовки в переменных, а использую функции там, где это возможно, такие как the_title(); или single_tag_title();... И в переменных только когда необходимо, например в метабоксах: $metatitle = get_post_meta($post->ID, 'metabox_title_tag', true);. Как это можно исправить?

Unix Unix
3 февр. 2015 г. 19:06:47

Хорошо, мне придётся изменить свою функцию custom_titles(), чтобы получать все значения в переменных. Моё решение было быстрее, но ваш ответ — правильный путь, и я смогу пропустить некоторые условные выражения.

Unix Unix
3 февр. 2015 г. 19:21:02

the_title(), single_tag_title() и другие являются теговыми функциями, то есть функциями, предназначенными для использования в файлах шаблонов, а не для получения информации вне файлов шаблонов. Например, если вы хотите показать заголовок записи в файле шаблона, вы можете использовать the_title() внутри цикла; если вам нужно получить заголовок записи вне файла шаблона, вы можете использовать get_the_tile( $post_ID ) или объект записи, возвращаемый функциями get_post, WP_Query и т.д. Если вам нужна помощь с этим, пожалуйста, задайте отдельный вопрос.

cybmeta cybmeta
3 февр. 2015 г. 19:33:54

Этот ответ движется в правильном направлении, но современные фильтры должны использовать document_title_parts или pre_get_document_title ... см. эту ветку: https://wordpress.stackexchange.com/questions/305353/cant-change-the-title-tag-with-wp-title-filter

Jesse Nickles Jesse Nickles
23 мая 2023 г. 23:30:14
Показать остальные 2 комментариев
0

Я нашел решение, которое, уверен, будет полезно и другим.


Первое: пользовательские заголовки

Пояснение: Если моя функция custom_titles() включена, загружаем функцию в functions.php с приоритетом 2 для хука after_theme_setup и выводим теги title в файле header.php.

В functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
    // Функция пользовательских заголовков
}

В header.php:

<?php if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) : ?>
<title><?php wp_title( '|', true, 'right' ); ?></title>
<?php endif; ?>

<!-- Следующее вернет новую функцию заголовков WP, если пользовательские заголовки отключены -->
<?php wp_head(); ?>

Затем: поддержка title-tag

Пояснение: Если моя функция custom_titles() отключена, добавляем add_theme_support('title-tag'); в functions.php с приоритетом 1 для хука after_theme_setup.

Итак, в functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'off' ) {
    add_theme_support( 'title-tag' );
}

Что касается приоритета after_theme_setup, в моем случае он нужен только для загрузки фреймворка Option-Tree перед использованием функции ot_get_option(), поэтому он может быть другим — или не нужен вовсе — если кто-то использует другой фреймворк для настроек.

Теперь моя тема поддерживает новую функцию заголовков в версии 4.1 и пользовательские заголовки для SEO с использованием метабоксов: оба варианта доступны. (Я знаю, что это территория плагинов, но приятно иметь некоторые важные функции —«важные» на мой взгляд— интегрированные в тему). Благодаря этому, клиенты получат больше контроля над тем, как отображаются заголовки.

3 февр. 2015 г. 18:47:18