问题描述
我试图创建一个明确的订单帖子循环,例如:
<?php $args = array(
'include' => '1,3,8,4,12' ); ?>
<?php get_posts( $args ); ?>
结果按日期默认排序,并且没有 orderby 选项按照输入的顺序返回帖子。在 Trac 中发布了关于此的多个错误/功能请求,但到目前为止还没有运气。我已经在核心文件中弄脏了一些,但是还没有得到它。
任何人都可以为此行为人提出解决方法?
干杯,道尔顿
最佳解决方案
好的,我决心找到一个办法,我想我已经有了。我曾经希望找到一个更简单的解决方案,并避免使用新的 WP_Query 对象,但它只是根深蒂固的循环如何工作。首先,我们有几个效用函数:
// 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%20the_permalink();%20?>"><?php the_title(); ?></a> Post ID: <?php the_ID(); ?>
</div>
<?php
endwhile;
wp_reset_postdata();
很明显,你会在那里修复循环模板代码。
我希望找到一个不需要使用自定义查询对象的解决方案,也许通过使用 query_posts()
和替换全局 $wp_query
上的 posts
属性,但是我无法让它正常工作。有更多的时间来处理它,这可能是可行的。
无论如何,看看这是否会让你需要去哪里?
次佳解决方案
你可以试试这个:
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";
}
第三种解决方案
我认为这是按照定义的顺序返回 get_posts 的结果的最快方式。除此之外,它是一种本地解决方案,没有黑客
<?php
$posts_order = array('1,3,8,4,12');
$args = array(
'post__in' => $posts_order,
'orderby' => 'post__in'
);
get_posts( $args );
?>
第四种方案
至于 WordPress 3.5,这个功能现在是核心的。您可以使用”post__in” 参数显式订购帖子。 http://core.trac.wordpress.org/ticket/13729
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。