記事一覧をソート(並び替え)する
サンプルページにあるように、ドロップダウンメニューから記事の並び替えを行ないます。
並び替えのプラグインは、「wp smart sort」という
プラグインが、昔はあったのですが 現在のWordPressのバージョンに対応しなくなってしまいましたので、プラグインを使わずに並び替え(ソート)をするようにしました。
ですので、今までのカスタマイズに比べ、難しい内容になっていますのでご注意ください。
事前準備として、パーマリンク設定をデフォルト以外にしてください。今回作るソート(並び替え)は、PHPのGET変数を利用したソートですので、URLにhttp://blog.anekipedia.com/cus?narabi=sort1 というように、「?」を使って変数を記憶させています。
ですので、パーマリンクの設定がデフォルトのhttp://blog.anekipedia.com/?p=123 のような記事では利用することができません。
パーマリンクの設定を変更して使ってみてください。
(私のサイトのパーマリンク設定は、コチラの記事に載ってますので参考にしてください。)
設定の変更の仕方は、管理画面の「設定」「パーマリンク設定」からおこなえます。
変更する際は、「Permalinks Moved Permanently」などのプラグインを利用すると
自動的に前記事のURLにアクセスさせた時リダイレクトしてくれるので
おすすめです。
ソート(並び替え)に必要な知識
今回、ソート(並び替え)を作るにあたって必要な知識は、以下の項目です。
Formタグ(HTMLタグ)
ドロップダウンメニューを作るのに必要なものです。
phpの簡単な知識(変数に値を入れる、If関数 程度)
選んだメニューから受け取った値をquery_postに渡すのに必要です。
カスタムフィールド(記事ごとに自由に設定できる項目)
コレを記事ごとに設定することで、五十音順などいろいろな
並び替えが可能になります。
query_posts(WordPressテンプレートタグ)
このタグが記事の一覧を並び替えるタグです。
このタグに渡す値を動的に変更することで記事を並び替えます。
それぞれの基礎的な情報は、各記事のリンクで確認してください。
ソート(並び替え)を作ってみる
それでは、実際に作ってみましょう。まずはソートの選択項目を決めます。
今回は、単純に次の6項目でのソートを想定して作ります。
投稿日時が新しい順
投稿日時が古い順
五十音順(あ~わ)
五十音順(わ~あ)
アクセス数の多い順
アクセス数の少ない順
並べ替えの仕方は、 query_postsを使い、次のように並び替えます。
投稿日時が新しい順
<?php query_posts(‘order=DESC’);?>
投稿日時が古い順
<?php query_posts(‘order=ASC’);?>
五十音順(あ~わ)
<?php query_posts(‘order=ASC&orderby=meta_value&meta_key=furikana’);?>
カスタムフィールドの「furikana」を使って並び替えします。
「furikana」の値には、タイトルを「ひらがな」で書いたものを記入しておきます。
五十音順(わ~あ)
<?php query_posts(‘order=DESC&orderby=meta_value&meta_key=furikana’);?>
カスタムフィールドの「furikana」を使って並び替えします。
「furikana」の値には、タイトルを「ひらがな」で書いたものを記入しておきます。
アクセス数の多い順
<?php query_posts(‘order=DESC&orderby=meta_value_num&meta_key=views’);?>
プラグインのWP-PostViewsがカスタムフィールド(名前:views)でアクセス数を
カウントするのを利用してアクセス順の並び替えをします。
アクセス数の少ない順
<?php query_posts(‘order=ASC&orderby=meta_value_num&meta_key=views’);?>
プラグインのWP-PostViewsがカスタムフィールド(名前:views)でアクセス数を
カウントするのを利用してアクセス順の並び替えをします。
続いて、1ページに表示する記事数を設定します。
query_postsのパラメータのposts_per_pageを使い1ページにおける最大表示数を設定します。
下準備: すべての記事にカスタムフィールド名「furikana」でタイトルの「ふりがな」 の値を記入しておく
プラグインのWP-PostViewsをインストールして「有効化」する
以上の内容でソート(並び替え)の記述を作ります。
<form name="irekae" method="get" id="sort_form5" class="sort_form5"> <select name='narabi' onChange="document.forms['irekae'].submit()" > <option value="sort1"<?php if(!isset($_REQUEST['narabi']) || $_REQUEST['narabi'] == 'sort1') echo ' selected="selected"';?>>投稿日時が新しい順</option> <option value="sort2"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort2') echo ' selected="selected"';?>>投稿日時が古い順</option> <option value="sort3"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort3') echo ' selected="selected"';?>>五十音順(あ~わ)</option> <option value="sort4"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort4') echo ' selected="selected"';?>>五十音順(わ~あ)</option> <option value="sort5"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort5') echo ' selected="selected"';?>>アクセス数の多い順</option> <option value="sort6"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort6') echo ' selected="selected"';?>>アクセス数の少ない順</option> </select> </form> <?php $sortset = $_GET['narabi']; ?> <?php $sortall = array( "sort1" => 'order=DESC&posts_per_page=6&paged=', "sort2" => 'order=ASC&posts_per_page=6&paged=', "sort3" => 'order=ASC&orderby=meta_value&meta_key=furikana&posts_per_page=6&paged=', "sort4" => 'order=DESC&orderby=meta_value&meta_key=furikana&posts_per_page=6&paged=', "sort5" => 'order=DESC&orderby=meta_value_num&meta_key=views&posts_per_page=6&paged=', "sort6" => 'order=ASC&orderby=meta_value_num&meta_key=views&posts_per_page=6&paged=' ); ?> <?php if($sortset != '') { $sort = $sortall[$sortset]; } else { $sort = $sortall["sort1"];} ?> <!-- <?php echo $sort; ?> ソートてすと用--> <?php query_posts($sort . $paged); ?>
ソート(並び替え)用の記述です。コピペして、ループ記述より上に記入してください。
/* wp smart Sort ソート順番の位置 */ div#sort_form2 p.title { margin: 0px 0px 3px 0px} #sort_form { margin: 0px 20px 3px 20px; display: inline } div#sort_form4 p.title { margin: 0px 0px 3px 0px} #sort_form3 { margin: 0px 10px 3px 0px; float:right} div#sort_form6 p.title { margin: 0px 0px 6px 0px} #sort_form5 { margin: -25px 10px 3px 0px; float:right}
フォームタグ用に設定したCSSです。コピペして参考にしてください。
ソート(並び替え)の初期選択肢を変更する
過去ログなどのページでは記事が新しい順で並ぶより、古い順に並んだ方が好まれたりします。
ここでは、記事の順番を古い順にした時の記述を記入しておきます。
<form name="irekae" method="get" id="sort_form5" class="sort_form5"> <select name='narabi' onChange="document.forms['irekae'].submit()" > <option value="sort1"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort1') echo ' selected="selected"';?>>投稿日時が新しい順</option> <option value="sort2"<?php if(!isset($_REQUEST['narabi']) || $_REQUEST['narabi'] == 'sort2') echo ' selected="selected"';?>>投稿日時が古い順</option> <option value="sort3"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort3') echo ' selected="selected"';?>>五十音順(あ~わ)</option> <option value="sort4"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort4') echo ' selected="selected"';?>>五十音順(わ~あ)</option> <option value="sort5"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort5') echo ' selected="selected"';?>>アクセス数の多い順</option> <option value="sort6"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort6') echo ' selected="selected"';?>>アクセス数の少ない順</option> </select> </form> <?php $sortset = $_GET['narabi']; ?> <?php $sortall = array( "sort1" => 'order=DESC&posts_per_page=6&paged=', "sort2" => 'order=ASC&posts_per_page=6&paged=', "sort3" => 'order=ASC&orderby=meta_value&meta_key=furikana&posts_per_page=6&paged=', "sort4" => 'order=DESC&orderby=meta_value&meta_key=furikana&posts_per_page=6&paged=', "sort5" => 'order=DESC&orderby=meta_value_num&meta_key=views&posts_per_page=6&paged=', "sort6" => 'order=ASC&orderby=meta_value_num&meta_key=views&posts_per_page=6&paged=' ); ?> <?php if($sortset != '') { $sort = $sortall[$sortset]; } else { $sort = $sortall["sort2"];} ?> <!-- <?php echo $sort; ?> ソートてすと用--> <?php query_posts($sort . $paged); ?>
投稿日時が古い順を初期選択肢にするには、次のようになります。
検索ページでのソート(並び替え)の設定
検索ページでは、すでに、URLに検索キーワードを渡されていますので、フォームタグを
使って「GET」で渡そうとするとうまくいきません。ですので、「POST」で渡しますが、
「POST」で渡すと、ページが切り替わるとデータをうまく引き渡せませんので、記述は
以下のように、すべての該当ページを1ページで表示するようにしています。
<form name="irekae" method="post" id="sort_form3" class="sort_form3"> <select name='narabi' onChange="document.forms['irekae'].submit()" > <option value="sort1"<?php if(!isset($_REQUEST['narabi']) || $_REQUEST['narabi'] == 'sort1') echo ' selected="selected"';?>>投稿日時が新しい順</option> <option value="sort2"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort2') echo ' selected="selected"';?>>投稿日時が古い順</option> <option value="sort3"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort3') echo ' selected="selected"';?>>五十音順(あ~わ)</option> <option value="sort4"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort4') echo ' selected="selected"';?>>五十音順(わ~あ)</option> <option value="sort5"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort5') echo ' selected="selected"';?>>アクセス数の多い順</option> <option value="sort6"<?php if(isset($_REQUEST['narabi']) && $_REQUEST['narabi'] == 'sort6') echo ' selected="selected"';?>>アクセス数の少ない順</option> </select> </form> <?php $sortset = $_POST['narabi']; ?> <?php $sortall = array( "sort1" => 'order=DESC&', "sort2" => 'order=ASC&', "sort3" => 'order=ASC&orderby=meta_value&meta_key=furikana&', "sort4" => 'order=DESC&orderby=meta_value&meta_key=furikana&', "sort5" => 'order=DESC&orderby=meta_value_num&meta_key=views&', "sort6" => 'order=ASC&orderby=meta_value_num&meta_key=views&' ); ?> <?php if($sortset != '') { $sort = $sortall[$sortset]; } else { $sort = $sortall["sort1"];} ?> <!-- <?php echo $sort; ?> ソートてすと用--> <?php query_posts('posts_per_page=-1&' . $sort . $query_string); ?>
参考にしてみてください。
以上でソート(並び替え)については完了です。
Pingback: tomoferret : "記事を閲覧者に任意の順序で並び替えさせたい" | たろうのわーどぷれす()
Pingback: ワードプレス/記事の並び替え - MAJの中途半端な独学小屋()