教文館の社内ナレッジベースです。

【ソート(並べ替え)方法その一】 get変数を利用したソート方法

[php]

<!– ソートボタンの実装 –>
<form name=”narabekae” method=”get” id=”sort_form1″>
<select name=’narabinasai’ onChange=”document.forms[‘irekae’].submit()” >
<option value=”sort1″<?php if(!isset($_REQUEST[‘narabinasai’]) || $_REQUEST[‘narabinasai’] == ‘sort1’) echo ‘ selected=”selected”‘;?>>出版日が新しい順</option>
<option value=”sort2″<?php if(isset($_REQUEST[‘narabinasai’]) && $_REQUEST[‘narabinasai’] == ‘sort2’) echo ‘ selected=”selected”‘;?>>出版日が古い順</option>
<option value=”sort3″<?php if(isset($_REQUEST[‘narabinasai’]) && $_REQUEST[‘narabinasai’] == ‘sort3’) echo ‘ selected=”selected”‘;?>>人気の高い順</option>
<option value=”sort4″<?php if(isset($_REQUEST[‘narabi’]) && $_REQUEST[‘narabi’] == ‘sort4’) echo ‘ selected=”selected”‘;?>>タイトル順</option>
</select>
</form>
<?php $sortset = $_GET[‘narabinasai’]; ?>
<?php $sortall = array(
“sort1” => ‘order=DESC&posts_per_page=10&paged=’,
“sort2” => ‘order=ASC&posts_per_page=10&paged=’,
“sort3” => ‘order=DESC&orderby=meta_value_num&meta_key=views&posts_per_page=10&paged=’
“sort4″ => ‘order=ASC&orderby=title&posts_per_page=10&paged=’
); ?>

<!– ソートボタンで最初に表示させる項目 –>
<?php if($sortset != ”) {
$sort = $sortall[$sortset];
} else {
$sort = $sortall[“sort1”];} ?>
<!– ソートボタンで最初に表示させる項目ここまで –>

<!–   <?php echo $sort; ?> ソートテスト用。コメントアウトしておきます。–>

<?php query_posts($sort . $paged); ?>
<!– ソートボタンの実装ここまで –>[/php]

注意点として、「人気順」の場合は、WP-PostViewsプラグインなどを利用してカスタムフィールド(メタキーは「view」)を各投稿に作っておくこと。メタバリューはもちろん半角数字。meta_value_numでソートします。それから、タイトル順の並べ替えは本来は「人気順」と同様にメタキー「ふりがな」を作って、これで並び替えるのがベスト。上の場合単にタイトルで並べ替えているので、数字→特殊記号→ひらがな→カタカナ→漢字の順でソートされます。洋書の場合はこれでいいんですが。まあ、やっつけざっくり!

【ソート(並べ替え)方法その二】 sprintf 関数を利用したソート方法

[php]

<p>
<?php
$url = sprintf( ‘http://%1$s%2$s’, $_SERVER[“HTTP_HOST”], $_SERVER[“REDIRECT_URL”] );
printf( ‘<a href=”%s?orderby=post_date&order=DESC”>出版日の新しい順</a> | ‘, $url );
printf( ‘<a href=”%s?orderby=post_date&order=ASC”>出版日の古い順</a> | ‘, $url );
printf( ‘<a href=”%s?order=DESC&orderby=meta_value_num&meta_key=views& posts_per_page=10&paged=”>人気の高い順</a> | ‘, $url );
printf( ‘<a href=”%s?order=ASC&orderby=title&posts_per_page=10&paged=”>タイトル順</a>’, $url );
?>
</p>

[/php]

こちらはwordpressフォーラムからの拾い物ですが、関数「sprintf」「printf」を利用しています。
* sprintf関数 — 指定したフォーマットにしたがって整形した文字列を返します。

形式:sprintf( フォーマット [, 引数1] [, 引数2]・・・)

*printf関数 ― 引数で指定したフォーマットにしたがって整形した文字列を表示します。

形式:printf( フォーマット [, 引数1] [, 引数2]・・・)

例えばここではsprintf関数のフォーマットは「 ’http://%1$s%2$s’ 」 で、第1引数「 $_SERVER[“HTTP_HOST”] 」と第2引数「 $_SERVER[“REDIRECT_URL”] 」を順に定義された文字列としてフォーマットに代入します。そのうえで、取得したその値($url)をprintf関数のフォーマットに代入して場合分けをするというもの。考えた人頭いい!