Запрос сообщений только с изображением


15

Я хочу запросить 6 сообщений, но только те, которые имеют прикрепленное изображение. Я использую 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);дает большой результат, поэтому я разместил его в пастбине


2
Фрагмент кода работал для меня, как и ожидалось. Возможно ошибка находится в другой части кода.
Ralf912

Что вы получаете от var_dump( $query )?
Чип Беннетт

В качестве дополнительной вещи я подумал - сообщения были импортированы на мой локальный сервер с живого сайта, используя экспорт / импорт wordpress. Все оригинальные посты содержали изображения, которые явно были потеряны в процессе импорта. Может ли это означать, что, несмотря на то, что избранные изображения были удалены, мета-ключи все еще оставались причиной того, что запрос не работал?
Harryg

Когда вы запустили импорт, вы установили флажок для загрузки и прикрепления всех вложений / носителей? Если вы этого не сделали, ваши избранные изображения не будут работать. Сообщения будут иметь избранные изображения, но они будут ссылаться на вложение, которое не существует, и поэтому никогда не будет отображаться
Том Дж. Новелл

Да, я установил флажок при импорте.
Harryg

Ответы:


3

При запуске средства импорта необходимо установить флажок для загрузки и импорта всех файлов мультимедиа / вложений.

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

Удалите свои сообщения и повторно импортируйте, используя правильные настройки.

Также, чтобы продемонстрировать это, вы не пытались проверить сообщения, всегда проверяйте, например:

if ( $query->have_posts() ) { // you never checked to see if no posts were found
    while($query->have_posts()) { // alt style syntax doesn't work with most IDEs
        $query->the_post(); // individual statement should be on individual line
        ?><h2><?php the_title(); ?></h2><?php // you only need open/close tags here, not every line, save yourself some time typing
        if ( has_post_thumbnail() ) { // only print out the thumbnail if it actually has one
            echo '<p>post says it has a featured image</p>'; // double checking
            the_post_thumbnail('thumbnail');
        } else {
            echo '<p>this post does not have a featured image</p>';
        }
    }
} else {
    echo '<p>no posts found</p>';
}

Если вы не установили флажок, вы получите изображения, в которых указано, что у них есть выделенное изображение, но изображение не отображается


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

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

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

и в то же время, обертывание the_post_thumbnailс has_thumbnailвызовом и добавить еще случай , так что вы определенно однозначно знаете , что пост не имеет признаки образа
Том J Ноуэлл

Также убедитесь, что ваш сервер может связаться с удаленным сервером. Если ваш сервер не может получить удаленные запросы, он не сможет импортировать. Возможно, вам понадобится удалить уже захваченные вложения мультимедиа
Tom J Nowell

24

Начиная с WordPress 3.5, Meta Query Parameters поддерживают EXISTSи NOT EXISTSкак операторы сравнения. В случае, если вы используете их, вы можете опустить valueчасть мета-запроса. Попробуйте следующие аргументы для вашего запроса:

$args = array(
   'post_type'  => 'post',
   'posts_per_page' => 6,
    'meta_query' => array(
        array(
         'key' => '_thumbnail_id',
         'compare' => 'EXISTS'
        ),
    )
);

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

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

Гарриг, можешь подтвердить, что ты используешь v3.5 или новее?
Том Дж. Новелл

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

2
Просто дополнительная информация: есть неразрешенная ошибка, см. Trac ticket 23268 , из-за которой необходимо использовать значение, если NOT EXISTSоно используется.
Николай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.