Получение изображения записи на главной странице блога

9 сент. 2012 г., 20:06:29
Просмотры: 18.9K
Голосов: 8

Я пытаюсь использовать "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, я предполагаю, что проблема в том, что он пытается получить изображение записи из цикла.

Заранее большое спасибо.

0
Все ответы на вопрос 5
0
15

если вы имеете в виду 'страницу для записей', тогда попробуйте (показана только релевантная часть вашего кода):

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 { 
9 сент. 2012 г. 20:52:01
0

Я бы предложил учесть следующие корректировки для тех, кто реализует подобное:

  1. Получайте ID текущей страницы/записи/индекса с помощью get_queried_object(). Для индексной страницы блога, установленной как страница, это вернет правильный ID страницы.
  2. Если вам нужен только полноразмерный вариант изображения, используйте 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;
}

Лично я предпочитаю избегать избыточной вложенной условной логики - использование функций помогает в этом.

19 февр. 2018 г. 18:28:37
0

Это работает...

<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').')';
}
?>;">

Надеюсь, это поможет!

8 июн. 2017 г. 00:45:32
1

У вас есть 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

9 сент. 2012 г. 20:38:52
Комментарии

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

Lee Lee
22 авг. 2016 г. 13:17:24
0

Когда вы находитесь на "странице записей", переменная $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 миниатюры

}
2 апр. 2020 г. 16:11:20