如何使用META_QUERY对META_KEY进行排序并按日期进行二次排序?

时间:2011-07-21 作者:Dana

在过去的几天里,我一直在解决一个问题,并一直在兜圈子。真的可以用一双新鲜的眼睛来帮我回答这个问题。。。

因此,我正在与wordpress网站合作,其中帖子有一些与我需要运行的查询相关的自定义字段:“post expired”和“my sort order”。当我运行query\\u posts时,我希望结果是“post expired”不是“yes”的帖子(这部分在我的代码中起作用)。我还希望结果按“我的排序顺序”的DESC number值排序(也可以),如果“我的排序顺序”上有关联,我希望按日期进行二次排序,首先是最近的帖子。

第二种按日期排序是我遇到的问题。

下面是我现在掌握的代码:

<?php               
$args = array(
    \'paged\' => $paged,
    \'meta_query\'=> array(
        array(
            \'key\'=>\'post-expired\',
            \'value\'=> \'yes\',
            \'compare\' => \'!=\'
        )
    ),
    \'meta_key\'=>\'my-sort-order\',
    \'orderby\'=>\'meta_value_num\', 
    \'order\'=>\'DESC\'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>
使用上面的代码,我正确地取回了未过期的帖子,并按我的排序顺序降序排列(即,99之前显示100,等等)。但是,如果两篇文章的排序顺序值相同,则会发生某种我似乎无法控制的二次排序(也无法确定实际排序的依据)。

我解决这个问题的第一个想法是,如果我想为那个帖子设置一个特定的排序顺序,那么只在“我的排序顺序”中添加值。我认为,如果对于其余的帖子,该字段的值为空,那么它们将以默认的排序方式按DESC date返回(在设置了排序顺序的帖子之后)。然而,实际发生的情况是,没有设置排序顺序值的任何帖子都不会返回。。。

接下来,我尝试在orderby字段中添加多个值,如下所示:

(\'orderby\'=>\'meta_value_num date\')
这完全破坏了我想要的两个排序顺序,并以一种意想不到的方式返回了帖子。我的印象是允许多个orderby值,但由于某种原因,它在这里不起作用。

在这一点上,我不知道如何使这些潜在的解决方案中的任何一个奏效。有人知道我如何1)首先按“我的排序顺序”字段对帖子进行排序,然后用默认的日期排序返回该字段中没有值的其余帖子;或者2)找出如何控制二级排序,以便任何与“我的排序顺序”相关的帖子都将按日期排序(最新的优先)?

1 个回复
SO网友:tollmanz

希望您现在已经解决了这个问题,但如果您还没有解决,您应该能够使用“posts\\u orderby”过滤器拨入特定的查询顺序。我不会在这里给出完整的解决方案,但你可以参考这篇文章了解更多:http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

编辑:

以下是文档-基本上您可以重写SQL的ORDER BY子句:http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

下面是文档中的示例代码:

add_filter(\'posts_orderby\', \'edit_posts_orderby\');
add_filter(\'posts_join_paged\',\'edit_posts_join_paged\');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}

结束

相关推荐

Sort admin menu items

关于“的相关注释”Changing the Order of Admin Menu Sections?“,我正在寻找一种按字母顺序对WordPress管理区域的每个子部分中的条目进行排序的方法。目前,每当添加新插件时,其条目都会出现在“设置/工具/插件”下看似随机的位置,通常很难找到新的菜单项。(我已经有很多插件了,所以我的菜单很满。)由于我相当经常地添加和删除插件,所以我宁愿不需要不断进入设置页面来获取菜单排序插件并调整顺序。抱歉问了这么长的问题;我只是想弄清楚我在找什么。示例代替: S