web-dev-qa-db-ja.com

Woocommerceの最後に在庫切れの商品を表示する

WordPressのカテゴリまたはページの最後に在庫切れの商品を表示することはできますか?

そのため、顧客は最初に利用可能な製品を確認し、その後、在庫切れの製品を確認します。

13
RaGu

WooCommerceの在庫管理のグローバル構成オプションにアクセスし、WordPress adminの左側を見て、WooCommerce、[設定]、[在庫]タブの順にクリックします。

この「在庫切れの可視性」が見つかります

在庫切れの可視性-このチェックボックスを使用すると、WooCommerceカタログ内の在庫アイテムを非表示にするかどうかを決定できます。

http://www.inmotionhosting.com/support/website/woocommerce/managing-inventory-in-woocommerce

それらをカテゴリの最後に表示するには、pre_get_postsを使用して在庫に基づいて注文できますが、そうすると、他の並べ替えが失われます。

3
Ankita

これは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 ASCistockstatus.meta_value DESCに変更できます。

WPでテスト済み:4.8; WC 3.0.8

12
DACrosby

これは、製品を再配置するためのスニペットです(在庫が最初に来ます):

<?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

3
Viktor Lavron

これが最善の解決策です。

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 );
2
Dan

このコードは私のために働きます:

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' );
        }
    }
});
1
Mario62RUS

このコードを試してください(テーマの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

0
Bogdan