Сравните 3 пользовательских поля и отсортируйте их по старейшим

Я создаю архив фильмов. Для каждого фильма я заполняю даты выпуска для 3 стран, они хранятся как пользовательские поля (добавленные через Pods)

Теперь, когда я перечисляю фильмы, я хотел бы построить массив и цикл через каждое сообщение, чтобы проверить, имеют ли поля значения, затем сравнивают значения и сортируют по первой дате (самая старая или последняя дата). Если ни одно из полей не имеет значений, отправляемая дата должна использоваться для сортировки. Я уже сортирую должности некоторых категорий и их дочерние категории одним специальным полем следующим образом:

function orderby_additionaldate($query) { if (! is_admin() && $query->is_main_query() && is_category( array( 2,57,530 ) ) || cat_is_ancestor_of(2, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(57, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(530, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() ) { if ( $query->query_vars ) { $query->set( 'order', 'DESC' ); $query->set( 'meta_key', 'additional_date' ); $query->set( 'orderby', 'meta_value' ); } } } add_action( 'pre_get_posts', 'orderby_additionaldate' ); 

2 вещи отсутствуют из этого:

  • Это не сравнение 3 значений мета-ключа ( release_f , release_uk и release_us ) и
  • Он не проверяет, является ли один из них пустым и вместо него используется опубликованная дата (он просто устанавливает значение пустых в 1 января 1970 года)

Я хотел бы создать аналогичную функцию, описанную выше для

 if (is_post_type_archive('project') ) 

то он должен проверить 3 meta_keys release_f , release_uk и release_us для значений, если есть какой-либо выбор самой старой даты, если нет никакой ценности, выберите дату сообщения, а затем orderby результат этого массива. Это возможно?

Solutions Collecting From Web of "Сравните 3 пользовательских поля и отсортируйте их по старейшим"

Хотя описанный вами запрос не является невозможным в SQL, он не будет очень эффективным, так как запрос должен будет оценивать каждую строку в таблице, соответствующей этим клавишам, а затем сортировать на основе результата вычисления.

Вы лучше сохраняете четвертое значение и сортируете по нему, как это предлагает @Shazzad. Что-то вроде этого:

  function gen_sort_meta_wpse_133851($pid) { var_dump($pid); $release[] = get_post_meta($pid,'release_f',true); $release[] = get_post_meta($pid,'release_uk',true); $release[] = get_post_meta($pid,'release_us',true); $sort = max($release); $release_sort = get_post_meta($pid,'_release_sort',true); update_post_meta($pid,'_release_sort',$sort,$release_sort); } add_action('save_post','gen_sort_meta_wpse_133851'); 

Затем вы сможете сортировать:

 function orderby_additionaldate($query) { if (! is_admin() && $query->is_main_query() && is_category( array( 2,57,530 ) ) || cat_is_ancestor_of(2, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(57, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() || cat_is_ancestor_of(530, get_query_var('cat') ) && $query->is_main_query() && ! is_admin() ) { if ( $query->query_vars ) { $query->set( 'order', 'DESC' ); $query->set( 'meta_key', '_release_sort' ); $query->set( 'orderby', 'meta_value' ); } } } add_action( 'pre_get_posts', 'orderby_additionaldate' ); 

Я не знаю, правильно ли эта логика. Длинные списки несферообразных булевых условий – хороший способ получить неожиданное поведение.