Welcartの商品一覧ページで在庫がない商品を非表示にする方法

前回発送日目安やポイント率などでの商品の絞り込み方法の紹介をしました

今回は、商品のSKUに紐づいている在庫状態や売価(商品価格)などで絞り込む方法を紹介します

  • WordPressのバージョン6.5.3
  • Welcartのバージョン 2.10.3

在庫状態での絞り込みサンプルコード

function change_posts_per_page($query)
{
	/* 管理画面,メインクエリに干渉しないために必須 */
	if (is_admin() || !$query->is_main_query()) {
		return;
	} else {
	}
	if ($query->is_home() || $query->is_category()) {
		global $wpdb;
		add_filter('posts_join', function ($join) use ($wpdb) {
			return $join . " LEFT JOIN {$wpdb->prefix}usces_skus ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}usces_skus.post_id";
		});
		add_filter('posts_where', function ($where) use ($wpdb) {
			return $where . " AND ({$wpdb->prefix}usces_skus.stock = 0 OR {$wpdb->prefix}usces_skus.stock = 1)";
		});
		// 重複投稿を防ぐためにDISTINCTを追加
		add_filter('posts_distinct', function ($distinct) {
			return 'DISTINCT';
		});
		return;
	}
}
add_action('pre_get_posts', 'change_posts_per_page');

Welcartは在庫状態は5つの状態を選択できるため在庫あり、在庫僅少のSKUがある商品のみ一覧ページで表示させています

SKUにはその他に在庫数も設定できるため、絞り込み条件にそちらを使用してもいいかもしれませんね!

その場合はstockをstocknumに変更してください

商品のSKUの中で一つでも在庫があればtrueを返すusces_have_zaiko_anyone()という関数もありますが、こちらを使用した場合は1ページの表示数が非表示にした商品分だけ少なくなるため注意が必要です

while ($the_query->have_posts()) :
	$the_query->the_post();
	usces_remove_filter();
	usces_the_item();
	usces_have_skus();
	if (usces_have_zaiko_anyone()) :
		the_title();
	endif;
endwhile;
wp_reset_postdata(); 

在庫なしの商品のみを出力したい場合

在庫無しの商品のみを絞り込みたい場合は、商品に含まれるSKUの在庫状態がすべて在庫なしかどうかを判定する必要があります

function change_posts_per_page($query)
{
	/* 管理画面,メインクエリに干渉しないために必須 */
	if (is_admin() || !$query->is_main_query()) {
		return;
	} else {
	}
	if ($query->is_home() || $query->is_category()) {
		global $wpdb;
		add_filter('posts_join', function ($join) use ($wpdb) {
			return $join . " LEFT JOIN {$wpdb->prefix}usces_skus ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}usces_skus.post_id";
		});
		add_filter('posts_where', function ($where) use ($wpdb) {
			$subquery = "
						SELECT post_id 
						FROM {$wpdb->prefix}usces_skus 
						GROUP BY post_id 
						HAVING SUM(CASE WHEN stock IN (2, 3, 4) THEN 1 ELSE 0 END) = COUNT(*) 
				";
			return $where . " AND {$wpdb->prefix}posts.ID IN ({$subquery})";
		});
		// 重複投稿を防ぐためにDISTINCTを追加
		add_filter('posts_distinct', function ($distinct) {
			return 'DISTINCT';
		});
		return;
	}
}
add_action('pre_get_posts', 'change_posts_per_page');

商品価格で絞り込みを行うサンプルコード

function change_posts_per_page($query)
{
	/* 管理画面,メインクエリに干渉しないために必須 */
	if (is_admin() || !$query->is_main_query()) {
		return;
	} else {
	}
	if ($query->is_home() || $query->is_category()) {
		global $wpdb;
		add_filter('posts_join', function ($join) use ($wpdb) {
			return $join . " LEFT JOIN {$wpdb->prefix}usces_skus ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}usces_skus.post_id";
		});
		add_filter('posts_where', function ($where) use ($wpdb) {
			return $where . " AND ({$wpdb->prefix}usces_skus.price > 5000)";
		});
		// 重複投稿を防ぐためにDISTINCTを追加
		add_filter('posts_distinct', function ($distinct) {
			return 'DISTINCT';
		});
		return;
	}
}
add_action('pre_get_posts', 'change_posts_per_page');

売価が5000円超のSKUを含む商品のみを表示するコードです

商品が持つすべてのSKUにおいて5000円超という条件にする場合はカスタマイズが必要です

ブログ一覧へ