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

时间:2016-02-24 17:56:06

标签: wordpress shortcode wp-query

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

示例:

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

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

但是如何在短信中使用多个自定义字段?目前,我使用$atts传递了所有短代码参数。

1 个答案:

答案 0 :(得分:0)

在一些不同的解决方案上可能是使用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"]

然后,在您的短代码功能中,"观看"对于这些价值并自己粘合它们:

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

        }
    }
}