从Woocommerce商店页面中的特定自定义元数据过滤产品

时间:2018-12-05 11:44:07

标签: php wordpress woocommerce metadata product

我需要过滤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;
};

我有两种产品:

  • 产品A->具有the_value_2
  • 产品B->具有the_value

所以我期望这里有这两种产品。当我删除第二个meta_query时,我只会得到产品B。

2 个答案:

答案 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文件中。经过测试和工作。

WP meta_query documentation

答案 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