Иногда нужно вывести все записи в которых отсутствуют миниатюры. Например, для интернет-магазина с множеством товаров. Сделаем это!
Создаем страницу вывода
Создадим шаблон страницы none-img.php, вначале обязательно прописываем название шаблона:
<?php /*Template Name: Записи без миниатюр*/ ?>
После этого создаем страницу Записи без миниатюр и выбираем шаблон Записи без миниатюр (который мы создали).
Вывод записей без миниатюр
Фактически мы выводим все записи интересующего нас типа и после этого прогоняем через условие Есть ли миниатюра? и если миниатюры нет — выводим заголовок с ссылкой на запись
<?php global $post; $args = array( 'posts_per_page' => -1, 'post_type' => array('post','city') ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <?php if( !has_post_thumbnail() ): ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endif; ?> <?php endforeach; ?> <?php wp_reset_postdata() ?>
В данном примере мы запрашиваем типы записей: post (стандартный тип) и city (пользовательский тип).
Если нужно проверять только один тип записи, то можно прописать так: ‘post_type’ => ‘product’ (для товаров woocommerce).
Если нужно проверять стандартные записи, можно это строку вообще убрать..
Счетчик записей
Посчитать записи можно так:
<?php global $post; $args = array( 'posts_per_page' => -1, 'post_type' => 'product' ); $myposts = get_posts( $args ); $i = 0; //начальный показатель счетчика foreach( $myposts as $post ) : setup_postdata($post); ?> <?php if( !has_post_thumbnail() ): ?> <?php $i++; //добавляем +1 к счетчику ?> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <?php endif; ?> <?php endforeach; ?> Всего <?php echo $i; //выводим показания счетчика ?> записей без миниатюры. <?php wp_reset_postdata() ?>
Бонус: Выводим товары без категорий
Если нам нужно вывести все товары которым не назначена категория, то запрос будет следующим:
<?php global $post; $terms = get_terms( 'product_cat', array('hide_empty' => 0) ); foreach( $terms as $term ) { $termsids[] = $term->term_id; //Создаем массив } $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $termsids, 'operator' => 'NOT IN' ), ) ); $myposts = get_posts( $args ); $i = 0; foreach( $myposts as $post ) : setup_postdata($post); ?> <?php $i++; ?> <h5><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h5> <?php endforeach; ?> Всего <?php echo $i; ?> записей без категории. <?php wp_reset_postdata() ?>
Существует еще один более простой способ обнаружения товаров без категорий: В админке в меню Товары у каждого товара есть колонка Категория, если она не заполнена то категория данному товару не назначена. Более того товары без категории можно отфильтровать: в самом низу списка категорий есть строка Без категорий.
Оставляем на сайте только определенные категории
Небольшая предыстория: синхронизировали сайт с 1С, но из 6500 наименований, на сайте должны были отображаться лишь 350).
// Выводим только определенные группы товаров function custom_pre_get_posts_query( $q ) { if( !is_admin() ) { global $post; $terms = array(132,133,141,135,136,137,138,78); $tax_query = (array) $q->get( 'tax_query' ); $tax_query[] = array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $terms, 'operator' => 'IN' ); $meta_query[] = array( 'key' => '_stock_status', 'value' => 'instock' ); $q->set( 'tax_query', $tax_query ); $q->set( 'meta_query', $meta_query ); } } add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' );
$terms — массив необходимых категорий товаров.
Также в этом решении указано выводить только товары со статусом наличия instock, потому как у части товара статус был onbackorder. Статус onbackorder загадочным образом приходил из 1С, и массовое изменение статуса его не меняло. При этом onbackorder был только некоторых товаров, наличие у которых было равно 0, поэтому я решил вовсе их не выводить.