まだ、諦めてません。演劇感想文リンクのWORDPRESS化計画。
なんか、予想以上に手間取っていますが、一応すすめています。その中で、WORDPRESS内の投稿(ページを)50音順に並べる方法を調べてなんとか実装できそうなので、メモを残しておきます
目次
20000ページ近いページのインデックスが必要
演劇感想文リンクは、ページ数としては、既に20000ページ近いページがあります。特に公演のページは、それだけでも、15000以上のページ数になります。
当然、みつけたいページを探すには、WORDPRESSの検索窓を利用する事が一番多いと想うのですが、それ以外にも目的の公演情報や俳優さんのページを探し出せるようにする必要があります。
その為、今の演劇感想文リンクにも50音順で公演を並べ替えています。
例えば、以下のようなページがそうです。
「あではじまる公演の一覧」(あで始まる公演だけで984 個もあるのですが…)
WORDPRESSで50音順に投稿を並べるには。
今のホームページは、rubyで、50音順に並べるページを作っていますが、さすがに、それと同じものを固定ページに貼り付けるのは芸がないので、なんとか、WORDPRESSの機能でそれを実現しようと色々ググってみました。
結論としては、記事にカスタムフィールドの「yomi」を設定して、ひらがなでのふりがなを振った上で以下のコードをfunction.phpに記述する事で、公演情報のページ(投稿)を50音順で並べ替えられるようにできました。
/**並べ替え方を変える(フリガナ順)**/ function change_posts_per_page($query) { /* 管理画面,メインクエリに干渉しないために必須 */ if ( is_admin() || ! $query->is_main_query() ){ return; } /* カテゴリーページの表示を読み仮名(50音順)に並べる */ if ( $query->is_category() ) { $catid =$query->get_queried_object_id(); // カテゴリIDを取得 if($catid==2){ //カテゴリID2は、公演 $query->set( 'meta_key', 'yomi' ); $query->set( 'orderby', 'meta_value' ); $query->set( 'order', 'ASC' ); } return; } } add_action( 'pre_get_posts', 'change_posts_per_page' );
コードの説明
20行目は、フックと呼ばれる手法です。”pre_get_posts”というのは、投稿(posts)を取得する前に、処理を挿入するという意味です。この場合、投稿取得をする前に、”change_posts_per_page”という処理を挿入しますという宣言になります。
その”change_posts_per_page”の中で、抽出するposts(投稿)を抽出しますが、その条件を設定します。
3行目〜6行目は、管理画面等別の画面に影響を及ぼさない為に必ず含める必要のある行です。
9行目は、どのページがこの関数の対象になるかを決めるif文です。
“is_category”は、カテゴリー内の投稿一覧画面であることを示します。
10行目は、カテゴリーIDを取得します。最終的には全ての投稿に読み仮名をつけるつもりですが、今回はテスト的に公演カテゴリーに含まれるページにのみ読みを設定したので、まずはカテゴリーID=2(公演)のものだけを対象とする処理にしました。
カテゴリーIDの確認は、以下の画面でチェック可能です。
ダッシュボードのカテゴリーを選択し、今回の対象としたいカテゴリ(公演)上にマウスポインタを置いた時に、対象IDを見ることができます。
これで、ID=2が公演を示すことが確認できたので、11行目でそれを特定した上で、条件指定をしました。
フリガナで並べ替えるためのカスタムフィールドの設定
日本語は、タイトルで並べ替えれば、利用者が想定しているとおりにならばなかったりします。漢字のタイトルでは、読み仮名が無いときちんと並べ替えができません。そのため、カスタムフィールドとして”yomi”を設定してい、そちらを利用して並べ替えに利用しました。
カスタムフィールドの設定で”yomi”が設定されている状態は、個々の投稿画面上では、以下のように表示されます。
wordpressの個々の記事へのカスタムフィールドの設定については、他の記事で色々語られているので、個々では詳述は避けますが、”yomi”というフィールドにひらがなでの読み仮名を設定していそれ順で並べるという設定になります。
この”yomi”という名前の項目で、昇順に並べ替えるためのコードが12行目〜14行目になります。
逆順の並び順は設定できるが、昇順が設定できない!?
実は、14行目の以下のコードは、少しハマりました。
$query->set( 'order', 'ASC' );
色々ググったあげくに、カスタムフィールドで取得投稿(ページ)を並べ変えるための、コードとして以下のサイトを参考にしました。
こちらのサイトでは、以下のようなコードが記載されていました。
/** * @param $wp_query WP_Query */ function myaction_category_sortorder( $wp_query ) { if( is_admin() ){ return $wp_query; } if( $wp_query->is_main_query() && $wp_query->is_category() ){ $wp_query->set( 'meta_key', 'itemsortno' ); $wp_query->set( 'orderby', 'meta_value' ); $wp_query->order( 'order', 'DESC' ); } return $wp_query; } add_action( 'pre_get_posts', 'myaction_category_sortorder' );
ほぼ、これをコピペで、コードを作成したのですが、実は、このコードバグがあります。
13行目は、
$wp_query->order( ‘order’, ‘DESC’ );
と記載されていますが、本来は、以下のように書くべきです。
$wp_query->set( ‘order’, ‘DESC’ );
orderであっても、set文でorder方向を記載すべきなのです。
じゃ、元のブログでなぜこのコードがOKだったかというとWordpressは、並び順は初期値が「DESC」なのです。その為、コード的に誤っている「order(‘order’,’DESC’)」が、通っていたのは、初期値だったので気づかなかっただけだったようです。(このコードが効いていなくても、初期値が効いて逆順ソートされていた。)
当初、単純にDESC⇒ASCに変更すれば簡単に並び順が変わると思っていたのですが、簡単に行きませんでした。
このコードにバグがあることに気づけたのは、以下の記事がきっかけでした。
こちらの記事中で、”order”の設定も、普通にset文でsetをしていることに気づいて、先程のバグを修正しました。
まだ、先は長い
とりあえず、公演情報をあいうえお順にならべることにはめどがついたのですが、15000ページがあいうえお順に並んでればよいといううわけではなさそうです。(自分でも、探しきれない)
その為、検索のための固定ページ等を作成しないといかないような気がするのですが、スマホ等でのアクセスも考慮した固定ページの設計については、別途検討したいと思います。
参考にしたページ
えらく、簡単に書きましたがここまで至るのに結構いろんなページを参考にしました。以下に上記以外で参考にしたページを紹介します。
50音順に並べるとWORDPRESSで検索して見つけた記事。
ただ、このPHPのスクリプトをどのようにWPに適用スべきかわからなかった時に探し出したのが、こちらのページ。function.phpに記載すること、今ではpre_post_getというフックを使うべきと言うことがわかりました。
[…] 演劇とかの感想文ブログ [WORDPRESS]投稿を50音順に並べるhttp://blog.kansolink.com/develop/wordpress/how-to-order-by-50on/まだ、諦めてません。演劇感想文リンクのWORDPRESS化計画。なんか、予想以 […]