如何在短代码中将多个自定义字段添加到 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
}
}
}
在短代码中,我可以通过自定义字段值限制 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
}
}
}