gpt4 book ai didi

php - WooCommerce 按 id 从循环中删除产品

转载 作者:行者123 更新时间:2023-12-05 07:42:30 27 4
gpt4 key购买 nike

如果任何变体缺货,我会尝试在循环中隐藏 woocommerce 产品。

到目前为止我尝试了什么

1:获取当前登录用户的“地区”2:获取所有产品变体的列表,这些变体是要对照用户区域检查的区域。3:运行检查,如果匹配则隐藏产品4:从循环中排除产品

任何煽动将不胜感激。

function tm_remove_product_stock_region($query) {

$product_variable = new WC_Product_Variable();
$product_variations = $product_variable->get_available_variations();

/** Get users region. */
$user_region = tm_get_user_region();

$post__in = array();

foreach ( $product_variations as $variation ) {

/** Get products regions. */
$product_region = $variation['attributes']['attribute_pa_regions'];

if ($user_region === $product_region && !$variation->is_in_stock()) {


$post__in[] = $variation['product_id'];

add_filter('woocommerce_product_is_visible', function($is_visible, $id) {
$is_visible = false;
return $is_visible;
}, 10,2);


} else if ($user_region === $product_region && $variation->is_in_stock()) {

$post__in[] = $variation['product_id'];


add_filter('woocommerce_product_is_visible', function($is_visible, $id) {
$is_visible = true;
return $is_visible;
}, 10,2);


}

}

if(is_array($post__in) && $post__in != null){
$query->set('post__in', $post__in);
}

return $query;

}

add_action('pre_get_posts', 'tm_remove_product_stock_region', 10, 2);

更新 2:

我更新了上面的内容并让它工作,但是 woocommerce_product_is_visible 过滤器只适用于类别存档页面,注释被过滤用于搜索页面或者当 WP_Query 在自定义页面上使用时,这真是一种耻辱。这也是 woocommerce 的 $is_visible 不能与 pre_get_posts 一起使用的原因

Function tm_remove_product_stock_region($is_visible, $id) {

$product = wc_get_product(get_the_ID());

$product_variable = new WC_Product_Variable(get_the_ID());
$product_variations = $product_variable->get_available_variations();

/** Get users region. */
$user_region = tm_get_user_region();

foreach ($product_variations as $variation) {

/** Get products regions. */
$product_region = $variation['attributes']['attribute_pa_regions'];

if (!$product->is_in_stock() && $user_region === $product_region) {

$is_visible = false;
return $is_visible;

}

else if ($product->is_in_stock() && $user_region === $product_region) {

$is_visible = true;
return $is_visible;

}
}

}

add_filter('woocommerce_product_is_visible', 'tm_remove_product_stock_region', 10,2);

更新 3:

经过几个小时的摆弄,我才注意到两个函数中的 $product_variable 返回一组不同的结果,即使用“woocommerce_product_is_visible”返回产品父 ID,但使用“pre_get_posts”它是变体ID。

所以我没有得到我想要的结果并且 pre_get_posts 失败了,这是我实际需要工作的,我仍然没有解决这个问题。

最佳答案

你需要在循环前设置meta_query,

function tm_remove_product_stock_region($query) {
$query->set( 'meta_query', array(array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => 'NOT IN'
)));
return $query;

}
add_action('pre_get_posts', 'tm_remove_product_stock_region');

关于php - WooCommerce 按 id 从循环中删除产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com