Вопрос или проблема
Могу ли я сделать это для постов?
У меня есть последние посты, которые я получаю, и я показываю эскиз (изображение-предпросмотр) этих постов, ЕСЛИ они существуют.
Что я хочу сделать сейчас, так это показать изображения категорий, ЕСЛИ изображения-предпросмотры не существуют.
Кто-нибудь может помочь мне с этим?
На данный момент у меня есть это:
<?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.