Пользовательская сортировка (usort) на WP_Query - PullRequest
0 голосов
/ 24 апреля 2020

Краткое описание среды:

На моем сайте сообщения должны быть отсортированы по определенным критериям. Сайт переведен на разные языки. Сначала сообщения должны быть отсортированы по дате публикации. Дата хранится в мета-поле «публикация-дата». Сообщение имеет мета-значение «премиум». Если это правда, он будет установлен над сообщениями, где «премиум» является ложным, независимо от даты его публикации. Поэтому посты премиум-класса должны быть всегда сверху, а также отсортированы по дате Кроме того, мета-значение «премиум» учитывается только в том случае, если вы используете правильную языковую версию веб-сайта. Это зависит от мета-значения «домен». Это поле выбора, где возможны несколько значений. Например, если я использую версию веб-сайта 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. Буду очень признателен за вашу помощь и конструктивный отзыв.

1 Ответ

1 голос
/ 24 апреля 2020

Я думаю, что ваша проблема заключается в непоследовательности логики c.

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;
    }
}

Судя по приведенному выше разделу, где для $a_premium && ! $b_premium вы возвращаете -1, я думаю, что вы нужно попробовать изменить if ($a_premium) { и вернуть -1 вместо 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...