Как упростись цепочку условий для фильтра на wordpress?

Рейтинг: 0Ответов: 1Опубликовано: 12.02.2023

У меня есть каталог фильмов на wordpress, где в метатегах постов хранится информация о жанрах, рейтинге и т.п.

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

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

if (isset($rating) || isset($genre)) {

  if (isset($rating) && isset($genre)) {

    $query = new WP_Query(array(
      'meta_query' => array(
        'relation' => 'AND',
        array(
          'key' => 'film_rating',
          'value' => $rating,
        ),
        array(
          'key' => 'film_kind',
          'value' => $genre,
        ),
        array(
          'key' => 'film_id',
          'value' => $films,
          'compare' => 'IN'
        ),
      ),
      'post_type' => 'post',
      'post_status' => 'publish',
      'posts_per_page' => -1
    ));

  } else if (isset($rating)) {

    $query = new WP_Query(array(
      'meta_query' => array(
        'relation' => 'AND',
        array(
          'key' => 'film_rating',
          'value' => $rating,
        ),
        array(
          'key' => 'film_id',
          'value' => $films,
          'compare' => 'IN'
        ),
      ),
      'post_type' => 'post',
      'post_status' => 'publish',
      'posts_per_page' => -1
    ));

  } else if (isset($genre)) {

    $query = new WP_Query(array(
      'meta_query' => array(
        'relation' => 'AND',
        array(
          'key' => 'film_kind',
          'value' => $genre,
        ),
        array(
          'key' => 'film_id',
          'value' => $films,
          'compare' => 'IN'
        ),
      ),
      'post_type' => 'post',
      'post_status' => 'publish',
      'posts_per_page' => -1
    ));
  }
} else {

  $query = new WP_Query(array(
    'meta_query' => array(
      array(
        'key' => 'film_id',
        'value' => $films,
        'compare' => 'IN'
      ),
    ),
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => -1
  ));
}

Ответы

▲ 1Принят

С подсказкой @Simon решил вот так:

$args = array(
  'post_type' => 'post',
  'post_status' => 'publish',
  'posts_per_page' => -1
);

$args['meta_query'] = array(
  'relation' => 'AND',
  array(
    'key' => 'film_id',
    'value' => $films,
    'compare' => 'IN'
  )
);

if ((isset($rating) && !empty($rating))) {
  $args['meta_query'][] = array(
    'key' => 'film_rating',
    'value' => $rating
  );
}
if ((isset($genre)) && !empty($genre)) {
  $args['meta_query'][] = array(
    'key' => 'film_kind',
    'value' => $genre
  );
}
$query = new WP_Query($args);