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.
环境简述:
在我的网站上,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.