Получение записей только с прикрепленным изображением записи
Я хочу получить 6 записей, но только те, к которым прикреплено изображение записи (featured image). Я использую метод meta_key
с WP_Query
следующим образом:
$args = array(
'post_type' => 'post',
'meta_key' => '_thumbnail_id',
'post_count' => 6 );
$query = new WP_Query($args);
Затем следует
<?php while($query->have_posts()) : $query->the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php the_post_thumbnail('thumbnail'); ?>
<?php endwhile; ?>
Это не работает как нужно. Запрос возвращает более 6 записей, включая те, у которых нет изображения записи. Есть идеи, что я сделал неправильно?
@chip: результат var_dump($query);
слишком большой, поэтому я разместил его в pastebin

Начиная с WordPress 3.5, Параметры Meta Query поддерживают операторы сравнения EXISTS
и NOT EXISTS
. Если вы используете эти операторы, вы можете опустить часть value
в meta query. Попробуйте следующие аргументы для вашего запроса:
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS'
),
)
);

Спасибо за предложение. Теперь я получаю 6 записей, но все еще есть записи без миниатюр.

Я проверил это, и у меня сработало. Но я заметил, что будут возвращены сущности, у которых установлены метаданные, но по какой-то причине ID вложения неверен. Так что дважды проверьте, что у ваших записей установлены избранные изображения. В противном случае, я не знаю, в чем еще может быть проблема.

harryg, можете подтвердить, что вы используете версию 3.5 или новее?

Да, я использую последнюю версию WordPress — только что установленную на моем локальном сервере разработки в виде сети (мультисайт).

Некоторая дополнительная информация: существует неисправленный баг, см. тикет trac 23268, который делает необходимым использование значения, если используется NOT EXISTS
.

При запуске импорта необходимо установить флажок для загрузки и импорта всех медиафайлов/вложений, а исходный сервер должен быть доступен с сервера, выполняющего импорт.
Если этого не сделать, у записей не будет корректного изображения записи, они не будут отображаться в цикле, а любая попытка вызвать the_post_thumbnail
завершится неудачей, создавая впечатление, что у них нет изображения записи.
Чтобы исправить это, удалите свои записи и повторно импортируйте их, используя правильные настройки, убедившись, что старый сервер по-прежнему доступен по своему исходному URL.
Также, чтобы проиллюстрировать это, вы не проверили записи - всегда проверяйте, например:
if ( $query->have_posts() ) { // вы никогда не проверяли, найдены ли записи
while($query->have_posts()) { // альтернативный синтаксис не работает в большинстве IDE
// каждое отдельное выражение должно быть на отдельной строке
$query->the_post();
// здесь нужны только открывающие/закрывающие теги, не на каждой строке - сэкономит время на ввод
?><h2><?php the_title(); ?></h2><?php
// выводим миниатюру только если она действительно есть
if ( has_post_thumbnail() ) {
echo '<p>запись утверждает, что у нее есть изображение</p>'; // двойная проверка
the_post_thumbnail('thumbnail');
} else {
echo '<p>у этой записи нет изображения</p>';
}
}
} else {
echo '<p>записи не найдены</p>';
}
Если вы не установили флажок, вы получите записи, которые утверждают, что у них есть изображение, но само изображение не будет отображаться

Я подозреваю, что это причина, по которой предоставленный мной ответ не работает как ожидалось. Плагин WordPress Suicide довольно полезен для удаления всего контента.

Я определенно отметил этот чекбокс. Однако по моему опыту это никогда не работало. Все изображения были привязаны к внешнему сайту. Я использовал плагин Import External Images(http://wordpress.org/extend/plugins/import-external-images/) для локального сохранения изображений и их прикрепления.

У меня была та же мысль – я точно отметил чекбокс, почему же это до сих пор не работает? У меня были такие случаи с клиентами, и так легко ошибиться, поэтому удалите свои записи, переимпортируйте и убедитесь, что чекбокс отмечен, и если он всё ещё не работает, тогда можно исключить эту причину. В противном случае есть выступление Нила Деграсса Тайсона о том, насколько жалко слаба человеческая память. Сейчас я могу попросить вас снять отметку со второго чекбокса, и вы, вероятно, вспомните, что видели его (но его нет).

а пока оберните the_post_thumbnail
вызовом has_thumbnail
и добавьте условие else, чтобы точно и однозначно знать, что у записи нет миниатюры

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

@Tom спасибо за комментарии. Я знаю, ты говоришь, что легко забыть сделать что-то, но Я ТОЧНО помню, что отметил галочку. Проблема в том, что у меня это очень часто не работает: я отмечаю галочку, но ни одно изображение не импортируется, и в итоге все записи содержат внешние ссылки на изображения. Мой сервер - это простая настройка Xampp на MacOS, которая имеет доступ к удаленным ресурсам. Я подозреваю, что это комбинация неработающей галочки и плагина, который я использовал для загрузки всех изображений, который не смог правильно установить их как "избранные". Вечером попробую твои рекомендации и отпишусь

XAMPP - это инструмент только для Windows? Вместо того чтобы спорить о том, что вы думаете, что знаете, и о своих ощущениях, продемонстрируйте это с помощью отладочного кода и предоставьте полезные, однозначные, точные данные. Заглавные буквы вам не помогут. Я многократно воспроизводил эту проблему локально и на серверах клиентов, отмечая или не отмечая галочку, и сам совершал эту ошибку. На данный момент это наиболее точная теория, учитывая предоставленную информацию. Если вы не согласны, предоставьте новые данные, чтобы мы могли прийти к лучшей теории.

Нет, Xampp отлично работает и на Mac! К сожалению, нет конкретных доказательств, ставил я галочку или нет, но это не так важно. Проблема в том, что импорт медиафайлов завершился неудачно — запись считает, что у нее есть изображение записи, так как метатег присутствует, но самого изображения нет. Добавление нового изображения записи и его удаление предотвращает появление записи в выборке, что подтверждает работоспособность запроса, а это именно то, что я хотел выяснить. Спасибо за предложения.
