投稿記事の並び順をカスタムフィールドを利用して並び替える方法(WordPress)
昔のことだが、WordPressでカテゴリーによってフリガナ順や投稿日時によらず日付順に並び替えを行って欲しいと言う要求があった。その時のメモ
試したこと
WordPressのカテゴリー記事の並び順を変更するプラグインとして以下の3つを発見した
まずCustom Query String Reloadedというものを試すと、一番目的に合っているのだがカスタムフィールドで並び替え出来ない。。。
次にaStickyPostOrderERを試すが、記事を一つ一つ順番を指定するにはぴったりだが、一つ一つ指定するのはしんどいのでパス。
次にWP Smart Sortを試してみるが、このプラグインを使用すると管理画面、全てのカテゴリの記事の順番が変わってしまう。。。。premiumバージョンがあるのだが、これも適さないっぽい。余談だが有料だ。
改造記録
プラグインでカスタムフィールドを使い並び替え出来る物が発見できなかったので、一番惜しい(?)Custom Query String Reloadedを改造することに。。。
前提として並び替えに使用するカスタムフィールドのkeyをfuriganaとします。
まずcustom-query-string-reloaded.phpの48行目を以下のように改造。furiganaという値を$orderbys配列に加えています。
var $orderbys = array('date','category','title','author','furigana');
次にcustom-query-string-reloaded.phpのcustom_query_string関数を以下のように改造。
function custom_query_string($query_string) {
$this->init($query_string);
/*
* Check if have a custom query for this category then check
* if have a custom query and only add it if it exsists.
*/
if ( $this->category )
$this->option = $this->options[$this->category];
elseif ( $this->query )
$this->option = $this->options[$this->query];
if ( $this->option ) {
$custom_query_string = array(
'posts_per_page' => $this->option['posts_per_page'],
'what_to_show' => $this->option['what_to_show'],
'orderby' => $this->option['orderby'],
'order' => $this->option['order']
);
//furiganaでソートするために追加したコード
if ($this->option['orderby'] === 'furigana') {
$custom_query_string['meta_key'] = 'furigana';
}
//furiganaでソートするために追加したコード終了
/*
* Make sure we don't override any queries already set. Merge
* the original query vars to the new ones. Then build the string
* from the new array.
*/
$this->query_vars = array_merge($custom_query_string,$this->query_vars);
$this->query_string = $this->build_query_string($this->query_vars);
}
return $this->query_string;
}
解説すると、WordPressはget_posts関数で記事を取得します。Custom Query String Reloadedプラグインのcustom_query_string関数ではget_posts関数実行前にget_posts関数に渡すパラメータを変更しています。カスタムフィールドで並び替えするにはorderbyパラメータに並び替えしたいカスタムフィールドのkeyを指定し、meta_keyパラメータにもカスタムフィールドのkeyを指定する必要があります。
そのためorderbyでfuriganaが指定された場合、metakeyパラメータにfuriganaを与えています。
画面キャプチャ
Custom Query String Reloadedの設定画面
並び替え前
並び替え後(furigana降順)
最後に
本当は抜粋で並び替えしていたのですが、WordPressを改造する力技なので気になっていたのと、ちょうどフォーラムで質問を見かけたので作り直しました(汗
あとはテーブルデータ変更バッチ作らなきゃ(汗
そういえば、予測で答えてちゃんとした回答してないなぁ。。。ポインタは書いてあるし、まっ、いっか(おぃ
お勧め商品・サービス
あわせて読む
3件のトラックバック
-
[ワードプレス][プラグイン]投稿した記事の順番も自由に変えたい
カテゴリ、ページ、リンクの順番を変えるプラグインに無かったのが、投稿した記事の順番を自由に買えるプラグイン。 ブログシステムであるWordPressを使って、サイトを運営する際、特…
-
[...] ポスト一覧画面のカスタマイズ WordPress管理画面の投稿記事一覧をカスタマイズする WordPress管理画面の投稿記事一覧をカスタマイズする [...]
コメント投稿


2件のコメント
私も同じ問題で突き当たっていてこちらも大変参考にしていただきました。
ところで、いろいろ調べていたんですが、
query_postsに
「orderby=meta_value」と「meta_key=カスタムフィールド名」で並び順が変更できることに気がつきました。クライアントが変更したりする必要がなく、固定でいいなら使えると思います。また、query_postsの書き換えなら簡単にユーザーにセレクトさせることもできそうです。ご参考までに。
ご親切にコメントありがとうございます。
参考までにさらに追加すると、custom-query-string-reloadedプラグインでは、custom_query_stringメソッドでクエリ文字列を組み立てて、WordPressで自動実行されるget_postsに渡しています。
以下のようにしてクエリ文字列を書き換えているので
add_filter('query_string', array(&$this, 'custom_query_string'));
以下のようなコードをfunction.phpに追加するとプラグインを使用しなくてもカテゴリ並び替えが出来ます。
テンプレートのカテゴリを表示する前に別にget_postsを発行し、グローバルの$postsを書き換えてしまう方法もあるのですが、クエリが余分に発行される上、他のプラグインやウィジェットで何かと問題を起こしそうなのでお勧めしません。。。
add_filter('query_string', 'myquery');
function myquery()
{
//クエリ作成
return $query;
}
custom_query_stringを使ったのはカテゴリ個別に管理画面で並び順や表示記事数を制御したかったから。。。
作るの面倒ですからね。。。
少し書き直そうと思っていてそのままだったので、ついでに(汗