WordPress как на ладони
wordpress jino

wp_query выборка записей с миниатюрами

Какой аргумент отвечает за наличие у записи миниатюры (post_thumbnail) в функции wp_query?

К примеру, нужно выбрать 3 записи из категории у которых есть миниатюра.

3
rustorg14 2.6 года назад
  • 1
    Kama4558

    Если у поста есть стандартная 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 не дает правильно решения этой задачи...

    stepan 2.6 года назад

    Спасибо Kama!
    Не знал о 'compare' => 'EXISTS'

    Комментировать
  • 1
    A7

    Решение администратора частично верное.

    Но параметр 'EXISTS' здесь лишний, достаточно только ключа. При добавлении или удалении миниатюры ключ '_thumbnail_id' соответственно добавляется или удаляется с БД, а не очищается. И даже в случае ручного очищения значения ключа из БД, запись все равно попадет в результаты независимо от наличия или отсутствия параметра 'EXISTS', потому, что сама запись существует в БД.

    Другое важное замечание – для удаления миниатюры в админке при редактировании записи не нужно нажимать кнопку «Сохранить», удаление происходит мгновенно без необходимости подтверждения или сохранения изменений. А значит можно случайно удалить миниатюру записи. Но при этом могут и скорее всего останутся фото, которые были загружены к этой записи. В результате, запись с изображениями, но без миниатюры, не попадет в результаты.

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

    1. Получить массив ID постов.

    2. Отфильтровать все прикрепленные и только прикрепленные фото по массиву ID постов више, после чего получить массив ID своих постов, к которым они прикреплены (post_parrent).

    3. В get_posts или WP Query (кому как удобней) добавить критерий поиска постов 'post__in' => наш масив из 2-го пункта'.

    В результате мы получим действительно только те записи, которые содержат изображения, даже если миниатюра не установлена, и даже если процесс сохранения записи миниатюры в БД изменится с будущими обновлениями 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

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.