如何在 WooCommerce 中将自定义元字段附加为简码参数值

How to append a custom meta field as a shortcode argument value in WooCommerce

我创建了一个自定义复选框字段 _is_group,我希望能够在 [products...] 简码中使用它。

当前使用的解决方法是,我首先使用 wc_get_products() 创建查询,然后将返回的 IDs 传递给标准简码,使用 implode() 函数:

$group = wc_get_products([
    'post_type'     => 'product',
    'meta_key'      => '_is_group',
    'meta_value'    => 'yes',
    'meta_compare'  => 'IN',
    'return'        => 'ids'
]);

echo do_shortcode('[products ids="' . implode(',', $group) . '"]');

当然可以,但它看起来很丑,不必要地进行了两个数据库查询而不是一个。我认为有更好的方法来处理它,比如:

[products columns="3" is_group="yes"]

所以我决定询问如何将自定义元字段附加为 Woocommerce 中的简码参数值。也许解决方案是使用 woocommerce_shortcode_products_query 或其他方式?

注意:我见过其他类似的问题和解决方案,例如在另一个短代码中使用自定义短代码,但这并不能解决问题。我关心优化

您需要两个部分:

  1. 支持您自己的 [products] 简码属性。

// Add your own attribute
function filter_shortcode_atts_products( $out, $pairs, $atts, $shortcode ) {
    // Isset and equal to yes
    if ( isset ( $atts['is_group'] ) && $atts['is_group'] == 'yes' ) {
        $out['is_group'] = true;
    } else {
        $out['is_group'] = false;
    }
    
    return $out;
}
add_filter( 'shortcode_atts_products', 'filter_shortcode_atts_products', 10, 4 );
  1. 修改查询以使用您的 $query_args
// Modify the query args 
function filter_woocommerce_shortcode_products_query( $query_args, $atts, $type ) {
    // Target
    if ( $type == 'products' && $atts['is_group'] ) {
        // Meta query       
        $query_args['meta_query'] = array(
            array(
                'key'     => '_is_group',
                'value'   => 'yes',
                'compare' => 'IN',
            )
        );
    }

    return $query_args;
}
add_filter( 'woocommerce_shortcode_products_query', 'filter_woocommerce_shortcode_products_query', 10, 3 );

SHORTCODE USAGE

In an existing page:

[products columns="3" is_group="yes"]

Or in PHP:

echo do_shortcode('[products columns="3" is_group="yes"]');