私はquery_posts関数を使用して、投稿IDで検索する10の特定の投稿を一覧表示しています。
このような配列があります。
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_idsは私が上に投稿した配列です。
投稿をクエリしてそれらを配列順に表示するようにコードを変更する方法を教えてください。
クエリが少数の投稿数にのみある場合は、Alexによるリンクのようにphpでソートできます。ただし、これは適切な規模ではありません。
Kovsheninが示唆しているように - もっと良い方法はposts_orderby
filterを使うことです:
$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では、orderby
に対してWP_Query
が追加の値として 'post__in'を受け入れたことがわかります。このTracのチケットを見てください: http://core.trac.wordpress.org/ticket/13729
結果のSQLクエリをposts_orderby
中にハイジャックし、配列からカンマ区切りのリストを持つMySQLのORDER BY FIELD()
関数を使用する必要があります。これがFIELD
関数についてのより多くの情報です: http://www.electrictoolbox.com/mysql-order-specific-field-values/
Sphinxに関連性の高い順に並べられた投稿IDのリストを返させるようにしたのはかなり前のことでしたので、WP_Query
を付けてそれらを同じ順序で選択する必要がありました。 posts_orderby
フィルターの間のFIELD()
は魅力のように働きました。
また、メインのクエリを変更するためにquery_posts
を使用しているのであれば、それを行うのが最善の方法ではありません。 @Alexは、WP_Query
について言及しました。これは、query_posts
とはそれほど違いはありません。また、メインクエリを変更する(あなたのように見せる)ための悪い方法でもあります。
正しい方法は、pre_get_posts
アクションを使用し、参照渡し$query
オブジェクトを変更することです。あなたはここpre_get_postsについてもっと学ぶことができます: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
それが役に立つことを願っています。乾杯!
@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サイトでそれを自分でテストしました、そしてそれは予想通りに動作します。
これを達成するためのより簡単な回避策は次のとおりです。単純に同じ名前でこれらの投稿のそれぞれにカスタムフィールドを作成し、希望の順序を設定してください。
次に、クエリ内でそのカスタムフィールドで単純に並べ替えます。
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'posts_per_page' => 10,
'meta_key' => 'my_custom_order',
'orderby' => 'meta_value',
'order' => 'ASC'
);
注: これを実行すると(これらの投稿のカスタムフィールドを設定すると)、カスタムフィールドが'post__in' => $post_ids,
の投稿のみがデータベースから照会されるため、my_custom_order
パラメータを削除できます。
まず第一に、query_posts()
を使わず、 WP_Query()
を使ってください。
次に、配列を投稿IDだけに変更します。
から:
[0] => 17983
[1] => 17932
に
array( 17983, 17932 )
EDIT: _ここ_ を参照してください。