問題描述
我試圖建立一個明確的訂單帖子迴圈,例如:
<?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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。