Получение изображения записи на главной странице блога
Я пытаюсь использовать "featured image" (избранное изображение) для главной страницы (индекс блога), но безрезультатно. На всех остальных страницах это работает, но не на главной.
Код выглядит примерно так:
// Не использовать для одиночных записей
if (!is_single()) {
if (is_home()) {
if (function_exists('wp_get_attachment_thumb_url')) {
$img = wp_get_attachment_image_src(get_post_thumbnail_id(),'full');
$featured_image = $img[0];
}
} else {
if (function_exists('wp_get_attachment_thumb_url') && has_post_thumbnail()) {
$img = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID),'full');
$featured_image = $img[0];
}
}
if ($featured_image) { ?>
// Много кода...
<?php }
}
Я уже пробовал получить миниатюру используя метаполе _thumbnail_id. Тот же результат.
Этот код размещен в файле functions.php, я предполагаю, что проблема в том, что он пытается получить изображение записи из цикла.
Заранее большое спасибо.

если вы имеете в виду 'страницу для записей', тогда попробуйте (показана только релевантная часть вашего кода):
if (is_home() && get_option('page_for_posts') ) {
$img = wp_get_attachment_image_src(get_post_thumbnail_id(get_option('page_for_posts')),'full');
$featured_image = $img[0];
} else {

Я бы предложил учесть следующие корректировки для тех, кто реализует подобное:
- Получайте ID текущей страницы/записи/индекса с помощью
get_queried_object()
. Для индексной страницы блога, установленной как страница, это вернет правильный ID страницы. - Если вам нужен только полноразмерный вариант изображения, используйте
wp_get_attachment_url()
вместоwp_get_attachment_image_src()
Вот быстрая функция, которую я бы использовал для более простой реализации:
/**
* Пользовательское миниатюрное изображение
*/
function custom_featured_image() {
$queried_obj = get_queried_object();
// Не использовать для отдельных записей (ТОЛЬКО ДЛЯ ЭТОГО ПРИМЕРА)
if ( is_single() ) return;
// Получаем ID миниатюрного изображения
$image_id = get_post_thumbnail_id( $queried_obj->ID );
// Получаем URL полноразмерного изображения
$image_src = wp_get_attachment_url( $image_id );
return $image_src;
}
Лично я предпочитаю избегать избыточной вложенной условной логики - использование функций помогает в этом.

Это работает...
<section id="banner" style="background-image: <?php if (is_home() && get_option('page_for_posts') ) {
$blog_home_id = get_option( 'page_for_posts' );
echo 'url('.get_the_post_thumbnail_url($blog_home_id, 'full').')';
} else {
echo 'url('.get_the_post_thumbnail_url($post->ID, 'full').')';
}
?>;">
Надеюсь, это поможет!

У вас есть 2 быстрых варианта: через файл шаблона с использованием the_post_thumbnail
для цикла. Я предполагаю, что вы выводите данные в типичном формате блога, и поэтому ваша функция выше не будет работать или будет вести себя странно внутри цикла.
Вместо этого попробуйте что-то вроде этого в самом файле шаблона, где находится ваш основной цикл (например, index.php или loop.php):
//начало цикла
if ( has_post_thumbnail() ) {
the_post_thumbnail();
}
//the_content(); и другие элементы
//конец цикла
Или, если вы хотите использовать действие для изменения основного цикла, вы можете использовать pre_get_posts
, например, в файле functions.php.
Что-то вроде:
add_action( 'pre_get_posts', 'add_featured_image' );
function add_featured_image( $query ) {
if( $query->is_main_query() && $query->is_home() ) {
//ваш код для изображения
}
}
Обратите внимание, что в вышеприведенном коде проверяются 2 параметра: основной запрос и главная страница. Очень важно проверять, является ли запрос основным, иначе это повлияет на все запросы.
Ссылка:http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

Вы невнимательно прочитали вопрос, пользователь не хочет получать записи блога внутри цикла, он хочет получить изображение записи (featured image) для страницы, которая назначена в качестве индексной страницы блога, что я тоже хочу сделать. has_post_thumbnail()
работает нормально в page.php, но возвращает false
при использовании в index.php

Когда вы находитесь на "странице записей", переменная $post будет начинаться с первой "записи" в цикле. Один из способов - использовать "объект запроса".
Выведите $wp_query, и вы увидите: [queried_object] [posts] [post] -- примечание: queried_object может быть пустым на некоторых страницах
// get_the_post_thumbnail_url( get_queried_object(), 'fullsize' );
// или
function ABC_get_the_thumbnail_url() {
$queried_object = get_queried_object(); // Получаем объект текущего запроса
$thumbnail_url = get_the_post_thumbnail_url( $queried_object, 'fullsize' ); // Получаем URL миниатюры полного размера
if ( ! $thumbnail_url ) { // Если миниатюра отсутствует
return get_template_directory_uri() . '/your-path/default-image.jpg'; // Возвращаем путь к изображению по умолчанию
// или из опции по умолчанию
}
return $thumbnail_url; // Возвращаем URL миниатюры
}
