LoginSignup
0
0

想定読者

WordPressのカスタムフィールドは追加できるが、50音順に並べられない。

今回おこなうこと

WordPressでは、カスタム投稿タイプを特定の順序で表示することができます。今回はその、順番を50音順に並び替えます。プラグインでもおこなえますが、functions.phpに記述する方法でおこなっていきます。

カスタムフィールドの準備

読み仮名のカスタムフィールドにはテキストが入るようにしておきます。
今回は[yomi]で作りました。
各記事ではこのカスタムフィールドにカタカナで入力していきます。

処理の概要

この方法では、以下の手順でカスタム投稿を並び替えます。

  1. データの取得: get_posts() を使用して特定のカスタム投稿タイプのデータを取得します。取得条件として、カスタムフィールドに「yomi」が設定されている投稿のみを取得します。

  2. データの整形: 取得したデータをループで処理し、ヨミガナの最初の文字を取得して配列に格納します。このとき、全角カタカナを半角カタカナに変換し、さらに全角に戻します。

  3. 並び替え: 取得したデータを「yomi」の最初の文字に基づいて、50音順に並べ替えます。それぞれの文字には、正規表現パターンが対応しており、マッチングした投稿を各50音に対応する配列に格納します。

  4. 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音順で表示されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0