WordPressのプラグイン「ContactForm7」のドロップダウンリストの項目をカスタム投稿のタイトルにする

ドロップダウンリストを問合せフォームの選択項目として設置することがあります。

問合せフォームの設置にプラグイン「ContactForm7」利用する事が多く、元々「ドロップダウンリスト」の設置も簡単にできるため重宝しています。

しかし運用をしていると、項目に変更を加える場合に、多少のHTML知識が必要なため使う人を選ぶとなぁと。たまに感じます。

ダブルクォーテーション(「””」)を消さないようにとか、カッコの取り扱いなどの知識ですね。

間違って消してしまい、「あの選べるやつが消えちゃいました!」とか「表示されません」とか言われることがたまにありました。

自社案件の中で起きた問題なので、そこら辺のメンテナンス性を高めるにはどうするかと。

その後の利用を考えて、カスタム投稿のタイトルを突っ込むことにしました。

やる事は2つ

それを実現するためには、functions.phpの編集と、ContactForm7のタグの設定を行います。

functions.phpを編集する

まずはコードを載せてしまいます。

<?php

  //関数の作成

  function test_selectlist( $tag, $unused ){

    //ContactForm7のタグの名前が'test-tag'かどうか

    if( $tag['name'] != 'test-tag' ){

      return $tag;

    }

  

    //get_posts()でセレクトボックスの中身を作成する

    //クエリの作成

    $args = array(

      'numberposts' => -1,

      'post_type' => 'test',//使用するカスタム投稿タイプを指定

      'tax_query' => array(

        //カテゴリー等を指定する場合

        //この例ではカスタムタクソノミーを使用しています

        array(

          'taxonomy' => 'test_cat',//使用するカスタムタクソノミー名

          'field' => 'slug',//カスタムタクソノミー内で参照するタームを探す形

          'terms' => 'test-term'//探すターム名

        )

      ),

      //並び順⇒セレクトボックス内の表示順となります

      'orderby' => 'ID',

      'order' => 'ASC'

    );



    //クエリをget_posts()に入れる

    $test_posts = get_posts( $args );



    //クエリが泣ければ戻す

    if( !$test_posts ){

      return $tag;

    }

  

    //セレクトボックスにforeachで突っ込む

    foreach( $test_posts as $test_post ){

      $tag['raw_values'][] = $test_post->post_title;

      $tag['values'][] = $test_post->post_title;

      $tag['labels'][] = $test_post->post_title;

    }

  

    return $tag;

  

  }

  //add_filter()で項目を上書きするニュアンス

  add_filter( 'wpcf7_form_tag', 'test_selectlist', 10, 2 );

  ?>

コメントも入れてありますが、ざっくりと解説します。

カスタム投稿を使うということは、ワードプレスのデータベースに投稿として保存されているデータを呼び出すということになります。

投稿データの呼び出しはサブクエリを使用することで可能です。

なので、get_posts()関数を使用し投稿データを取得します。

$argsで取得する投稿を指定し、foreachで条件に該当する投稿分、セレクトリストに含まれるようにします。

特にカテゴリーを限定する必要が無い場合は、「tax_query」の項目は不要です。今回はカテゴリーを限定してます。

$tagの中にContactForm7で使用するタグの情報が入っているので、使用する項目に$test_post->post_titleとすることで、投稿のタイトルをリストに入れることができます。

あとは、add_filter()でリストの情報を上書きさせます。

この関数を通して作成されたリストを、使用したContactForm7のフォームで使えるようにします。

フォームのタグ名を指定した変数に合わせる

functions.phpに入力するコードの最初の方にでContactForm7のタグ名を指定しています。

<?php

  //関数の作成

  function test_selectlist( $tag, $unused ){

    //ContactForm7のタグの名前が'test-tag'かどうか

    if( $tag['name'] != 'test-tag' ){

      return $tag;

    }

この「$tag[‘name’] != ‘test-tag’」で指定したタグ名でContactFrom7のタグを使用します。

これで、このselectのリストは、カスタム投稿タイプ「test」のカスタムタクソノミー「test_cat」の「test-term」に分類された記事のタイトルが、セレクトボックスのリストに追加されます。

カスタム投稿で他の使い道もある可能性

今までContactForm7のselectに直接値を設定してきたんですが、最初に書いたHTML知識が多少必要なため、メンテナンス性が悪くなっていました。

それを分かりやすくしつつ、カスタム投稿タイプに細かい情報を追加する予定もあり。あえてカスタム投稿タイプを使用し、投稿データとして保存できるようにしました。

そうすれば、ワードプレス本来のブログの機能を使いつつ、項目管理がしやすくなるからです。

ワードプレスのカスタマイズ時には、ワードプレスが持っている機能をどのように使うかを考えて、組み込んでいくことを考えます。


Tagged on:

スポンサーリンク



©2018-2020 東建工業 Allright Reserved.