/ Wordpress / Выводим записи у которых нет миниатюры

Выводим записи у которых нет миниатюры

HIT

26.11.2016

2394

Иногда нужно вывести все записи в которых отсутствуют миниатюры. Например, для интернет-магазина с множеством товаров. Сделаем это!

Создаем страницу вывода

Создадим шаблон страницы 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).
Если нужно проверять стандартные записи, можно это строку вообще убрать..

Счетчик записей

Как посчитать количество записей без миниатюры. Стандартный способ echo count($myposts); не актуален, т.к. он покажет количество записей во всем массиве без проверки на наличие миниатюры

Посчитать записи можно так:

<?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, поэтому я решил вовсе их не выводить.

При данном способе корректировки вывода товаров перестает функционировать фильтр по цене
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Адаптивные изображения (атрибут srcset)

Адаптивные изображения (атрибут srcset)

Давно интересовал вопрос адаптивности изображений с помощью атрибута srcset. Как это работает и как правильно настроить. Пришло время это выяснить. Теория srcset В атрибуте srcset выводятся все варианты миниатюры и Читать далее »

Миниатюра — фон сайта

Миниатюра — фон сайта

Мы можем использовать миниатюру записи для самых разных целей. В данной статье рассмотрим вариант использовать миниатюру в виде фонового изображения сайта. Вывод миниатюры в виде фона В цикл вывода миниатюры Читать далее »

/
Атрибуты миниатюры

Атрибуты миниатюры

У миниатюры (thumbnail) есть служебная функция назначения атрибутов. Манипулируя атрибутами можно добиться интересных результатов. Фильтр wp_get_attachment_image_attributes распространяется на миниатюры, а также на вложенные изображения wp_get_attachment_image($image->ID, ‘rectangle’). Как сделать отложенную загрузку Читать далее »

Добавить комментарий

Пока нет комментариев. Будь первым!

Выводим записи у которых нет миниатюры
RSS-лента
Рекомендации для васRSS-лентаOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.