Иногда нужно вывести все записи в которых отсутствуют миниатюры. Например, для интернет-магазина с множеством товаров. Сделаем это!
Создаем страницу вывода
Создадим шаблон страницы 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, поэтому я решил вовсе их не выводить.
