Получение записей только с прикрепленным изображением записи

3 мар. 2013 г., 20:52:27
Просмотры: 33.7K
Голосов: 17

Я хочу получить 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

5
Комментарии

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

Ralf912 Ralf912
3 мар. 2013 г. 21:40:51

Что вы получаете в результате var_dump( $query )?

Chip Bennett Chip Bennett
3 мар. 2013 г. 22:07:45

Ещё одна мысль, которая пришла мне в голову - посты были импортированы на мой локальный сервер с работающего сайта с помощью экспорта/импорта WordPress. У оригинальных постов были избранные изображения, которые, очевидно, потерялись в процессе импорта. Может ли это означать, что хотя избранные изображения были удалены, мета-ключи остались, что могло привести к некорректной работе запроса?

harryg harryg
4 мар. 2013 г. 01:39:38

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 02:27:53

Да, я отметил галочку при импорте.

harryg harryg
4 мар. 2013 г. 11:16:17
Все ответы на вопрос 2
5
31

Начиная с 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'
        ),
    )
);
3 мар. 2013 г. 21:59:12
Комментарии

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

harryg harryg
4 мар. 2013 г. 01:36:28

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

helgatheviking helgatheviking
4 мар. 2013 г. 02:01:26

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 02:25:50

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

harryg harryg
4 мар. 2013 г. 11:15:22

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

Nicolai Grossherr Nicolai Grossherr
1 мар. 2014 г. 00:28:17
8

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

Если этого не сделать, у записей не будет корректного изображения записи, они не будут отображаться в цикле, а любая попытка вызвать 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>';
}

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

4 мар. 2013 г. 02:29:59
Комментарии

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

helgatheviking helgatheviking
4 мар. 2013 г. 06:48:01

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

harryg harryg
4 мар. 2013 г. 11:14:14

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 11:52:50

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 11:53:56

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 12:00:50

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

harryg harryg
4 мар. 2013 г. 12:46:09

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

Tom J Nowell Tom J Nowell
4 мар. 2013 г. 13:08:49

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

harryg harryg
4 мар. 2013 г. 23:35:17
Показать остальные 3 комментариев