从 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 仅使用 css 定位商店页面

通过 WooCommerce 产品设置中的自定义复选框将类添加到 WooCommerce 页面

在Woocommerce中为特定产品类别使用自定义单一产品模板

php [WooCommerce Core]从商店页面上的特定类别中排除产品

php [WooCommerce Core]从商店页面上的特定类别中排除产品

单个产品页面上的 Woocommerce 钩子溢出