2016-10-11 3 views
0

特定のWooCommerceカテゴリから最新の製品IDを取得しようとしています。何らかの理由で、ページが読み込まれるたびに、私は別の製品IDを取得し、最新のIDは取得しません。ここでWP_Queryはposts_per_page引数を持つタクソノミークエリのランダムIDを返します

はWP_Queryの引数である:

array(
    'post_type' => 'product', 
    'posts_per_page' => 5, 
    'tax_query' => array(
     array(
      'taxonomy' => 'product_cat', 
      'field' => 'slug', 
      'terms' => 'a-product-category' 
     ) 
    ), 
    'orderby' => 'date', 
    'order' => 'ASC' 
) 

これは、次のSQLクエリを生成:私が言ったように

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
LEFT JOIN wp_term_relationships 
ON (
    wp_posts.ID = wp_term_relationships.object_id 
) 
WHERE 1=1 
AND (
    wp_term_relationships.term_taxonomy_id IN (259,260,262) 
) 
AND wp_posts.post_type = 'product' 
AND (
    wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' 
) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date ASC 
LIMIT 0, 5 

を、ポストIDが(彼らはしかし適切なカテゴリからのもの)は常に多少異なります返さ。私が理解していることは、このクエリの正しい動作は、指定されたカテゴリから最新の5つの投稿を返すことです。

WordPressまたはプラグインの問題を排除するためにSQLサーバーで直接クエリを実行しましたが、まだランダムなポストIDを取得しています。

tax_queryを削除(wp_term_relationship関連のSQLコマンドを削除)するか、posts_per_pageを-1(LIMIT 0,5を削除)に設定すると、postidの順序が正しいようです。

しかし、これは私の開発サーバー上で動作するはずです。これは、プロダクションサーバ(ホスティングプロバイダとMySQL 5.6.32としてWPengineを使用する)で発生します。

アドバイスはありがたいです、ありがとうございます!

答えて

0

これは、一意でないデータでORDER BYを実行しようとすると結果が異なる可能性があるためです。特にクラスタ化されたMySQL環境(私はWPengineが使用していると思う)で推測します。この場合、post_dateは、インポートするためにインポートを使用したため、複数のポストに沿って同じでした。同じことが、価格で商品を並べ替えようとしたときに起きましたが、一部の商品は同じ価格でした。

'order_by' => 'date ID' 

に変換します:

だから、WP_Queryでこの問題を解決するために、私はORDER_BY引数へのフォールバックを使用

ORDER BY wp_posts.post_date ASC, wp_posts.ID ASC 

詳しい情報はここで見つけることができます:https://bugs.mysql.com/bug.php?id=69732

関連する問題