Как показать изображение категории, если не установлено изображение для публикации?

Вопрос или проблема

Могу ли я сделать это для постов?

У меня есть последние посты, которые я получаю, и я показываю эскиз (изображение-предпросмотр) этих постов, ЕСЛИ они существуют.

Что я хочу сделать сейчас, так это показать изображения категорий, ЕСЛИ изображения-предпросмотры не существуют.

Кто-нибудь может помочь мне с этим?

На данный момент у меня есть это:

    <?php 

    $args = array( 'numberposts' => '5' );
    $recent_posts = wp_get_recent_posts($args);
    $category = get_the_category(); 
    foreach( $recent_posts as $recent ){
        if($recent['post_status']=="publish"){
        if ( has_post_thumbnail($recent["ID"])) {
            echo '<a href="' . get_permalink($recent["ID"]) . '" title="Look '.esc_attr($recent["post_title"]).'" >' .   get_the_post_thumbnail($recent["ID"], 'thumbnail').'<div class="browse_category_name"> ' . $recent["post_title"]. '<div> ' . get_the_author_meta('display_name', $recent["post_author"]). '</div></div></a></li> ';
        } else{
            echo '<a href="' . get_permalink($recent["ID"]) . '" title="Look '.esc_attr($recent["post_title"]).'" >' .  get_categories_with_images($post->ID,' ,') . $recent["post_title"].'</a></li> ';
        }
         }
    }
    ?>

И это мой functions.php:

function get_categories_with_images($post_id,$separator ){

    // сначала получить все категории этого поста
    $post_categories = wp_get_post_categories( $post_id );
    $cats = array();

    foreach($post_categories as $c){
        $cat = get_category( $c );
        $cat_data = get_option("category_$c");

        // затем я просто отображаю изображение категории, если оно существует
        $cat_image="";
        if (isset($cat_data['img'])){
            $cat_image="<img src="".$cat_data['img'].'">';
        }
        $cats[] =  $cat_image . '<a href="'.get_category_link( $c ) . '">' .$cat->name .'</a>';
    }
    return implode($separator , $cats);
}

Проблема: изображение категории не показывается, даже если эскиз / изображение-предпросмотр не установлено.

У вас есть опечатка. В вашем цикле вы проверяете has_post_thumbnail($recent["ID"]), но $recent['ID'] не будет установлен, потому что переменная для каждого поста в вашем foreach — это $decent:

foreach( $recent as $decent ){

Измените ваш код на:

<?php 

$args = array( 'numberposts' => '5' );
$recent = wp_get_recent_posts($args);
$category = get_the_category(); 
foreach( $recent as $decent ){
    if($decent['post_status']=="publish"){
    if ( has_post_thumbnail($decent["ID"])) {
        echo '<a href="' . get_permalink($decent["ID"]) . '" title="Look '.esc_attr($decent["post_title"]).'" >' .   get_the_post_thumbnail($decent["ID"], 'thumbnail').'<div class="browse_category_name"> ' . $decent["post_title"]. '<div> ' . get_the_author_meta('display_name', $decent["post_author"]). '</div></div></a></li> ';
    } else{
        echo '<a href="' . get_permalink($decent["ID"]) . '" title="Look '.esc_attr($decent["post_title"]).'" >' .  get_categories_with_images($post->ID,' ,') . $decent["post_title"].'</a></li> ';
    }
     }
}
?>

Пост теперь $decent, а не $recent

Ответ или решение

Конечно, решение проблемы отсутствия отображения изображения категории, когда не задано изображение записи (featured image), может вызвать ряд трудностей, особенно если вы не знакомы с особенностями языка PHP и WordPress API. Перед тем как погрузиться в детали, рассмотрим теорию, пример и непосредственно применение в коде.

Теория

В большинстве тем WordPress основным изображением записи является "изображение записи" (featured image), которое устанавливается для конкретной публикации. Однако, в случае его отсутствия, можно настроить отображение изображений категории, чтобы придать страницам завершенный вид и избегать пустых мест.

Чтобы реализовать данную функциональность, необходимо убедиться в корректности проверки наличия изображения записи и предусмотреть механизм загрузки изображения категории, если изображение записи отсутствует. В WordPress категории могут иметь свои метаданные, которые более гибко используются, в том числе и для хранения URL изображения. Для получения этой информации используется функция get_option, загружающая данные, сохраненные для категории с определенным ID.

Пример

На основе предоставленного вами кода вы начали реализацию нужной функциональности, но столкнулись с несколькими проблемами. Ключевая ошибка заключается в неверной передаче переменной $recent вместо $decent, что неправильно определяет идентификатор записи и, следовательно, проверка наличия изображения работает некорректно.

Также важен аспект правильности загрузки и отображения изображения категории, для чего вы уже используете функцию get_categories_with_images. Однако, возможно, структура данной функции нуждается в визуальной доработке и улучшении логики использования URL изображения.

Применение

Теперь разберем, как можно подкорректировать ваш код:

<?php 

$args = array( 'numberposts' => '5' );
$recent_posts = wp_get_recent_posts($args);
foreach( $recent_posts as $recent ){
    if($recent['post_status'] == "publish") {
        // Проверка наличия изображения записи
        if ( has_post_thumbnail($recent["ID"])) {
            echo '<a href="' . get_permalink($recent["ID"]) . '" title="Look ' . esc_attr($recent["post_title"]) . '" >' . get_the_post_thumbnail($recent["ID"], 'thumbnail') . '<div class="browse_category_name"> ' . $recent["post_title"] . '<div> ' . get_the_author_meta('display_name', $recent["post_author"]) . '</div></div></a>';
        } else {
            // Если изображения записи нет, показать изображение категории
            echo '<a href="' . get_permalink($recent["ID"]) . '" title="Look ' . esc_attr($recent["post_title"]) . '" >' . get_categories_with_images($recent["ID"], ' ,') . $recent["post_title"] . '</a>';
        }
    }
}
?>

Корректировка аргументов и вывода массива $recent решает проблему с отображением изображений, а использование функции get_categories_with_images в блоке else становится логически правильным.

Теперь немного об оптимизации функции get_categories_with_images. Обратите внимание на часть кода, отвечающую за извлечение и отображение URL изображений:

function get_categories_with_images($post_id, $separator) {
    // Получение категорий
    $post_categories = wp_get_post_categories($post_id);
    $cats = array();

    foreach($post_categories as $c){
        $cat_data = get_option("category_$c");
        $cat_image = "";

        // Проверяем наличие изображения в метаданных категории
        if (isset($cat_data['img'])) {
            $cat_image = '<img src="' . esc_attr($cat_data['img']) . '">';
        }

        $cat = get_category($c);
        $cats[] = $cat_image . '<a href="' . get_category_link($c) . '">' . esc_html($cat->name) . '</a>';
    }

    // Возвращаем строку, содержащую изображения и названия категорий
    return implode($separator, $cats);
}

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

Эти изменения должны решить вашу проблему и предоставят необходимый уровень гибкости для отображения изображений категорий, когда картинки записи недоступны. Надеюсь, данное объяснение поможет вам справиться с поставленной задачей и обеспечить соответствующее отображение для ваших постов в WordPress.

Оцените материал
Добавить комментарий

Капча загружается...