更改Woocommerce短代码上的产品元查询

时间:2018-12-20 18:40:40

标签: php wordpress woocommerce shortcode hook-woocommerce

我在woocommerce商店工作,我必须在其中显示具有自定义位置价值的产品。产品属于任何位置。我已经完成了将近50%的插件,商店页面上的产品正在完全过滤,但是功能产品,销售产品,最新产品等未得到过滤,因为它们是从woocommerce产品简码生成的。

到目前为止,我已在管理产品页面中添加了一个自定义文件,并在商店页面的前端显示了过滤器产品。现在,我想从简码中过滤产品。

我在以下管理站点的产品信息页中添加了自定义文件,其代码为:

/* adding custom product field: location */ 
function add_custom_product_text_filed(){
global $woocommerce, $post;

$locatons = array('all' => 'All');
$locations_posts = get_posts(array('post_type' => 'location', 'numberposts' => -1));
foreach ($locations_posts as $loc_post) {
    $locatons[$loc_post->ID] = $loc_post->post_title;
}

echo '<div class="options_group">';

woocommerce_wp_select(
    array(
        'id' => '_location',
        'label' => __('Location'),
        'desc_tip' => true,
        'description'   => __('Enter the product location here'),
        'options' => $locatons,
    )
);
echo '</div>';
}

以下是根据位置显示产品的代码

/*Get Location Based Products*/
add_action( 'woocommerce_product_query', 'location_products' );
function location_products($q){
if (isset($_COOKIE['wc_location_product_id']) && !empty($_COOKIE['wc_location_product_id']) && !is_null($_COOKIE['wc_location_product_id']) && $_COOKIE['wc_location_product_id'] != 'all') {
    $meta_query = $q->get('meta_query');
    $meta_query[] = array(
        'key' => '_location',
        'value' => $_COOKIE['wc_location_product_id'],
        'compare' => '=',
    );
    $q->set('meta_query', $meta_query);
}
}

现在,我想根据位置自定义文件更改woocommerce产品简码(销售产品,功能产品,最新产品等)的工作方式,因为页面生成程序使用简码来显示产品,但是我不知道该怎么做更改简码功能的方式。是否有任何钩子或筛选器可以完成此任务,或者有任何示例可以说明如何执行此操作。感谢您的帮助。 谢谢。

1 个答案:

答案 0 :(得分:1)

以下使用woocommerce_shortcode_products_query专用过滤器挂钩的代码允许更改Woocommerce短代码上的产品查询:

add_filter( 'woocommerce_shortcode_products_query', 'shortcode_products_query_on_location', 10, 3 );
function shortcode_products_query_on_location( $query_args, $atts, $loop_name ){
    if (isset($_COOKIE['wc_location_product_id']) && !empty($_COOKIE['wc_location_product_id']) && !is_null($_COOKIE['wc_location_product_id']) && $_COOKIE['wc_location_product_id'] != 'all') {

        $query_args['meta_query'] = array( array(
            'key'     => '_location',
            'value'   => $_COOKIE['wc_location_product_id'],
            'compare' => '=',
        ) );
    }
    return $query_args;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。应该可以。