想定読者
WordPressのカスタムフィールドは追加できるが、50音順に並べられない。
今回おこなうこと
WordPressでは、カスタム投稿タイプを特定の順序で表示することができます。今回はその、順番を50音順に並び替えます。プラグインでもおこなえますが、functions.phpに記述する方法でおこなっていきます。
カスタムフィールドの準備
読み仮名のカスタムフィールドにはテキストが入るようにしておきます。
今回は[yomi]で作りました。
各記事ではこのカスタムフィールドにカタカナで入力していきます。
処理の概要
この方法では、以下の手順でカスタム投稿を並び替えます。
-
データの取得:
get_posts()
を使用して特定のカスタム投稿タイプのデータを取得します。取得条件として、カスタムフィールドに「yomi」が設定されている投稿のみを取得します。 -
データの整形: 取得したデータをループで処理し、ヨミガナの最初の文字を取得して配列に格納します。このとき、全角カタカナを半角カタカナに変換し、さらに全角に戻します。
-
並び替え: 取得したデータを「yomi」の最初の文字に基づいて、50音順に並べ替えます。それぞれの文字には、正規表現パターンが対応しており、マッチングした投稿を各50音に対応する配列に格納します。
-
HTML出力: 最後に、並べ替えたデータをHTMLとして出力します。各50音ごとに見出しを付け、各投稿のタイトルとリンクをリスト形式で表示します。
実際のコード
以下は、この処理を実現するWordPressのショートコードの例です。
<?php
function yomilistFunc( $atts ) {
// インデックス(行)
$indexes_parents = array(
"" => "[ア-オ]",
"" => "[カ-コ]",
"" => "[サ-ソ]",
"" => "[タ-ト]",
"" => "[ナ-ノ]",
"" => "[ハ-ホ]",
"" => "[マ-モ]",
"" => "[ヤ-ヨ]",
"" => "[ラ-ロ]",
"" => "[ワ-ン]",
"" => ".*"
);
// インデックス(50音)
$indexes = array(
"あ" => "[ア]", "い" => "[イ]", "う" => "[ウ]", "え" => "[エ]", "お" => "[オ]",
"か" => "[カ]", "き" => "[キ]", "く" => "[ク]", "け" => "[ケ]", "こ" => "[コ]",
"さ" => "[サ]", "し" => "[シ]", "す" => "[ス]", "せ" => "[セ]", "そ" => "[ソ]",
"た" => "[タ]", "ち" => "[チ]", "つ" => "[ツ]", "て" => "[テ]", "と" => "[ト]",
"な" => "[ナ]", "に" => "[ニ]", "ぬ" => "[ヌ]", "ね" => "[ネ]", "の" => "[ノ]",
"は" => "[ハ]", "ひ" => "[ヒ]", "ふ" => "[フ]", "へ" => "[ヘ]", "ほ" => "[ホ]",
"ま" => "[マ]", "み" => "[ミ]", "む" => "[ム]", "め" => "[メ]", "も" => "[モ]",
"や" => "[ヤ]", "ゆ" => "[ユ]", "よ" => "[ヨ]",
"ら" => "[ラ]", "り" => "[リ]", "る" => "[ル]", "れ" => "[レ]", "ろ" => "[ロ]",
"わ" => "[ワ]", "ん" => "[ン]",
"1" => "[1]", "2" => "[2]", "3" => "[3]", "4" => "[4]", "5" => "[5]",
"6" => "[6]", "7" => "[7]", "8" => "[8]", "9" => "[9]", "0" => "[0]",
"A" => "[a]", "B" => "[b]", "C" => "[c]", "D" => "[d]", "E" => "[e]",
"F" => "[f]", "G" => "[g]", "H" => "[h]", "I" => "[i]", "J" => "[j]",
"K" => "[k]", "L" => "[l]", "M" => "[m]", "N" => "[n]", "O" => "[o]",
"P" => "[p]", "Q" => "[q]", "R" => "[r]", "S" => "[s]", "T" => "[t]",
"U" => "[u]", "V" => "[v]", "W" => "[w]", "X" => "[x]", "Y" => "[y]", "Z" => "[z]",
"他" => ".*"
);
global $post;
// 記事データを取得
// 記事の取得条件
$args = array(
'posts_per_page' => '-1',
'post_status' => 'publish',
'meta_key' => 'yomi', //作成したカスタムフィールド
'meta_value' => '',
'orderby' => 'meta_value',
'order' => 'asc'
);
$my_posts = get_posts($args);
$post_data_set = array();
if ($my_posts) {
foreach ($my_posts as $post) {
setup_postdata($post);
$yomi = get_post_meta($post->ID, 'yomi', true);
$yomi_conv = mb_convert_kana($yomi, 'k', 'UTF-8');
$yomi_conv = mb_convert_kana($yomi_conv, 'K', 'UTF-8');
$yomi_first = mb_substr($yomi_conv, 0, 1);
$posts['title'] = get_the_title();
$posts['permalink'] = get_permalink();
$posts['yomi'] = $yomi;
$posts['yomi_first'] = $yomi_first;
$post_data_set[] = $posts;
}
}
$post_data_set_index = array();
foreach ( $post_data_set as $key => $val) {
$char = mb_substr( $val['yomi_first'], 0, 1);
foreach ( $indexes as $index => $pattern ) {
if (preg_match("/^" . $pattern . "/u", $char)) {
$post_data_set_index[$index][] = $post_data_set[$key];
break;
}
}
}
$post_data_set_index_parent = array();
foreach ( $post_data_set_index as $key => $val) {
foreach ( $indexes_parents as $indexes_parent => $patterns ) {
if (preg_match("/^" . $patterns . "/u", $key)) {
$post_data_set_index_parent[$indexes_parent][$key] = $post_data_set_index[$key];
break;
}
}
}
$output = "";
if ($post_data_set_index_parent) {
foreach ($post_data_set_index_parent as $indexes_parent => $posts) {
foreach ($posts as $index => $post) {
$output .= '<h3>'.$index.'</h3>';
$output .= '<ul>' . "\n";
foreach ($post as $key => $val) {
$output .= '<li>';
$output .= '<a href="' .$val['permalink']. '">' .$val['title']. '</a>';
$output .= '</li>' . "\n";
}
$output .= '</ul>' . "\n";
}
}
}
wp_reset_postdata();
return $output;
}
add_shortcode('yomilist', 'yomilistFunc');
あとは、一覧用の記事等にショートコード[yomilist]と記入することで、記事の50音順で表示されます。