query_postsを使ってしまうと表示する記事をゼロから設定することになります。
カテゴリ一覧ページはすでに「あるカテゴリの一覧を表示させる」というフィルターがかかっていますから、このフィルタを引き継いだまま順序を変える必要があります。
そういった場合にはpre_get_postsというのを使うと行けます。
以前の質問にある参考リンクが有益です。
https://ja.forums.wordpress.org/topic/23237?replies=6
ちょっとわかりにくいですが試してみてください〜。
hogetanさんご返答ありがとうございました!
pre_get_posts を使えば良いということ理解いたしました。
functions.phpに下記コードを入れてみたのですが、新着順にしか表示されず、どのようにして良いのか分からなくなってしまいました。
//カテゴリの一覧を50音順に
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' );
function custom_query_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
if ( is_category('dictionary') ) {
$orderby = $query->get( 'orderby' );
if ( empty($orderby) ) {
$query->set( 'orderby', 'title' );
}
$order = $query->get( 'order' );
if ( empty($order) ) {
$query->set( 'order', 'ASC' );
}
}
}
}
※参考サイト:http://morilog.com/wordpress/tips/custom_parse_query/
どこを直せば良いのか、お力をお貸し頂ければ幸いです。
お手数ですが、どうぞ宜しくお願いいたします。
pre_get_postsはなかなか分かりにくいのですが、早速コードを書かれたようで良いですね。
ここから先はデバッグを含めていくことになるかと思います。
まずは
if ( !is_admin() && $query->is_main_query() ) {
if ( is_category('dictionary') ) {
この部分がうまく通っているか確認してみましょう。
//カテゴリの一覧を50音順に
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' );
function custom_query_pre_get_posts( $query ) {
$query->set( 'orderby', 'title' );
}
とした場合に該当のページ、その他のページ全てがタイトル順になるか調べてみてください。
これでうまくいけば is_category('dictionary')
、それから $query->is_main_query()
を疑っていきましょう。
この辺りはケースバイケースなのでちょっと大変ですね 🙂
hogetanさん、ご返答ありがとうございます。
is_category(‘dictionary’)から「dictionary」を削除したら、
無事にタイトル順に表示されました。
お助け頂き本当にありがとうございました!