如何以显式定义的顺序返回GET_POST()的结果

时间:2011-03-03 作者:Dalton Rooney

我试图创建一个由明确有序的帖子组成的循环,例如:

<?php $args = array(
    \'include\'         => \'1,3,8,4,12\' ); ?>

<?php get_posts( $args ); ?> 
默认情况下,结果按日期排序,并且没有orderby选项可以按输入的顺序返回帖子。Trac中已经发布了多个关于此的错误/功能请求,但到目前为止还没有成功。我在核心文件中做了一点手脚,但没有得到任何进展。

有人能为这种行为提出解决方法吗?

干杯,道尔顿

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

好吧,我下定决心要想办法做到这一点,我想我已经做到了。我曾希望找到一个更简单的解决方案,避免使用新的WP\\u查询对象,但它在循环的工作方式中根深蒂固。首先,我们有几个效用函数:

// Set post menu order based on our list  
function set_include_order(&$query, $list) {
    // Map post ID to its order in the list:
    $map = array_flip($list);

    // Set menu_order according to the list     
    foreach ($query->posts as &$post) {
      if (isset($map[$post->ID])) {
        $post->menu_order = $map[$post->ID];
      }
    }  
}

// Sort posts by $post->menu_order.                                 
function menu_order_sort($a, $b) {
  if ($a->menu_order == $b->menu_order) {
    return 0;
  }
  return ($a->menu_order < $b->menu_order) ? -1 : 1;
}
这些将允许我们设置menu_order 属性,然后在此基础上对查询对象中的帖子进行排序。

以下是我们如何查询和排序帖子:

$plist = array(21, 43, 8, 44, 12);
$args = array(
  \'post_type\' => \'attachment\',
  \'post_status\' => \'any\',
  \'post__in\' => $plist 
);

// Create a new query  
$myquery = new WP_Query($args);

// set the menu_order
set_include_order($myquery, $plist);

// and actually sort the posts in our query
usort($myquery->posts, \'menu_order_sort\');
现在我们有了自己的查询对象$myquery->posts 根据我们的习惯分类menu_order_sort 作用现在唯一棘手的部分是,我们必须使用自定义查询对象构建循环:

while($myquery->have_posts()) : $myquery->the_post();
  ?>
    <div><a id="post_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> Post ID: <?php the_ID(); ?>
    </div>
  <?php

endwhile;
wp_reset_postdata();
显然,您需要在那里修复循环模板代码。

我希望找到一个不需要使用自定义查询对象的解决方案,也许可以使用query_posts() 以及更换posts 全球财产$wp_query, 但我就是不能让它正常工作。如果再多花点时间,这可能是可行的。

不管怎样,看看这能不能帮你找到你想去的地方?

SO网友:wyrfel

You can try this:

add_filter(\'posts_orderby\', \'enforce_specific_order\');
$posts = get_posts($args);
remove_filter( current_filter(), __FUNCTION__ );

function enforce_specific_order($orderby) {
    global $wpdb;
    return "FIND_IN_SET(".$wpdb->posts.".ID, \'1,3,8,4,12\') ASC";
}
SO网友:Pablo S G Pacheco

我认为这是以定义的顺序返回get\\u帖子结果的最快方法。除此之外,这是一个本地解决方案,没有黑客攻击

<?php

$posts_order = array(\'1,3,8,4,12\');
$args = array(
    \'post__in\' => $posts_order,
    \'orderby\' => \'post__in\'
); 
get_posts( $args ); 

?> 

SO网友:Dalton Rooney

从WordPress 3.5开始,此功能现在已成为核心。您可以使用“post\\uu-in”参数显式排序帖子。http://core.trac.wordpress.org/ticket/13729

SO网友:Dougal Campbell

清理一下orderby 带过滤器?在查询帖子之前,输入:

add_filter(\'posts_orderby\', \'__return_false\');
然后,循环完成后:

remove_filter(\'posts_orderby\', \'__return_false\');
再次删除过滤器的原因是为了防止页面上有其他循环(例如来自小部件的循环)需要其正常的显式排序。

结束

相关推荐

Problem with WP_Query sort

我为页面编写了以下自定义查询- $menu_loop = new WP_Query( array( \'post_type\' => \'page\', \'posts_per_page\' => 50, \'post_parent\' => 616, \'order_by\' => \'post_title\', \'order\' => \'ASC\' ) ); while ($menu_loop->have_posts()) : $menu_l