从 Woocommerce 商店页面中的特定自定义元数据中过滤产品
Posted
技术标签:
【中文标题】从 Woocommerce 商店页面中的特定自定义元数据中过滤产品【英文标题】:Filter products from a specific custom meta data in Woocommerce shop page 【发布时间】:2019-05-06 23:27:52 【问题描述】:我需要过滤 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 所说的方式进行了尝试,但是当我检查多个元值时,它会导致问题并且我看不到任何产品:
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;
;
我有两种产品:
产品 A -> 有the_value_2
产品 B -> 有 the_value
所以我期待这两种产品。当我删除第二个 meta_query
时,我只得到产品 B。
【问题讨论】:
是什么意思?问题不清楚 那么如何在这部分中传递过滤器值以仅显示具有元键 X 和值 Y 的产品? 【参考方案1】:你可以使用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
【讨论】:
不要这样工作。试过了,还是不行。【参考方案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' => 'EXISTS'
);
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 文件中。经过测试和工作。
WP meta_query documentation
【讨论】:
有没有办法直接在存档产品文件中做到这一点?因为我在我的模板中使用它并用很多功能覆盖它,但我没有得到这部分。所以非常感谢你的帮助,但如果你能告诉我直接在文件中做这件事的方法会更有帮助。非常感谢! @Mr.Jo 这是关于 WC_Query / WP_Query 的,所以我看不出如何在此模板中操作循环。请记住,模板对于在 html 结构输出或代码中进行更改时非常有用。 我对此有疑问。我正在尝试在这里检查多个值,例如获取具有元值 L 和 XL 的产品。但看起来这不适用于两个值,因为当我创建第二个 meta_query 时它不起作用。以上是关于从 Woocommerce 商店页面中的特定自定义元数据中过滤产品的主要内容,如果未能解决你的问题,请参考以下文章
通过 WooCommerce 产品设置中的自定义复选框将类添加到 WooCommerce 页面
在Woocommerce中为特定产品类别使用自定义单一产品模板
php [WooCommerce Core]从商店页面上的特定类别中排除产品