以预定义的顺序查询帖子

时间:2012-10-10 作者:Imran

我正在使用query\\u posts函数列出10个特定的帖子,这些帖子通过帖子id进行查找。

我有一个数组,看起来像这样。。

Array
(
    [0] => 17983
    [1] => 17932
    [2] => 18030
    [3] => 18016
    [4] => 17972
    [5] => 18013
    [6] => 18035
    [7] => 17959
    [8] => 18020
    [9] => 18039
)
我想查询以特定顺序显示它的帖子,但我的代码以随机顺序显示它们。

以下是我用于查询帖子的参数:

$args = array(
    \'post_type\' => \'post\',
    \'post__in\' => $post_ids,
    \'numberposts\'     => 10,
);
$post\\u id是我在上面发布的数组。

如何修改代码以查询帖子并按数组顺序显示它们?

5 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

如果查询只针对少数帖子,那么正如Alex链接的那样,您可以在php中排序。然而,这并不能很好地扩展。

正如Kovshenin所建议的,更好的选择是使用posts_orderby 过滤器:

$post_ids = array(83,24,106,2283,14);
$args = array(
    \'post_type\' => \'post\',
    \'post__in\' => $post_ids,
    \'numberposts\'     => 10,
);

//Callback to filter the ORDER BY part of the query
function wpse67823_orderby_post_in($orderby, $query){
     global $wpdb;

     //Remove it so it doesn\'t effect future queries
     remove_filter(current_filter(), __FUNCTION__);

     $post__in = implode(\',\',$query->get(\'post__in\'));

     return "FIELD( {$wpdb->posts}.ID, $post__in )";
 }

//Add filter and perform query
add_filter(\'posts_orderby\',\'wpse67823_orderby_post_in\',10,2);
$wpse67823_query = new WP_Query($args);
WordPress 3.5将看到接受的附加值WP_Query 对于orderby: \'post\\uu in\'。查看此trac票据:http://core.trac.wordpress.org/ticket/13729

SO网友:jmarceli

基于@Stephen Harris的回答,对于Wordpress 3.5+来说,最简单的选择似乎是按post__in.

以下是示例:

$post_ids = Array(12, 15, 18, 8, 10, 5);

$args = array(
  \'post_type\' => \'post\',
  \'post__in\' => $post_ids,
  \'numberposts\' => 10,
  \'orderby\' => \'post__in\'
);
$posts = WP_Query($args); // or any other method that uses WP_Query args e.g. get_posts()

// as a result you will get posts in order: 12, 15, 18, 8, 10, 5
我自己在Wordpress 4.7网站上进行了测试,效果如预期。

SO网友:kovshenin

您需要在posts_orderby 并使用MySQLORDER BY FIELD() 从数组中使用逗号分隔列表的函数。以下是有关FIELD 功能:http://www.electrictoolbox.com/mysql-order-specific-field-values/

我很久以前就这样做了,当时我让Sphinx返回一个按相关性排序的帖子ID列表,所以我必须用WP_Query 按照同样的顺序。FIELD()posts_orderby 过滤器工作得很好。

此外,如果您使用query_posts 要更改主查询,这不是最好的方法@Alex提到WP_Query, 这与query_posts 而且(让它看起来像您)更改主查询也是一种不好的方式。

正确的方法是使用pre_get_posts 操作,并更改通过引用传入的$query 对象您可以在此处了解有关pre\\u get\\u帖子的更多信息:http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

希望这有帮助。干杯

SO网友:Bainternet

这里有一个更简单的解决方法来实现这一点,只需使用相同的名称为这些帖子中的每一篇创建一个自定义字段,然后设置所需的顺序,例如:

对于id=17983的帖子,设置一个名为my\\u custom\\u order=1的自定义字段;对于id=18030的帖子,设置一个名为my\\u custom\\u order=2的自定义字段;对于id=18016的帖子,设置一个名为my\\u custom\\u order=3的自定义字段;在查询中,只需按该自定义字段排序即可:

$args = array(
    \'post_type\' => \'post\',
    \'post__in\' => $post_ids,
    \'posts_per_page\' => 10,
    \'meta_key\' => \'my_custom_order\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'ASC\'
);
Note:完成此操作后(为这些帖子设置自定义字段),可以删除\'post__in\' => $post_ids, 参数,因为只有自定义字段为的帖子my_custom_order 将从数据库中查询。

SO网友:Xhynk

首先,不要使用query_posts(), 使用WP_Query().

第二,将数组更改为只包含post ID。

发件人:

[0] => 17983
[1] => 17932

array( 17983, 17932 )
EDIT: 看HERE 供参考。

结束