wp_query выборка записей с миниатюрами
Какой аргумент отвечает за наличие у записи миниатюры (post_thumbnail) в функции wp_query?
К примеру, нужно выбрать 3 записи из категории у которых есть миниатюра.
Какой аргумент отвечает за наличие у записи миниатюры (post_thumbnail) в функции wp_query?
К примеру, нужно выбрать 3 записи из категории у которых есть миниатюра.
Если у поста есть стандартная WordPress миниатюра, то у него есть произвольное поле
_thumbnail_id. А значит вам нужно получить посты у которых есть мета поле _thumbnail_id...Примерно такой код:
$mposts = get_posts( array( 'posts_per_page' => 3, 'post_type' => 'post', 'meta_query' => array( array( 'key' => '_thumbnail_id', //'compare' => 'EXISTS' ) ) ) ); foreach( $mposts as $pst ){ echo get_permalink( $pst->ID ) . '<br>'; }П.С. но это не совсем правильный подход, потому что в будущем вдруг может измениться принцип указания миниатюр и тогда ваш код станет нерабочим. Но с другой стороны WordPress не дает правильно решения этой задачи...
Спасибо Kama!
Не знал о 'compare' => 'EXISTS'
Решение администратора частично верное.
Но параметр 'EXISTS' здесь лишний, достаточно только ключа. При добавлении или удалении миниатюры ключ '_thumbnail_id' соответственно добавляется или удаляется с БД, а не очищается. И даже в случае ручного очищения значения ключа из БД, запись все равно попадет в результаты независимо от наличия или отсутствия параметра 'EXISTS', потому, что сама запись существует в БД.
Другое важное замечание – для удаления миниатюры в админке при редактировании записи не нужно нажимать кнопку «Сохранить», удаление происходит мгновенно без необходимости подтверждения или сохранения изменений. А значит можно случайно удалить миниатюру записи. Но при этом могут и скорее всего останутся фото, которые были загружены к этой записи. В результате, запись с изображениями, но без миниатюры, не попадет в результаты.
Если необходимо отфильтровать посты с изображениями, то нужно:
Получить массив ID постов.
Отфильтровать все прикрепленные и только прикрепленные фото по массиву ID постов више, после чего получить массив ID своих постов, к которым они прикреплены (post_parrent).
В результате мы получим действительно только те записи, которые содержат изображения, даже если миниатюра не установлена, и даже если процесс сохранения записи миниатюры в БД изменится с будущими обновлениями WP.
Пример кода:
// Получем перечень ID всех опубликованных постов $post_ids = get_posts( array( 'numberposts' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'fields' => 'ids', )); // Получаем все фото, которые прикреплены к постам $attached_images = get_posts( array( 'numberposts' => -1, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'post_parent__in' => $post_ids, ) ); // Формируем масив постов, которые содержат фото foreach( $attached_images as $image ) { $posts_with_images[] = $image->post_parent; } $all_posts_with_images = get_posts( array( 'post_type' => 'post', 'post_status' => 'publish', 'numberposts' => 3, 'post__in' => $posts_with_images, ) ); foreach( $all_posts_with_images as $post_with_image ){ echo get_permalink( $post_with_image->ID ) . '<br>'; }П.с. с точки зрения семантики кода, в get_posts корректней использовать 'numberposts', а 'posts_per_page' - для WP Query, хотя они и идентичны по результату.
Детальнее тут: http://stackoverflow.com/a/3335128