@notdeveloper58

Как вывести материалы с несколькими параметрами через WP Meta Query?

У материалов есть секция ACF с чекбоксами с возможностью выбора нескольких опций (сезонов), а также радио кнопки для выбора одной опции (направление и ценовая категория).

С фронта вывожу запросом материалы по заданным опциям, следующим образом
?direction=altai&season=leto&price=1

Но именно параметр season не отрабатывает, то есть не выводятся материалы с опцией leto. Хотя direction и price, которые в ACF реализованы через радио кнопки, отрабатывают четко. Это все при следующем коде:
function sm_register_query_vars( $vars ) {
    $vars[] = 'direction';
    $vars[] = 'season';
    $vars[] = 'price';
    return $vars;
} 

add_filter( 'query_vars', 'sm_register_query_vars' );

function sm_pre_get_posts( $query ) {

    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }

    if ( !is_post_type_archive( 'tours' ) ){
        return;
    }

    $meta_query = array();

    // add meta_query elements
    if( !empty( get_query_var( 'direction' ) ) ){
        $meta_query[] = array( 'key' => 'tour_direction', 'value' => get_query_var( 'direction' ), 'compare' => 'IN' );
    }

    if( !empty( get_query_var( 'season' ) ) ){
        $meta_query[] = array( 'key' => 'tour_season', 'value' => get_query_var( 'season' ), 'compare' => 'IN' );
    }

    if( !empty( get_query_var( 'price' ) ) ){
        $meta_query[] = array( 'key' => 'tour_price-category', 'value' => get_query_var( 'price' ), 'compare' => 'IN' );
    }

    if( count( $meta_query ) > 1 ){
        $meta_query['relation'] = 'AND';
    }

    if( count( $meta_query ) > 0 ){
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'sm_pre_get_posts', 1 );


Если у season ставлю compare LIKE, то следующее работает
?direction=altai&season=leto&price=1

Но если я ставлю несколько значений season то не выводится ничего вообще
?direction=altai&season=leto,zima&price=1

Уже несколько дней пытаюсь понять где я накосячил, но никак не разберусь.
  • Вопрос задан
  • 42 просмотра
Решения вопроса 1
@notdeveloper58 Автор вопроса
Заменил
if( !empty( get_query_var( 'season' ) ) ){
    $meta_query[] = array( 'key' => 'tour_season', 'value' => get_query_var( 'season' ), 'compare' => 'IN' );
}


на
if( !empty( get_query_var( 'season' ) ) ){
    $seasons = get_query_var( 'season' );
    $seasons = explode(",",$seasons);
    $seasonsArray = array('relation' => 'OR');
    foreach ($seasons as $season) {
        $seasonsArray[] = array( 'key' => 'tour_season', 'value' => $season, 'compare' => 'LIKE');
    }
    $meta_query[] = $seasonsArray;
}


И вроде бы все корректно заработало. Кто силен в php и wordpress, подтвердите пожалуйста корректность решения.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы