Вопрос или проблема
Я работаю над плагином для WordPress и пытаюсь отобразить/получить миниатюру поста ниже поста в разделе “Похожие посты”. Я пробовал много вещей, которые должны работать, но не для меня… вот код (в моем файле plugin.php):
add_theme_support( 'post-thumbnails', array( 'post', 'page' ) );
if ( has_post_thumbnail() ) {
echo ('есть миниатюра');
echo get_the_post_thumbnail(get_the_ID(), "thumbnail"); // ничего
echo get_the_post_thumbnail(); // ничего
echo var_dump(get_the_post_thumbnail(get_the_ID(), "thumbnail")); //string '' (length=0)
echo var_dump(get_the_post_thumbnail()); //string '' (length=0)
the_post_thumbnail('thumbnail'); // ничего
the_post_thumbnail(); // ничего
}
else {
echo ('нет миниатюры');
}
Сначала я думал, что у моего поста нет миниатюры, но мой первый echo вернул “есть миниатюра”, и все остальное ничего не возвращает… так что я не понимаю… что не так?
Спасибо
Редактировать:
Вот текущий полный код в моем файле plugin.php:
function Similar_Article ($content) {
if (is_single() || is_page()) {
the_post();
$similar_to_add = '';
$id = get_the_ID();
$content_and_similar = $content . '<br><br>'; //пробелы между постом и похожими постами
/* много методов вызвано для поиска моих похожих постов */
if (has_post_thumbnail()){
$content_and_similar .= get_the_post_thumbnail(); // это работает
}
else {
$imageData = wp_get_attachment_image_src(get_post_thumbnail_id ( $id ), 'thumbnail');
$content_and_similar .= '<img src="https://wordpress.stackexchange.com/questions/269810/".$imageData[0]."https://wordpress.stackexchange.com/questions/269810/">';
}
$content_and_similar .= $similar_to_add;
return $content_and_similar;
}
else {
return $content;
}
}
add_filter( 'the_content', 'Similar_Article' );
моя функция работает, если миниатюра есть, но ничего не отображает, если миниатюры нет…
Обратите внимание, has_post_thumbnail()
не только проверяет, есть ли у поста представленное изображение, но также проверяет, есть ли изображение в самом посте. Есть цитата из Справки по коду WordPress:
Стоит отметить, что
has_post_thumbnail()
не просто проверяет
на наличие представленного изображения, как предлагает примечание, добавленное пользователями Codex. Если
пост не содержит определенного представленное изображения, но в его содержимом есть изображение,
эта функция все равно вернет TRUE.
Я предлагаю вам использовать if (get_the_post_thumbnail() != '')
вместо if (has_post_thumbnail())
.
Ответ или решение
Проблема с получением миниатюры поста в WordPress
Если вы сталкиваетесь с ситуацией, когда миниатюра поста не отображается или не возвращается, даже несмотря на то, что has_post_thumbnail()
сообщает о наличии миниатюры, это может быть связано с несколькими факторами. Давайте разберем ваш код и предложим несколько решений для устранения возникшей проблемы.
Анализ предоставленного кода
Исходя из вашего кода, вы используете следующие функции:
-
add_theme_support(‘post-thumbnails’, array(‘post’, ‘page’)); – это правильное добавление поддержки миниатюр для постов и страниц. Однако убедитесь, что этот вызов находится в правильном контексте, например, в функции
functions.php
вашей темы или в инициализации вашего плагина. -
has_post_thumbnail() – эта функция проверяет, есть ли миниатюра, но, как вы отметили, она может возвращать TRUE, если в содержимом поста есть изображение. Это может быть одной из причин, почему последующие вызовы для получения миниатюры не работают.
-
get_the_post_thumbnail() – если он возвращает пустую строку (string ”), это значит, что для данного поста не задана миниатюра.
Возможные решения
-
Проверьте наличие миниатюры:
Вместо использования толькоhas_post_thumbnail()
, вы можете проверить миниатюру с помощью следующего кода:if (!empty(get_the_post_thumbnail(get_the_ID()))) { echo get_the_post_thumbnail(get_the_ID(), 'thumbnail'); } else { echo 'Миниатюра отсутствует'; }
-
Использование
get_post_thumbnail_id()
:
Используйте функциюget_post_thumbnail_id()
, чтобы получить ID миниатюры, а затем используйте его для получения информации о миниатюре:$thumbnail_id = get_post_thumbnail_id($id); if ($thumbnail_id) { $image_attributes = wp_get_attachment_image_src($thumbnail_id, 'thumbnail'); if ($image_attributes) { $content_and_similar .= '<img src="' . esc_url($image_attributes[0]) . '" alt="' . esc_attr(get_the_title($thumbnail_id)) . '">'; } } else { echo 'Миниатюра отсутствует'; }
-
Детали вашего фильтра:
Если ваш фильтрadd_filter('the_content', 'Similar_Article');
срабатывает до того, как загружается контент с миниатюрой, это может вызвать проблемы с отображением. Убедитесь, что функция вызывается в нужное время в процессе загрузки страницы. -
Проверка правильности SID:
Убедитесь, что ваша функцияSimilar_Article()
действительно вызывается для нужных постов и страниц. Возможно, стоит добавить дополнительные проверки на тип контента.
Заключение
Проблема с получение миниатюры поста может быть вызвана несколькими обстоятельствами, включая неправильные проверки и условия. Переход на более точные проверки, такие как использование get_the_post_thumbnail()
и проверка её на пустоту, а также дополнительная информация о миниатюрах через get_post_thumbnail_id()
и wp_get_attachment_image_src()
могут помочь решить вашу проблему.
Помните также о SEO, проверяя правильное выполнение esc_url()
и esc_attr()
, чтобы обеспечить безопасность и корректное отображение медиафайлов.
Если все предложенные методы не помогают, стоит проверить наличие конфликтов с другими плагинами или темами, которые могут мешать нормальной работе миниатюр.