web-dev-qa-db-ja.com

ループ内でのWP_Query order by post__inの無効化

ホームページのカスタム投稿配列をクエリして、配列の順序を維持しようとしています。ある程度はこれでうまくいきます、WordPressは投稿を見つけますが、ループでは順番がすべて混乱しています。

まず最初に、私はpre_get_postsフックを使ってホームページのメインのクエリを変更しています。これは次のようになります。

if ( is_home() && $query->is_main_query() ) {
    $query->set( 'post_type', array( 'post', 'page', 'product' ) );
    $query->set( 'post__in', array( 103, 14, 127, 115 ) );
    $query->set( 'orderby', 'post__in' );
}

ホームページ上の注文はすべて混乱しています!指定された配列に従うことも、発行日に従うこともありません(これがデフォルトです)。代わりに、それは127、103、14、115です。

何が起こったのかを確認するためだけに、ホームページでglobal $wp_queryをvar_dumpedしましたが、問い合わせたSQLは実際には

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID
FROM wp_posts
WHERE
    1=1 AND wp_posts.ID IN (103,14,127,115)
    AND wp_posts.post_type IN ('post', 'page', 'product')
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private')
ORDER BY FIELD( wp_posts.ID, 103,14,127,115 )
LIMIT 0, 10

だから問題ありません!それがまさに起こるべきことです。 $wp_query->postsの投稿の配列は、順序が間違っています。

カスタム投稿タイプ'product'がクエリに含まれていることに気付くかもしれません。それは原因ですか?どこを見ればいいですか?

4
Max

Orderbyをpost__inに設定します。これはpost__in配列(バージョン3.5で利用可能)で与えられたポストIDの順序を保持します。

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'post__in' 
);
16
Akin Adebowale

私の悪いことに、古い関数をthe_postsにフックして、それ自身のソートをしました。古いコードを削除するのを忘れました。これでうまくいっています。

0
Max