我需要过滤WooCommerce商店页面,只想显示需要自定义产品元数据的产品。这是我在archive-product.php
中找到的:
/**
* Hook: woocommerce_before_shop_loop.
*
* @hooked wc_print_notices - 10
* @hooked woocommerce_result_count - 20
* @hooked woocommerce_catalog_ordering - 30
*/
do_action( 'woocommerce_before_shop_loop' );
woocommerce_product_loop_start();
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
/**
* Hook: woocommerce_shop_loop.
*
* @hooked WC_Structured_Data::generate_product_data() - 10
*/
do_action( 'woocommerce_shop_loop' );
wc_get_template_part( 'content', 'product' );
}
}
woocommerce_product_loop_end();
那么如何在这部分中传递过滤器值以仅显示具有元键X和值Y的产品?
更新
我已经按照Loic所说的方法进行了尝试,但是当我检查了一个以上的meta值时,就会引起问题,并且看不到任何产品:
add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
// Only on shop pages
if( ! is_shop() ) return $meta_query;
$meta_query[] = array(
'key' => '_the_meta_key',
'value' => 'the_value',
'compare' => 'EXIST'
);
//Don't works when adding the second one
$meta_query[] = array(
'key' => '_the_meta_key',
'value' => 'the_value_2',
'compare' => 'EXIST'
);
return $meta_query;
};
我有两种产品:
the_value_2
the_value
所以我期望这里有这两种产品。当我删除第二个meta_query
时,我只会得到产品B。
答案 0 :(得分:2)
您可以使用连接在woocommerce_product_query_meta_query
过滤器挂钩中的自定义函数,您将在下面的代码中将_the_meta_key
替换为目标meta_key
:
add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
// Only on shop pages
if( ! is_shop() ) return $meta_query;
$meta_query[] = array(
'key' => '_the_meta_key',
'compare' => 'EXIST'
);
return $meta_query;
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试和工作。
添加项(与您的最后评论相关):
要使其适用于多个元值,您需要使用 'compare' => 'IN'
,例如:
add_filter( 'woocommerce_product_query_meta_query', 'show_only_products_with_specific_metakey', 10, 2 );
function show_only_products_with_specific_metakey( $meta_query, $query ) {
// Only on shop pages
if( ! is_shop() ) return $meta_query;
$meta_query[] = array(
'key' => '_the_meta_key',
'value' => array('L','XL'),
'compare' => 'IN'
);
return $meta_query;
}
代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试和工作。
答案 1 :(得分:0)
您可以使用do_action( 'woocommerce_shop_loop' );
function ctm_loop_53631963(){
global $post;
$meta = get_post_meta($post->ID, 'meta_value_key')
if($meta !== 'desired_value'){
continue;
}
}
do_action('woocommerce_shop_loop', 'ctm_loop_53631963');
详细了解wordpress操作Plugin API/Action Reference