Краткое описание среды:
На моем сайте сообщения должны быть отсортированы по определенным критериям. Сайт переведен на разные языки. Сначала сообщения должны быть отсортированы по дате публикации. Дата хранится в мета-поле «публикация-дата». Сообщение имеет мета-значение «премиум». Если это правда, он будет установлен над сообщениями, где «премиум» является ложным, независимо от даты его публикации. Поэтому посты премиум-класса должны быть всегда сверху, а также отсортированы по дате Кроме того, мета-значение «премиум» учитывается только в том случае, если вы используете правильную языковую версию веб-сайта. Это зависит от мета-значения «домен». Это поле выбора, где возможны несколько значений. Например, если я использую версию веб-сайта Spani sh, в верхней части должны отображаться все сообщения, в которых мета-значение «домен» включено «Испания», а мета-значение «премиум» равно true).
Для запроса я использую плагин Search & Filter Pro ( документация ). Он уже заботится о сортировке по дате.
Вот так выглядит мой запрос:
$args = array(
'search_filter_id' => $searchandfilter_id,
);
$ads_query = new WP_Query( $args );
// premium sort
usort( $ads_query->posts, 'premium_sort' );
/* the loop */
И это пока что моя функция сортировки премиум-класса: (функция check_main_and_additional_domains()
возвращает Значение true, если текущий язык веб-сайта совпадает с мета-полем «домен», в противном случае - значение false)
function premium_sort( $a, $b ) {
$a_premium = get_post_meta( $a->ID, 'premium', true );
$b_premium = get_post_meta( $b->ID, 'premium', true );
if ( check_main_and_additional_domains( $a->ID ) && check_main_and_additional_domains( $b->ID ) ) {
if ( $a_premium && $b_premium ) {
return 0;
}
if ( ! $a_premium && ! $b_premium ) {
return 0;
}
if ( ! $a_premium && $b_premium ) {
return 1;
}
if ( $a_premium && ! $b_premium ) {
return -1;
}
}
if ( ! check_main_and_additional_domains( $a->ID ) && ! check_main_and_additional_domains( $b->ID ) ) {
return 0;
}
if ( ! check_main_and_additional_domains( $a->ID ) && check_main_and_additional_domains( $b->ID ) ) {
if ( $b_premium ) {
return 1;
}
}
if ( check_main_and_additional_domains( $a->ID ) && ! check_main_and_additional_domains( $b->ID ) ) {
if ( $a_premium ) {
return 1;
}
}
}
У меня проблемы с правильной сортировкой. Иногда это работает, а иногда нет. Я не PHP эксперт, поэтому, пожалуйста, не будьте слишком усердными sh. Буду очень признателен за вашу помощь и конструктивный отзыв.