Живая фильтрация нескольких запросов таксономии

#php #ajax #wordpress #filtering

#php #ajax #wordpress #фильтрация

Вопрос:

Я создаю интерфейсный фильтр, который содержит флажки, которые посетители могут щелкнуть, чтобы отсортировать сообщения на основе таксономий. Сообщения, которые они могут фильтровать, — это пользовательский тип записи с прикрепленными к нему 3 таксономиями.

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

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

Пример:

Налог 1 Налог 2 Налог 3

Если первый флажок, который установлен, относится к налогу 1, то он будет фильтровать только в пределах налога 1. Если я попытаюсь щелкнуть флажок, который принадлежит налогу 2 или налогу 3, он полностью игнорирует эти термины / налог и по-прежнему фильтрует только по первой таксономии.

Я знаю, что делаю что-то неправильно в запросе, поэтому я действительно надеюсь, что кто-нибудь здесь, на SO, может дать мне некоторые указания о том, что я должен сделать, чтобы это заработало.

Вот конечная точка (запрос):

 function myFilter ($data) {

    $checkFylker          = $data['checkFylker'];
    $checkUtstyr          = $data['checkUtstyr'];
    $checkFors            = $data['checkFors'];
    $checkType            = $data['checkType'];


    //return $results;


  //Main $args
  $args = array(
      'post_type'     => 'ml_opp', // Query only "ml_opp" custom posts
      'post_status'   => 'publish', // Query only posts with "publish" status
      'orderby'       => 'date', // Sort posts by date
      'order'         => 'ASC' // ASC
    );



    $args['tax_query'] = array( 'relation'=>'AND' ); // AND means that all conditions of meta_query should be true

    // for taxonomies / utstyr
    if( isset( $checkUtstyr ) )
      $args['tax_query'][] = array(
        array(
          'taxonomy'  => 'ml_utstyr',
          'field'     => 'id',
          'terms'     => $checkUtstyr
        )
      );

    //for taxonomies / forsendelse
    if( isset( $checkFors ) )
      $args['tax_query'][] = array(
        array(
          'taxonomy'  => 'ml_forsendelse',
          'field'     => 'id',
          'terms'     => $checkFors
        )
      );

    // for taxonomies / fylker
    if( isset( $checkFylker ) )
      $args['tax_query'] = array(
        array(
          'taxonomy'  => 'ml_fylk',
          'field'     => 'id',
          'terms'     => $checkFylker
        )
      );

    // for taxonomies / type
    if( isset( $checkType ) )
      $args['tax_query'] = array(
        array(
          'taxonomy'  => 'ml_typ',
          'field'     => 'id',
          'terms'     => $checkType
        )
      );

    $query = new WP_Query( $args );

    if( $query->have_posts() ) :
      while( $query->have_posts() ): $query->the_post();
        echo '<h2>' . $query->post->post_title . '</h2>';
      endwhile;
      wp_reset_postdata();
    else :
      echo 'No posts found';
    endif;

    die();
    }
  

Ответ №1:

Ваши все isset условия неверно интерпретируются, чтобы соответствовать tax_query . Посмотрите обновленный фрагмент кода ниже и сравните с вашим, чтобы найти разницу.

 function myFilter ($data) {

    $checkFylker          = $data['checkFylker'];
    $checkUtstyr          = $data['checkUtstyr'];
    $checkFors            = $data['checkFors'];
    $checkType            = $data['checkType'];


    //return $results;


  //Main $args
  $args = array(
      'post_type'     => 'ml_opp', // Query only "ml_opp" custom posts
      'post_status'   => 'publish', // Query only posts with "publish" status
      'orderby'       => 'date', // Sort posts by date
      'order'         => 'ASC' // ASC
    );

    $args['tax_query'] = array( 'relation'=>'AND' ); // AND means that all conditions of meta_query should be true

    // for taxonomies / utstyr
    if( isset( $checkUtstyr ) )
      $args['tax_query'][] = array(
          'taxonomy'  => 'ml_utstyr',
          'field'     => 'id',
          'terms'     => $checkUtstyr
      );

    //for taxonomies / forsendelse
    if( isset( $checkFors ) )
      $args['tax_query'][] = array(
          'taxonomy'  => 'ml_forsendelse',
          'field'     => 'id',
          'terms'     => $checkFors
      );

    // for taxonomies / fylker
    if( isset( $checkFylker ) )
      $args['tax_query'][] = array(
          'taxonomy'  => 'ml_fylk',
          'field'     => 'id',
          'terms'     => $checkFylker
      );

    // for taxonomies / type
    if( isset( $checkType ) )
      $args['tax_query'][] = array(
          'taxonomy'  => 'ml_typ',
          'field'     => 'id',
          'terms'     => $checkType
     );

    $query = new WP_Query( $args );

    if( $query->have_posts() ) :
      while( $query->have_posts() ): $query->the_post();
        echo '<h2>' . $query->post->post_title . '</h2>';
      endwhile;
      wp_reset_postdata();
    else :
      echo 'No posts found';
    endif;
    die();
  }