Вопрос или проблема
Я использую функцию для вывода заголовков для каждого типа контента. Я также настроил новый метабокс в записях и страницах для ввода тега заголовка.
Это часть функции для вывода заголовков:
//...
elseif (is_page() || is_single()) { //Заголовок страницы и поста
global $post;
$metatitle = get_post_meta($post->ID, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
}
//...
else { wp_title(''); }
Это прекрасно работает для постов и страниц, за исключением случаев, когда я выбираю статическую домашнюю страницу и страницу блога (это пустая страница, созданная ранее). Благодаря последнему else
выводится обычный заголовок страницы ‘Блог’, но не выводится метабокс с метатегом ‘Мой метатег’.
Я подумал, что это из-за идентификатора поста, поэтому я разделил is_page()
и is_post()
, пытаясь вывести идентификатор страницы из цикла, с помощью этого кода $page_id = get_queried_object_id();
, но он не сработал. Следующий код — это то, что у меня есть:
//...
elseif (is_page()) { //Заголовок страницы
global $post;
$page_id = get_queried_object_id();
$metatitle = get_post_meta($page_id, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
} //...
Что я могу попробовать сделать? Возможно, проблема связана с тем, как вставляется метабокс, он использует $post_id
каждый раз. В любом случае, я не уверен, потому что это работает как для постов, так и для страниц.
Хорошо, я сам нашел метод. Вот код:
//...
elseif (is_page() || is_single()) { //Заголовок страницы и поста
global $post;
$metatitle = get_post_meta($post->ID, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
} elseif (is_home()) { //Используем is_home для страницы блога
//И используем get_queried_object
$page_object = get_queried_object();
$metatitle = get_post_meta($page_object->ID, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
}
//...
Ответ или решение
Чтобы получить мета-заголовок страницы, настроенной как блог, необходимо использовать правильный механизм WordPress для извлечения метаданных. В вашей ситуации у вас уже есть хорошо настроенный код, но он не возвращает нужный мета-заголовок на странице блога, созданной как статическая домашняя страница. Давайте разберемся, как решить эту проблему.
Анализ проблемы
В вашем исходном коде вы корректно извлекаете мета-заголовок для обычных страниц и постов, используя get_post_meta()
с ID поста. Однако, когда вы обращаетесь к странице блога (при помощи is_home()
), данный метод не срабатывает, поскольку is_home()
не возвращает ID поста, который вы могли бы использовать.
Решение
Правильный подход заключается в использовании функции get_queried_object()
, которая поможет извлечь объект текущей страницы блога и получить его идентификатор. Вот пример исправленного кода:
//...
elseif (is_page() || is_single()) { // Заголовок страницы и поста
global $post;
$metatitle = get_post_meta($post->ID, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
} elseif (is_home()) { // Использование is_home для страницы блога
$page_object = get_queried_object(); // Получаем объект страницы блога
if ($page_object) { // Проверяем, существует ли объект
$metatitle = get_post_meta($page_object->ID, 'metatitle_value_key', true);
if ($metatitle) {
echo stripslashes($metatitle);
} else {
the_title();
}
} else {
the_title(); // В случае ошибки выводим обычный заголовок
}
}
//...
Объяснение кода:
-
Проверка страницы и поста: Сначала вы обрабатываете заголовки для страниц и постов. Если мета-заголовок существует, вы его выводите. В противном случае выводится заголовок поста или страницы по умолчанию.
-
Обработка страницы блога: В следующей части кода, когда выполняется условие
is_home()
, вы получаете объект текущей страницы с помощьюget_queried_object()
. Это необходимо, потому что блоги, настроенные как статические страницы, не соответствуют стандартным постам или страницам. -
Извлечение мета-заголовка: Если объект страницы блога существует, код извлекает его ID и использует
get_post_meta()
для получения значения мета-заголовка. Если мета-заголовок найден, он выводится; в противном случае используется обычный заголовок.
Заключение
Теперь ваш код корректно извлекает мета-заголовки для страниц блога, что позволит обеспечить оптимизацию для SEO и улучшить пользовательский опыт. Убедитесь, что метабокс для мета-заголовка правильно сохранен и доступен для соответствующей страницы блога. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обратиться за помощью.