如何在短代码中将多个自定义字段添加到 wp_query?

How to add multiple custom fields to a wp_query in a shortcode?

在短代码中,我可以通过自定义字段值限制 wp_query 结果。

示例:

[my-shortcode meta_key=my-custom-field meta_value=100,200 meta_compare='IN']

显然可以在 wp_query 中使用多个自定义字段,例如 WP_Query#Custom_Field_Parameters

但是如何在简码中使用多个自定义字段?目前我确实通过 $atts.

传递了所有简码参数

一些不同的解决方案之一可能是对元值使用 JSON 编码格式。请注意,这并不完全是用户友好的,但肯定会完成您想要的。

您当然需要先生成 json 编码值并确保它们的格式正确。一种方法是使用 PHP 的内置函数:

// Set up your array of values, then json_encode them with PHP
$values = array(
    array('key' => 'my_key',
        'value' => 'my_value',
        'operator'  => 'IN'
    ),
    array('key' => 'other_key',
        'value' => 'other_value',
    )
);

echo json_encode($values);
// outputs: [{"key":"my_key","value":"my_value","operator":"IN"},{"key":"other_key","value":"other_value"}]

短代码中的示例用法:

[my-shortcode meta='[{"key":"my_key","value":"my_value","operator":"IN"},{"key":"other_key","value":"other_value"}]']

然后你会在你的简码函数中解析出来,像这样:

function my_shortcode($atts ) {
    $meta = $atts['meta'];
    // decode it "quietly" so no errors thrown
    $meta = @json_decode( $meta );
    // check if $meta set in case it wasn't set or json encoded proper
    if ( $meta && is_array( $meta ) ) {
        foreach($meta AS $m) {
            $key = $m->key;
            $value = $m->value;
            $op = ( ! empty($m->operator) ) ? $m->operator : '';

            // put key, value, op into your meta query here....
        }
    }
}

替代方法
另一种方法是使您的短代码接受任意数量的短代码,并具有匹配的数字索引,如下所示:

[my-shortcode meta-key1="my_key" meta-value1="my_value" meta-op1="IN
    meta-key2="other_key" meta-value2="other_value"]

然后,在您的短代码函数中,"watch" 这些值并自己将它们粘起来:

function my_shortcode( $atts ) {
    foreach( $atts AS $name => $value ) {
        if ( stripos($name, 'meta-key') === 0 ) {
            $id = str_ireplace('meta-key', '', $name);
            $key = $value;
            $value = (isset($atts['meta-value' . $id])) ? $atts['meta-value' . $id] : '';
            $op = (isset($atts['meta-op' . $id])) ? $atts['meta-op' . $id] : '';

            // use $key, $value, and $op as needed in your meta query

        }
    }
}