簡體   English   中英

嘗試在 WooCommerce 中脫銷產品時出現 WP_Query 問題

[英]WP_Query issue when trying to get out of stock products in WooCommerce

我正在使用簡碼在WordPress頁面上顯示所有售罄的WooCommerce項目。 它工作正常,除了拋出錯誤:

Warning: array_filter() expects parameter 1 to be array, null given in C:\xampp\htdocs\wordpress_4\wp-content\plugins\woocommerce\includes\class-wc-query.php on line 688

我認為這意味着array_filter()需要一個數組,但是我的functions.php的以下代碼給出了null

add_shortcode( 'out_of_stock_products', 'show_out_of_stock_products_shortcode' );
  
function show_out_of_stock_products_shortcode() {

    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            )
        ),
        'fields' => 'ids',
    );
    
    $product_ids = get_posts( $args ); 
    $product_ids = implode( ",", $product_ids );
    
    return do_shortcode("[products ids='$product_ids']");
}

簡碼: [out_of_stock_products]

這是WooCommerce函數,它需要數組但被賦予null

public function get_meta_query( $meta_query = array(), $main_query = false ) {
    if ( ! is_array( $meta_query ) ) {
        $meta_query = array();
    }
    return array_filter( apply_filters( 'woocommerce_product_query_meta_query', $meta_query, $this ) ); //line 688
}

我不知道如何解決這個問題。 也許有更好的方式來展示售罄的產品,盡管我喜歡這個版本。

誰能幫我解決這個問題?

來源: https : //www.businessbloomer.com/woocommerce-display-stock-products-shortcode/

編輯:

正如@LoicTheAztec 所建議的,除了上面發布的代碼之外,還有一些代碼是負責的:

add_filter( 'woocommerce_product_query_meta_query', 'show_only_instock_products', 10, 2 );

show_only_instock_products( $meta_query, $query ) {
    if (  is_woocommerce() ) {
        $meta_query[] = array(
            'key'     => '_stock_status',
            'value'   => 'outofstock',
            'compare' => '!='
        );
        return $meta_query;
    }
}

我正在使用它來隱藏WooCommerce已售出的產品。

更新 2

要獲得缺貨的產品,您還可以使用:

  1. WC_Query使用wc_get_products()函數,如下所示:
add_shortcode( 'out_of_stock_products', 'show_out_of_stock_products_shortcode' );
function show_out_of_stock_products_shortcode() {

    $product_ids = (array) wc_get_products( array(
        'status'       => 'publish',
        'limit'        => -1,
        'stock_status' => 'outofstock',
        'return'       => 'ids',
    ) );

    $product_ids = empty($product_ids) ? '' : implode( ',', $product_ids );

    return empty($product_ids) ? '' : do_shortcode("[products ids='$product_ids']");
}

2)。 帶有稅務查詢的WP_Query ,例如:

add_shortcode( 'out_of_stock_products', 'show_out_of_stock_products_shortcode' );
function show_out_of_stock_products_shortcode() {

    $product_ids = (array) get_posts( array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'fields'         => 'ids',
        'tax_query' => array( array(
            'taxonomy' => 'product_visibility',
            'field'    => 'name',
            'terms'    => array('outofstock'),
        ) ),
    ) );

    $product_ids = empty($product_ids) ? '' : implode( ',', $product_ids );

    return empty($product_ids) ? '' : do_shortcode("[products ids='$product_ids']");
}

代碼位於活動子主題(或活動主題)的 functions.php 文件中。 測試和工作。

相關: 在 Woocommerce 中使用自定義元數據隱藏“缺貨”產品


另外:問題來自您的編輯(最后一個代碼)。

同樣從 WooCommerce 3 開始,您應該使用以下內容:

add_filter( 'woocommerce_product_query_tax_query', 'show_only_instock_products', 10, 2 );
show_only_instock_products( $tax_query, $query ) {
    if ( ! is_admin() ) {
        $tax_query[] = array(
            'taxonomy' => 'product_visibility',
            'field'    => 'name',
            'terms'    => array('outofstock'),
            'operator' => 'NOT IN'
        );
    }
    return $tax_query;
}

代碼位於活動子主題(或活動主題)的 functions.php 文件中。 測試和工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM