【问题标题】:WP_Query issue when trying to get out of stock products in WooCommerce尝试在 WooCommerce 中缺货产品时出现 WP_Query 问题
【发布时间】:2021-02-04 00:45:24
【问题描述】:

我正在使用简码在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 的已售产品。

【问题讨论】:

    标签: php wordpress woocommerce product shortcode


    【解决方案1】:

    更新 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 文件中。经过测试并且可以工作。

    相关:Hide "out of stock" products with custom meta data In 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 文件中。经过测试并且可以工作。

    【讨论】:

    • 谢谢!我都试过了。不幸的是,同样的错误仍然存​​在......
    • @Cinder 我尝试了你的代码和我的代码,我没有任何错误(店面主题的最后一个 WooCommerce 版本),所以还有其他问题,可能是其他代码,插件甚至是您的主题。
    • @Cinder 再次更新 ...我已经稍微更新了我的代码...你可以再试一次,看看这是否能解决问题?
    • 再次感谢!它仍然无法正常工作,我尝试了您的两个更新版本。我还有一段代码可以隐藏 WooCommerce 售罄的产品。我会将它添加到我的初始帖子中以供参考,因为如果我删除此代码,你和我的工作。所以它必须是这样。
    • 我从您的上一个代码中收到“意外如果”错误。如果我在show_only_instock_products 之前添加“功能”,错误就消失了。但它不会隐藏商店中的缺货商品。所以我可能仍然做错了什么。我会努力弄清楚的。谢谢你的帮助!
    猜你喜欢
    • 2014-08-20
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2012-09-02
    • 1970-01-01
    • 2014-08-29
    • 2021-10-10
    相关资源
    最近更新 更多