インデックスページで特定のカテゴリを除外して、投稿日付の新しい記事から順番に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にすることができました。
丁寧なサポートありがとうございました。