WP_Query 尝试在 WooCommerce 中获取缺货产品时出现问题
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
要获取缺货产品,您也可以使用:
- 一个
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 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 文件。已测试并有效。
我正在使用短代码在 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
要获取缺货产品,您也可以使用:
- 一个
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 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 文件。已测试并有效。