在 AJAX 后置过滤器中添加多个元键和值

Posted

技术标签:

【中文标题】在 AJAX 后置过滤器中添加多个元键和值【英文标题】:Add multiple meta key and value in AJAX post filter 【发布时间】:2016-12-26 13:27:56 【问题描述】:

我为自定义字段值创建了一个 AJAX 后置过滤器。此过滤器渲染数据迭代 JSON 并使用自定义内容模板。这段代码非常适合自定义字段 brandvalues..

现在我面临在函数中添加多个元键的问题,之后我将能够过滤多个自定义字段值。

如何在函数$args中添加多个key和value?

函数.php

add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');
function call_post()   
$params = wp_parse_args ( $_REQUEST, array(
));

$brand = $params['mobile'];
$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        array(
            'key' => 'brand',
            'value' => $brand,
        ) ,
    ) ,
);  

$query = new WP_Query($args);
if( ! empty ($params['template'])) 
  $template = $params['template'];
  if( $query->have_posts() ) :
    while( $query->have_posts() ): $query->the_post();
        get_template_part('content');
    endwhile;
        wp_reset_query();
else :
     wp_send_json($query->posts);
endif;
die();
 

脚本

<script>
   jQuery(document).ready(function () 
     jQuery('.br').click(function () 
        jQuery('.contents').remove();
        var checked = jQuery('#test').serialize();
        $('.filter-output').empty()
        jQuery.ajax( 
            url: "<?php echo admin_url('admin-ajax.php'); ?>",              
            data: "action=call_post&template=content&" + checked,
            success: function (result) 
            jQuery(result).appendTo('.filter-output');
            
        );
    )
 );
</script>

Form.php

<form  id='test' >
<input type="checkbox" name="mobile[]" value="Nokia" class="br"> NOKIA 
<input type="checkbox" name="mobile[]" value="LG" class="br"> LG 
    <div class="filter-output">
        </div>
</form>

【问题讨论】:

【参考方案1】:

是的,使用第三个参数 'compare' 很容易做到这一点。

'meta_query' 还包含一个或多个具有以下键的数组:

'key' (string) - 自定义字段键。

'value' (string|array) - 自定义字段值。只有当 compare 是 'IN'、'NOT IN'、'BETWEEN' 或 'NOT BETWEEN' 时,它才可以是一个数组。在 WordPress 3.9 及更高版本中使用“EXISTS”或“NOT EXISTS”比较时,您不必指定值。(注意:由于错误 #23268,值在 3.9 之前,NOT EXISTS 比较需要正确工作。您必须为 value 参数提供一些字符串。空字符串或 NULL 将不起作用。但是,任何其他字符串都可以解决问题,并且不会出现在您的 SQL 中使用 NOT EXISTS。需要灵感吗?'bug #23268' 怎么样。)

'compare' (string) - 操作员进行测试。可能的值是 '='、'!='、'>'、'>='、'

'type' (string) - 自定义字段类型。可能的值为“NUMERIC”、“BINARY”、“CHAR”、“DATE”、“DATETIME”、“DECIMAL”、“SIGNED”、“TIME”、“UNSIGNED”。默认值为“CHAR”。


'relation' (string) - 存在多个时每个内部 meta_query 数组之间的逻辑关系。可能的值是“与”、“或”。不要与单个内部 meta_query 数组一起使用。

这是一个可视化示例,说明您可以使用 'relation' 参数做什么……

$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'brand',
            'value' => $brand,
            'compare' => '=',
        ),
        array(
            'relation' => 'AND',
            array(
                'key' => 'color',
                'value' => 'red',
                'compare' => '=',
            ),
            array(
                'key' => 'size',
                'value' => 'small',
                'compare' => '=',
            ),
        ),
    ),
);

参考:Class_Reference WP_Query - Custom Field Parameters

【讨论】:

如何使用'$brand = $params['mobile'];'每个键 你可以用像'key' =&gt; $variable这样的变量替换像'key'这样的任何参数,'value'也是一样的。这行得通,我已经用过了……但是'relation''compare' 参数对于得到你想要的很重要。这就像一个 SQL 查询......

以上是关于在 AJAX 后置过滤器中添加多个元键和值的主要内容,如果未能解决你的问题,请参考以下文章

通过在键和值中搜索部分匹配来过滤数组元素

在 AJAX 后过滤器函数中使用多个“关系”参数

使用 Hibernate Criteria 过滤 Map 中的键和值

SQL for WP 删除具有多个元键和评论的用户

用于WP的SQL可以删除具有多个元键和注释的用户

AJAX调用在html div中显示api键和值