WP_Query 上的自定义排序 (usort)

Custom sort (usort) on WP_Query

环境简述:

在我的网站上,posts 应该根据特定标准进行排序。该网站被翻译成不同的语言。 首先,posts 应该按发布日期排序。日期存储在元字段 'publication_date' 中。 post 具有元值 'premium'。如果为真,它将设置在 posts 以上,其中 'premium' 为假,无论其发布日期如何。所以 premium posts 应该总是在最前面并且也按日期排序。 此外,元值 'premium' 仅在您使用正确语言版本的网站时才会被考虑在内。这取决于元值 'domain'。这是一个可以有多个值的 select 字段。 例如,如果我在网站的西班牙语版本上,所有 post 的 'Spain' 包含在元值 'domain' 中并且元值 'premium' 为真应该显示在顶部。

对于查询,我使用 Search & Filter Pro 插件 (documentation)。它已经负责按日期排序。

我的查询是这样的:

$args = array(
    'search_filter_id' => $searchandfilter_id,
);
$ads_query = new WP_Query( $args );

// premium sort
usort( $ads_query->posts, 'premium_sort' );

/* the loop */

到目前为止,这是我的高级排序功能:(如果网站的当前语言与 'domain' 元字段匹配,则功能 check_main_and_additional_domains() returns 为真,否则为假)

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 专家所以请不要太苛刻。我将非常感谢您的帮助和建设性反馈。

我觉得你的问题是逻辑不一致

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 你 returning -1,我认为你需要尝试的是将 if ($a_premium) { 也更改为 return -1 而不是 1.