Global filter not working

时间:2017-05-26 作者:Chuck Norris

我编写了一个函数,如果满足某些需求,它会隐藏产品可见性,如果我使用以下过滤器,它就会工作。

add_filter(\'woocommerce_product_is_visible\', \'tm_remove_product_stock_region\', 10,2);
以上是可以的,但当我尝试使用以下方法全局应用我的过滤器时,使用WP\\u Query是行不通的。

add_action(\'pre_get_posts\', \'tm_remove_product_stock_region\');
我发现以下两个错误:“注意:未定义变量:product\\u id”,“警告:缺少参数2”

我就是想不出问题出在哪里。

function tm_remove_product_stock_region($query) {    

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

    foreach ( $product_variations as $variation ) {

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

        /** Get products regions. */
        $product_region = $variation[\'attributes\'][\'attribute_pa_regions\'];
        if ( $user_region === $product_region && ! $variation[\'is_in_stock\'] ) {

        /** Show product */
        $meta_query = array(
            \'key\' => \'_visibility\',
            \'value\' => \'visible\',
            \'compare\' => \'=\'
         );

        $query->set(\'meta_query\', $meta_query);

        }
        else if ( $user_region === $product_region && $variation[\'is_in_stock\'] ) {

         /** Hide product */
        $meta_query = array(
            \'key\' => \'_visibility\',
            \'value\' => \'hidden\',
            \'compare\' => \'=\'
         );

        $query->set(\'meta_query\', $meta_query);

        }
    }

   return $query;

}

//Look into apply_filter
add_action(\'pre_get_posts\', \'tm_remove_product_stock_region\');

1 个回复
最合适的回答,由SO网友:Benoti 整理而成

这并不是pre\\u get\\u帖子的工作原理。您发送给函数的原始参数不好。

唯一需要的是$查询。

您的解决方法是在pre\\u get\\u posts函数中运行函数,返回与要包含的变体相对应的post\\u ID数组,然后在pre\\u get\\u posts函数中,您需要$query->set 论点,像这样(这只是一个例子,你必须找到正确的):

$query->set(\'post__in\', $include_products);
return $query; // at the end of the function
您可以阅读有关该操作的更多信息here

UPDATE关于meta\\u query参数(也包括tax\\u query…):它总是必须是一个数组的数组才能启用不同meta\\u键之间的任何关系,因此,您的代码需要,

$query->set(\'meta_query\', array($meta_query) );
或者以另一种方式将数组的数组直接嵌入$meta_query

$meta_query = array(
    array(
        \'key\' => \'_visibility\',
        \'value\' => \'visible\',
        \'compare\' => \'=\'
     )
);
更新2

您可以使用WP_Query post__in 参数,但我不知道它是否会起作用,因为它将取决于额外的woocommerce筛选器和隐藏产品的操作,在这种情况下,您可以尝试不同的pre\\u get\\u posts操作优先级:

function tm_remove_product_stock_region($query) {

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

// you don\'t need to run the function in the loop, the user_region is always the same
/** 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\'];

    }
    else if ( $user_region === $product_region && $variation[\'is_in_stock\'] ) {

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

    }

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

}

//Look into apply_filter
add_action(\'pre_get_posts\', \'tm_remove_product_stock_region\');
希望有帮助!

结束