WordPressのカテゴリまたはページの最後に在庫切れの商品を表示することはできますか?
そのため、顧客は最初に利用可能な製品を確認し、その後、在庫切れの製品を確認します。
WooCommerceの在庫管理のグローバル構成オプションにアクセスし、WordPress adminの左側を見て、WooCommerce、[設定]、[在庫]タブの順にクリックします。
この「在庫切れの可視性」が見つかります
在庫切れの可視性-このチェックボックスを使用すると、WooCommerceカタログ内の在庫アイテムを非表示にするかどうかを決定できます。
http://www.inmotionhosting.com/support/website/woocommerce/managing-inventory-in-woocommerce
それらをカテゴリの最後に表示するには、pre_get_postsを使用して在庫に基づいて注文できますが、そうすると、他の並べ替えが失われます。
これはViktor&Bogdanの答えと同じですが、追加のクラスコードはありません。
post_clause
フィルターを使用して製品クエリを変更します。クエリのwp_postmetaテーブルをJOIN
し、既存のクエリの前にorderby _stock_status
句を追加します。このようにして、他のorderby
句もクエリに残ります。
add_filter('posts_clauses', 'order_by_stock_status');
function order_by_stock_status($posts_clauses) {
global $wpdb;
// only change query on WooCommerce loops
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) {
$posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
}
return $posts_clauses;
}
何らかの理由で最初に在庫切れのアイテムが必要な場合は、istockstatus.meta_value ASC
をistockstatus.meta_value DESC
に変更できます。
WPでテスト済み:4.8; WC 3.0.8
これは、製品を再配置するためのスニペットです(在庫が最初に来ます):
<?php
/**
* Order product collections by stock status, instock products first.
*/
class iWC_Orderby_Stock_Status
{
public function __construct()
{
// Check if WooCommerce is active
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);
}
}
public function order_by_stock_status($posts_clauses)
{
global $wpdb;
// only change query on WooCommerce loops
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
$posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
}
return $posts_clauses;
}
}
new iWC_Orderby_Stock_Status;
?>
https://www.snip2code.com/Snippet/114858/WooCommerce-Products-Order-by-Stock-Stat
これが最善の解決策です。
add_action( 'pre_get_posts', function ( $q ) {
if ( !is_admin() // Target only front end
&& $q->is_main_query() // Only target the main query
&& $q->is_post_type_archive() // Change to suite your needs
) {
$q->set( 'meta_key', '_stock_status' );
$q->set( 'orderby', 'meta_value' );
$q->set( 'order', 'ASC' );
}
}, PHP_INT_MAX );
このコードは私のために働きます:
add_action( 'pre_get_posts', function( $query ) {
if ( $query->is_main_query() && is_woocommerce() && ( is_shop() || is_product_category() || is_product_tag() ) ) {
if( $query->get( 'orderby' ) == 'menu_order title' ) { // only change default sorting
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_key', '_stock_status' );
}
}
});
このコードを試してください(テーマのfunctions.phpを入力してください):
class iWC_Orderby_Stock_Status {
public function __construct() {
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);
}
}
public function order_by_stock_status($posts_clauses) {
global $wpdb;
if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
$posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
$posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
$posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
}
return $posts_clauses;
}
}
new iWC_Orderby_Stock_Status;
撮影 ここ 。
WooCommerceの最新バージョンについては、以下の回答を参照してください: https://stackoverflow.com/a/44597448/3925099