サポート » 使い方全般 » querypostで特定のカテゴリを除外するとソートが機能しない

  • 解決済 imo

    (@imo)


    query_posts関数を使用し、以下のようなコードを記載したところ
    ソート方法がASCで固定されてしまいます。

    order=DESCが有効にならない原因はなんでしょうか?

    query_posts( “cat=-17&orderby=date&order=DESC&posts_per_page=8” );
    ※カテゴリーID17を除外しています。

    catの指定がなければソートは機能します。
    特定のカテゴリを除外した状態でソートが機能するようにしたいです。

    どなたかご存知でしたら教えて頂きたいのですが、可能でしょうか。
    ちなみに海外のフォーラムもみたのですが、解決できませんでした。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • インデックスページで特定のカテゴリを除外して、投稿日付の新しい記事から順番に8件ずつ表示したいのでしょうか?
    デフォルトで日付dateによる降順DESCでリクエストされますので、orderbyとorderの指定は必要ありません。
     
    query_posts( “cat=-17&posts_per_page=8” );
     
    こちらでは上記で動作しますし、orderbyおよびorderの指定があっても正常に動作します。
    正しく動作しない場合は他の部分に原因があると思いますので、前後のソースも提示した方がいいです。
    オリジナルのテーマを利用しているのでしょうか?
    WP標準のテーマtwenty elevenではどうなりますか?

    トピック投稿者 imo

    (@imo)

    popupさん回答ありがとうございます。

    オリジナルテーマ以外でもカテゴリーをexludeすると(twenty eleven)
    ソート順がASCに固定されてしまう現象が発生しました。

    wordpressのコアファイルに問題があるのでしょうか?

    以下の方法で検証を行いました

    テーマtwenty elevenを使用
    テーマフォルダのindex.phpに以下のコード挿入

    <div id=”container”>
    <div id=”content” role=”main”>
    <?php wp_reset_query();?> //追加した部分
    <?php

    query_posts( “cat=-4&posts_per_page=8” ); //追加した部分
    /* Run the loop to output the posts.
    * If you want to overload this in a child theme then include a file
    * called loop-index.php and that will be used instead.
    */
    get_template_part( ‘loop’, ‘index’ );
    ?>
    </div><!– #content –>
    </div><!– #

    念のためwp_resetでクエリをリセットしましたが結果変わらず。
    何が原因なのかさっぱりわかりません。

    上記のコードですとTwenty Tenですので、Twenty Tenのindex.phpに同じように記述して確認した所、期待した結果が得られました。
    同じバージョンの3.3.1で問題が発生していませんので、コアファイルおよびデフォルトテーマの問題ではないと思います。
    WP本体を改造しているのでしょうか?
    [wp-includes/query.php]の2632行目の直前でも直後でもいいので、$this->requestを出力するコードを記述してからインデックスページにアクセスして、どのようなSQL文が生成されているか確認してください。(次の行の前でも後でもいいです。)

    $this->posts = $wpdb->get_results($this->request);

     
    次のようなSQL文が生成されていれば、SQL文に問題はないと思います。
    (ORDER BY [Prefix]_posts.post_date DESC がありますか?)

    SELECT SQL_CALC_FOUND_ROWS [Prefix]_posts.* FROM [Prefix]_posts WHERE 1=1 AND ( [Prefix]_posts.ID NOT IN ( SELECT object_id FROM [Prefix]_term_relationships WHERE term_taxonomy_id IN ( [除外するカテゴリーおよび子カテゴリのタームタクソノミーID] ) ) ) AND [Prefix]_posts.post_type = 'post' AND ([Prefix]_posts.post_status = 'publish' OR [Prefix]_posts.post_status = 'private') GROUP BY [Prefix]_posts.ID ORDER BY [Prefix]_posts.post_date DESC LIMIT 0, 8

    日付でのDESCになっていたら、phpMyAdminなどでデータベースにアクセスして、生成されたSQLを直接実行し、期待した結果が返ってくるか確認してみてください。
     
    wp_reset_query()は変更したメインクエリを元に戻す時に使用しますので、上記のように前方でメインクエリを書き換えていない場合は、記述する必要がありません。
    追加するとすれば、get_template_part( ‘loop’, ‘index’ );の後に別のテンプレートを読み込み、そちらでは標準のメインクエリで記事を表示するという場合に、変更したメインクエリのループの終了後、別のテンプレートを読み込む前(あるいは読み込むテンプレートでループ開始前)の部分に記述します。

    ついでに、$this->postsも出力して確認するといいです。
    リクエストの結果が入っています。($this->requestは前後どちらでもいいのですが、$this->postsは必ず後ろで出力してください。)

    トピック投稿者 imo

    (@imo)

    回答ありがとうございます。

    sqlのリクエストを確認したところ読み込み段階でASCになっていることがわかりました。
    修正後、特定のカテゴリを除外している状態でDESCにすることができました。

    丁寧なサポートありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「querypostで特定のカテゴリを除外するとソートが機能しない」には新たに返信することはできません。