WP_Query上的自定义排序(排序)

环境的简要说明:

在我的网站上,帖子应根据特定条件进行排序。该网站被翻译成不同的语言。 首先,帖子应按发布日期排序。日期存储在元字段“ publication_date”中。 帖子具有元值“ premium”。如果为true,则将在“ premium”为false的帖子上方设置它,而不考虑其发布日期。因此,溢价帖子应始终放在首位,并按日期排序。 此外,仅当您使用网站的正确语言版本时,才考虑元值“ premium”。这取决于元值“域”。这是一个可能有多个值的选择字段。 例如,如果我使用的是西班牙语版本的网站,则将在元值“域”中包含“西班牙”且元值“ premium”为true的所有帖子都显示在顶部。

For the query I use the Search & Filter Pro plugin (documentation). It already takes care of the sorting by date.

这是我的查询的样子:

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

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

/* the loop */

And this is my premium sort function so far: (the function check_main_and_additional_domains() returns true if the current language of the website matches the 'domain' meta field, otherwise 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专家,所以请不要太苛刻。谢谢您的帮助和建设性的反馈。

评论