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

Posted

技术标签:

【中文标题】在 AJAX 后过滤器函数中使用多个“关系”参数【英文标题】:Use multiple 'relation' arguments in AJAX post filter function 【发布时间】:2017-01-10 19:49:11 【问题描述】:

我正在尝试使用通过复选框组使用 多选 的表单来实现 ajax 后置过滤器。

此过滤器有 5 个组(主键),分别是 brandramcamerapricefeature。每个组都有 4 到 5 个不同的键/值(复选框)。

目前,这仅适用于单选模式: 如果我选择了同一组的 2 个复选框,什么都不显示...

如何为这组复选框启用多选功能?

这是进行 Ajax 查询的 php 函数:

add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');

function call_post()

$choices = $_POST['choices'];

$meta_query = array('relation' => 'AND');
foreach($choices as $Key=>$Value)

    if(count($Value))
        foreach ($Value as $Inkey => $Invalue) 
            $meta_query[] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
        
    

$args = array(
    'post_type' => 'post',
    'meta_query' =>$meta_query
 );

$query = new WP_Query($args);
     if( $query->have_posts() ) :
         while( $query->have_posts() ): $query->the_post();
             get_template_part('content');
         endwhile;
         wp_reset_query();
     else :
  _e('Sorry, no posts matched your criteria.');
         wp_send_json($query->posts);
     endif;
die();

?>

以下是本主题中使用的 html 表单和 javascript:Get posts with Ajax posts filter with multi selection checkboxes

谢谢

【问题讨论】:

【参考方案1】:

要实现这一点,您需要:

按组对操作数据进行分组(选中的复选框) 在每组数组中包含一个'relation' => 'OR' 如果该组选中了多个复选框)

你的 php 函数会是这样的:

add_action('wp_ajax_call_post', 'call_post');
add_action('wp_ajax_nopriv_call_post', 'call_post');

function call_post()

    $choices = $_POST['choices'];

    // Defining here your fields groups
    $groups = array('brand', 'ram', 'camera', 'price', 'feature');

    // Grouping data by group
    foreach($choices as $Key => $Value)
        foreach ($Value as $Inkey => $Invalue) 
            switch ($Key) 

                // One block for each group defined in $groups array

                case $groups[0]:
                    $grp[0][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
                    break;

                case $groups[1]:
                    $grp[1][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
                    break;

                case $groups[2]:
                    $grp[2][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );;
                    break;

                case $groups[3]:
                    $grp[3][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
                    break;

                case $groups[4]:
                    $grp[4][] = array( 'key' => $Key, 'value' => $Invalue, 'compare' => 'like' );
                    break;
            
        
    

    $grp_arr = array();

    // Adding ('relation' => 'OR') to each group with a length > 1
    foreach ($grp as $key_grp => $grp_values) 
        if(count($grp_values) > 1)
            $grp_arr[$key_grp] = array('relation' => 'OR');
        
        foreach ($grp_values as $grp_val) 
            $grp_arr[$key_grp][] = $grp_val;
        
    
    
    // Compiling it all
    $meta_query = array('relation' => 'AND');
    foreach ($grp_arr as $grp_arr_val) 
        $meta_query[] = $grp_arr_val;
    

    // The query (compiled)
    $query = new WP_Query( array(
        'post_type'     => 'post',
        'meta_query'    => $meta_query
    ) );

    // The Loop
    if( $query->have_posts() ) :
        while( $query->have_posts() ): $query->the_post();
            get_template_part('content');
        endwhile;
        wp_reset_query();!
    else :
        _e('Sorry, no posts matched your criteria.');
        wp_send_json($query->posts);
    endif;

    die();

所以你会得到这种格式化数组:

$query = array(
    'post_type'    => 'product',
    'meta_query'   => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            array(
                'key'     => 'brand',
                'value'   => 'Nokia',
                'compare' => 'like',
            ),
            array(
                'key'     => 'brand',
                'value'   => 'LG',
                'compare' => 'like',
            ),
        ),
        array(
            'relation' => 'OR',
            array(
                'key'     => 'ram',
                'value'   => '1GB',
                'compare' => 'like',
            ),
            array(
                'key'     => 'ram',
                'value'   => '2GB',
                'compare' => 'like',
            ),
        ),
    ),
);

所以这应该可以按预期工作,通过复选框组启用多选...

【讨论】:

以上是关于在 AJAX 后过滤器函数中使用多个“关系”参数的主要内容,如果未能解决你的问题,请参考以下文章

将ajax请求中的多个参数传递给函数后面的C#代码

struts2拦截器过滤放行后ajax请求后参数丢了

并行执行多个 AJAX 请求,并在所有请求完成后运行一个函数

在 Laravel 的页面上应用过滤器后获取表格上的数据

使用jQuery函数:选择器 工具类 Ajax

如何使用ajax更改事件对象后刷新fullcalendar v4