Использовать множественные аргументы «отношения» в функции постфактора AJAX

Я пытаюсь создать фильтр сообщений ajax с формой, которая использует muti-selection через группы флажков.

Этот фильтр имеет 5 групп (мастер-ключи), которые являются brand , ram , camera , price и feature . Каждая группа имеет от 4 до 5 различных ключей / значений (флажки).

На данный момент это работает только в режиме моновыбора: если я выбрал 2 флажка одной группы, ничего не отображается …

Как включить множественный выбор для этих групп флажков?

Вот функция php, которая делает запрос Ajax:

 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, которые используются в этом потоке:
Получать сообщения с фильтром сообщений Ajax с флажками с несколькими выделениями

благодаря

Для этого вам необходимо:

  • группировать данные действий по группам (выбранные флажки)
  • включить в каждую группу массивов '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', ), ), ), ); 

Таким образом, это должно работать так, как ожидалось, чтобы включить множественный выбор по группам флажков …