Вопрос или проблема
У меня есть страница под названием “Блог”, которая использует “Шаблон по умолчанию” (index.php). На ней установлено изображение для анонса. Я хочу отобразить это изображение, но когда я использую get_post_thumbnail_id(), внутри или вне цикла, я получаю миниатюру первой записи в моем блоге, а не той, что на странице “Блог”.
На всякий случай в Настройки > Чтение, Страница записей установлена как “Блог”.
Этот код может быть тем, что вам нужно. Он проходит через шаблоны страниц, чтобы получить изображение для анонса. Если вы добавите его вне цикла в свой шаблон page.php
(или index.php
, в зависимости от вашей темы), он должен получить изображение для анонса страницы, а не записей.
<?php
global $post;
if ( isset($post) ) {
//получить предков
$familyTree = get_ancestors($post->ID,'page');
array_unshift( $familyTree, $post->ID ); //добавить текущую страницу в начало списка
//пройтись по семейному дереву, пока не найдете результат или не исчерпаете массив
$featuredImage="";
foreach ( $familyTree as $family_postid ) {
if ( has_post_thumbnail( $family_postid ) ) {
$featuredImage = get_the_post_thumbnail( $family_postid, 'full' );
break;
}
}
// если у страницы есть изображение для анонса, то показать его
echo ( $featuredImage ? $featuredImage : "" );
}
?>
Вы должны добавить это вне вашего цикла
Когда вы находитесь на странице блога, функция get_post_thumbnail_id() возвращает id миниатюры поста первой записи (как вы уже выяснили).
Чтобы получить правильную миниатюру поста на странице блога, вам нужно сделать что-то вроде этого:
$thumbnail_id = NULL;
if(is_home()){ //страница блога?
$blog_page_id = (int)get_option('page_for_posts');
if(has_post_thumbnail($blog_page_id)){
$thumbnail_id = get_post_thumbnail_id(get_option('page_for_posts'));
}
} elseif(is_singular()) { //все 'единичные' записи, такие как пост, страница, пользовательский тип записи...
if(has_post_thumbnail()){
$thumbnail_id = get_post_thumbnail_id();
}
} else { //все остальное, такое как 404, архивы категорий, поиск и т.д.
//вставьте резервный вариант здесь
}
if(!$thumbnail_id()){
//вставьте другой резервный вариант здесь
}
$thumbnail = get_attachment_image($thumbnail_id,'post-thumbnail');
$thumbnail_src = wp_get_attachment_image_src($thumbnail_id,'post-thumbnail')[0];
Удачной кодировки!
Сначала найдите id страницы постов и передайте id в функцию wp_get_attachment_url(get_post_thumbnail_id())
.
$blog_page_image = wp_get_attachment_url( get_post_thumbnail_id(get_option( 'page_for_posts' )) );
Надеюсь, это решит вашу проблему.
Ответ или решение
Решение проблемы с получением изображения для страницы блога в WordPress
При работе с WordPress, особенно когда речь идет о отображении изображений на страницах, важно понимать, как правильно извлечь данные для различных типов контента. Ваша ситуация заключается в том, что вам нужно отобразить изображение, установленное для страницы "Блог", а не миниатюры первых постов в блоге. Давайте рассмотрим, как можно решить эту задачу.
Понимание структуры
В WordPress есть два основных типа контента: страницы и посты. Вы можете использовать функции, такие как get_post_thumbnail_id()
, чтобы получить ID миниатюры поста. Однако если вы находитесь на странице блога, эта функция будет возвращать ID изображения первого поста, а не ID миниатюры вашей страницы "Блог".
Способы решения
Чтобы получить изображение, установленное для страницы блога, вам нужно будет сделать следующее:
-
Определение ID страницы блога: Используйте функцию
get_option('page_for_posts')
, чтобы получить ID страницы, которая настроена в качестве блога. -
Проверка наличия миниатюры: Проверьте, установлена ли миниатюра для страницы блога, используя
has_post_thumbnail()
. -
Получение URL миниатюры: Если миниатюра установлена, получите её ID с помощью
get_post_thumbnail_id()
и затем используйтеwp_get_attachment_url()
для получения URL изображения.
Пример кода
$thumbnail_id = null;
if (is_home()) { // проверяем, находимся ли мы на странице блога
$blog_page_id = (int)get_option('page_for_posts');
if (has_post_thumbnail($blog_page_id)) {
$thumbnail_id = get_post_thumbnail_id($blog_page_id);
}
} elseif (is_singular()) { // для единичных постов, страниц и т.д.
if (has_post_thumbnail()) {
$thumbnail_id = get_post_thumbnail_id();
}
}
// Фallback для других случаев, если миниатюра не найдена
if (!$thumbnail_id) {
// Можно установить изображение по умолчанию или оставить пустым
}
// Получаем URL миниатюры
$thumbnail_url = wp_get_attachment_url($thumbnail_id);
Рекомендации по использованию
- Помещайте код вне главного цикла, чтобы он выполнялся при загрузке страницы, а не для каждого поста.
- Заботьтесь о производительности: Если на вашем блоге много постов, использование различных функций для получения информации может потребовать дополнительных ресурсов. Профилируйте код, если это необходимо.
Подведение итогов
Следуя приведенным рекомендациям и используя предложенный код, вы сможете получить изображение, установленное для страницы "Блог". Это улучшит визуальное представление вашего сайта и повысит его привлекательность для посетителей. Обязательно протестируйте изменения, чтобы убедиться, что они работают должным образом в различных сценариях использования WordPress.