web-dev-qa-db-ja.com

事前定義された順序での投稿の照会

私は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は私が上に投稿した配列です。

投稿をクエリしてそれらを配列順に表示するようにコードを変更する方法を教えてください。

4
Imran

クエリが少数の投稿数にのみある場合は、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);

3.5以上

WordPress 3.5では、orderbyに対してWP_Queryが追加の値として 'post__in'を受け入れたことがわかります。このTracのチケットを見てください: http://core.trac.wordpress.org/ticket/13729

4
Stephen Harris

結果の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

それが役に立つことを願っています。乾杯!

1
kovshenin

@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サイトでそれを自分でテストしました、そしてそれは予想通りに動作します。

0
jmarceli

これを達成するためのより簡単な回避策は次のとおりです。単純に同じ名前でこれらの投稿のそれぞれにカスタムフィールドを作成し、希望の順序を設定してください。

  • id = 17983の投稿の場合、my_custom_order = 1というカスタムフィールドを設定します。
  • iD = 18030の投稿の場合、my_custom_order = 2というカスタムフィールドを設定します。
  • iD = 18016の投稿の場合、my_custom_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'
);

注: これを実行すると(これらの投稿のカスタムフィールドを設定すると)、カスタムフィールドが'post__in' => $post_ids,の投稿のみがデータベースから照会されるため、my_custom_orderパラメータを削除できます。

0
Bainternet

まず第一に、query_posts()を使わず、 WP_Query() を使ってください。

次に、配列を投稿IDだけに変更します。

から:

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

array( 17983, 17932 )

EDIT_ここ_ を参照してください。

0
Xhynk