Получить изображение автора из соответствующей статьи в миниатюре

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

Я хочу добавить изображение автора для каждого миниатюры на главной странице.

Я пробовал <?php echo get_avatar( get_the_author_meta( 'ID' ), 32 ); ?>, но он выдает одно и то же изображение на каждой миниатюре.

Вот полный код для миниатюр:

 <?php
          $recentp_args = array( 'numberposts' => '4' );
          $recent_posts = wp_get_recent_posts($recentp_args);
          foreach( $recent_posts as $recent ){ ?>
            <article>
              <a href="https://wordpress.stackexchange.com/questions/325260/<?php echo get_permalink($recent["ID"]); ?>">
                <?php 
                  $thumb = get_the_post_thumbnail( $recent["ID"], 'featuredmedium', array( 'class' => 'lazyload' ) );
                  if ( !empty($thumb) ) { // проверяем, есть ли у поста миниатюра.
                    echo $thumb;
                  } else {
                    echo '<img src="'.get_bloginfo('template_url').'/images/photo_default.png" width="320" height="167" alt="" />';
                  }
                ?>
                <h2 class="title"><?php echo $recent["post_title"]; ?></h2>
                <?php echo apply_filters( 'the_content', limit_words(strip_tags($recent["post_content"]),38) ); ?>

                <?php echo get_avatar( get_the_author_meta( 'ID' ), 32 ); ?>
              </a>
            </article>
        <?php } ?>

<?php echo get_avatar( get_the_author_meta( 'ID') , 150); ?>

Это именно то, что я использую.

Я думаю, что проблема в “foreach( $recent_posts as $recent )”, я рекомендую использовать

if ( $wp_query->have_posts() ) :

Я рекомендую ознакомиться с https://developer.wordpress.org/reference/classes/wp_query/ и не забывать сбрасывать цикл после завершения

wp_reset_postdata();

Здесь есть несколько ошибок <?php echo get_avatar( get_the_author_meta( 'ID' ), 32 ); ?> не сработает, потому что вы не находитесь в Цикле. Если вы хотите использовать функции, которые не принимают конкретный ID поста, но используют глобальный пост, вы должны быть в цикле. Вместо использования foreach вам нужно использовать стандартный цикл постов WordPress, что также означает, что вам нужно получить посты как объект запроса вместо массива. Измените вашу строку недавних постов на $recent_posts = new WP_Query($recentp_args); и замените ваш цикл foreach на следующий

if ($recent_posts->have_posts()) : 
    while $recent_posts->have_posts(): 
        $recent_posts->the_post;

Тогда get_the_author_meta() должен работать.

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

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

Решение проблемы

Чтобы исправить ситуацию, вам нужно использовать стандартный цикл WordPress, который позволяет использовать функции внутри цикла, такие как get_the_author_meta(). Давайте разберем ваш код и внесем необходимые изменения.

Измененный код

<?php
// Запрашиваем последние 4 поста
$recentp_args = array( 'posts_per_page' => 4 );
$recent_posts = new WP_Query($recentp_args); // Используем WP_Query

if ($recent_posts->have_posts() ) :
    while ($recent_posts->have_posts() ) : $recent_posts->the_post(); // Стандартный цикл WordPress
?>
        <article>
            <a href="<?php the_permalink(); ?>"> <!-- Используем the_permalink() для получения ссылки на пост -->
                <?php 
                // Получаем миниатюру поста
                $thumb = get_the_post_thumbnail( get_the_ID(), 'featuredmedium', array( 'class' => 'lazyload' ) );
                if ( !empty($thumb) ) { 
                    echo $thumb;
                } else {
                    echo '<img src="'.get_bloginfo('template_url').'/images/photo_default.png" width="320" height="167" alt="" />';
                }
                ?>
                <h2 class="title"><?php the_title(); ?></h2> <!-- Используем the_title() -->
                <?php echo apply_filters('the_content', wp_trim_words(get_the_content(), 38)); // Ограничиваем количество слов ?>

                <?php echo get_avatar( get_the_author_meta('ID'), 32 ); // Получаем изображение автора ?>
            </a>
        </article>
<?php 
    endwhile; 
    wp_reset_postdata(); // Сбрасываем данные поста
endif; 
?>

Объяснение изменений

  1. Использование WP_Query: Мы заменили массив wp_get_recent_posts() на объект WP_Query. Это позволяет использовать стандартный цикл WordPress, что необходимо для корректной работы функций, связанных с постами.

  2. Цикл while: Мы заменили конструкцию foreach на стандартный цикл while. Это дает возможность WordPress правильно обрабатывать данные текущего поста и использовать функции, такие как get_the_author_meta().

  3. Функции вывода: В код добавлены функции the_permalink() и the_title(), что делает код более читаемым и упрощает восстановление ссылок и заголовков постов.

  4. Сброс постов: Использование wp_reset_postdata() освобождает память и гарантирует, что данные поста вернутся к предыдущему состоянию после окончания цикла.

Заключение

Эти изменения обеспечат динамическое получение изображения автора для каждого поста, что сделает ваш сайт более профессиональным и иммерсивным для пользователей. Внедрив этот код, вы повысите качество своего контента, что может положительно сказаться на SEO и взаимодействии пользователей с вашим сайтом.

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

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