Конфликт между add_theme_support('title-tag') и функцией пользовательских заголовков
'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
, как они «РЕКОМЕНДУЮТ» и «ТРЕБУЮТ» соответственно, всегда возвращает заголовок дважды!

Ваша проблема в том, что вы не можете использовать 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;
}
Если вы сделаете это, всё будет работать идеально.

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

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

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

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

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

Я нашел решение, которое, уверен, будет полезно и другим.
Первое: пользовательские заголовки
Пояснение: Если моя функция 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 с использованием метабоксов: оба варианта доступны. (Я знаю, что это территория плагинов, но приятно иметь некоторые важные функции —«важные» на мой взгляд— интегрированные в тему). Благодаря этому, клиенты получат больше контроля над тем, как отображаются заголовки.
