【WordPress】「、」で区切られているものもあるカスタムフィールドの値を配列に入れる

今回はタイトルに悩みましたが・・・。

端的に言うと、カスタムフィールドに入力された文字列を操作して配列にし、リスト化したいことがあり。

その備忘録です。

状況

カスタムフィールドの準備ができ、いざデータを入力している時に気づいたことが。

1つのカスタムフィールドに1つの値(文字列)という予定でいましたが、複数入力しないといけないことに気が付きました。

じゃあカスタムフィールドを増やすか・・・とも思いましたが、追加した分を使うデータがどれだけあるのかは未定でした。

空のカスタムフィールドを増やしてもしょうがないので、入力に制約をつけることに。

【複数入力する必要がある場合は「、」で区切る】

日本語で文字列入力をしているので、句読点を打つ方がカンマより効率が良いと考えたのです。

あとは、データを呼び出す時に「、」で区切り、それを配列にすればコードでリスト化できるかなと。

以前の記事で書いたセレクトボックスで使う予定のある内容でしたので。

explode()で区切ることはできる

PHPのexplode()を利用すれば、文字列を区切り文字列で分割し、配列にしてくれます。

条件に合った関数があり助かりました。

カスタムフィールドの値を呼び出したついでに分割してもらいます。

explode( '、', get_post_meta( $post->ID, 'test_field_value', true) );

第一引数に区切る文字列を指定し、第ニ引数に区切られる文字列を指定します。

区切る文字列は「、」、区切られる文字列はカスタムフィールド’test_field_value’の値です。

これで行けるかと思いましたが、区切り文字が無い場合に処理がうまく行かず・・・

区切る場合と区切らない場合で分岐した方が良さそうでした。

strpos()で分岐を作る

区切りたいカスタムフィールドの値には、必ず「、」が入っています。

なので句読点を文字列検索すれば良いかと。

そこで文字列検索のPHP関数strpos()を利用します。

if(strpos( get_post_meta( $post->ID, 'test_field_value', true), '、') === false ){
        //「、」がない場合の処理
        }
elseif( strpos( get_post_meta( $post->ID, 'test_field_value', true), '、') !== false ){
       //「、」がある場合の処理
        }

strpos()の第一引数は検索対象となる文字列。なので、カスタムフィールドの値を呼び出します。

第ニ引数が検索する文字列。ここは句読点を探して欲しいので’、’。

で、実行した時に検索する文字列が見つからないとfalseを返すので、条件を「=== false」とします。

逆に見つかった時はfalseが返されないので、「!== false」となります。

一応自分の頭の整理のためにelseifで「、」が含まれている場合の処理を書きましたが、} else { でも大丈夫です。

これで後はそれぞれの値を配列に入れるだけだし・・・とarray_merge()したら、配列の中に配列が入るという自体に。

ここらへんで頭がこんがらがって来ましたw

配列を用意しておいて突っ込んでいく

array_merge()は配列を結合するので、片方が配列じゃなければ配列にしてしまうみたいで。

配列IN配列が出来上がってました。

array_push()するにしても元の配列が必要ですし・・・

なので、ループの外で配列の箱を用意しておいて、そこに突っ込んでくようにしました。

一応クエリから書いておきます。

$args = array(
    'no_found_rows' => true,
    'post_type' => 'test-posts',
    'post_publish' => 'publish',
    'orderby' => 'ID',
    'posts_per_page' => -1,
);

//get_postsでデータを受け取る
$test_posts_data = get_posts($args);

//ループ外で配列の箱を作成
$test_array = [];

//ループ
foreach( $test_posts_data as $post ){
    //文字列”、”検索
    if(strpos( get_post_meta( $post->ID, 'test_field_value', true), '、') === false ){
        //"、"がない場合は配列に突っ込む
        $test_array[] = get_post_meta( $post->ID, 'test_field_value', true);
        }
        elseif( strpos( get_post_meta( $post->ID, 'test_field_value', true), '、') !== false ){
            //"、"がある場合は分割して結合する
            $test_explode = explode( '、', get_post_meta( $post->ID, 'test_field_value', true) );
            $test_array = array_merge( $test_array, $test_explode );
        }

//配列の重複、空白を除去して整理
$test_list_array = array_filter( array_unique( $test_array ) );

}

これまでに書いたものを全部突っ込んでます。

とりあえずカスタムフィールドから値を取得して配列化し、全データが終わった段階で配列内での値の重複や空の除去を行ってます。

予定としては150件の投稿×1投稿あたりの対象となるカスタムフィールド数6件なので・・・900件ほどですかね。

この程度ならこれで良いかなと。

一応、セレクトボックスの選択肢に規則性が無いと気持ちが悪いので、sort()も使おうと心に決めています。

無理矢理感はありますが

個人で使用するものを作っていたので、ちょっと無理矢理感がありますかね。

全てはカスタムフィールド作成時の設計と見通しの甘さにあると深く反省しております。

調べると正規表現で〜とかもありますが・・・速度は今回のやり方の方が〜というのも見かけたので、そちらを信じることにw

これでデータ入力に勤しむことができます。