WordPressで会員サイトを作るのに使われるUltimate MemberというWordpressのプラグインがあります。
そのUltimate Memberプラグインは登録フォームが無料とは思えないぐらいとても使いやすいです。Ultimate Memberの登録フォームにはプルダウンメニューの絞り込み機能や条件分岐などとても多機能です。
この記事では、Ultimate Memberの登録フォームにはプルダウンメニューの絞り込み機能の実現方法について説明します。この機能はネットに転がっている情報が古かったり、function.phpをいじらないといけなかったり、わかりにくいところがあったので、自分でやったときに分かりにくかった点をメモとして残しておきます。
Ultimate memberプラグイン
Ultimate member公式サイト
Ultimate member特徴
- フロントエンド・ユーザープロフィール
- フロントエンド・ユーザー登録
- フロントエンド・ユーザーログイン
- Custom form fields
- Conditional logic for form fields
- Drag and drop form builder
- ユーザーアカウントページ
- ユーザー権限グループのカスタム
- メンバーディレクトリ
- User emails
- コンテンツの制限
- Conditional nav menus
- Show author posts & comments on user profiles
- Developer friendly with dozens of actions and filters
Ultimate memberダウンロード
Ultimate memberのプルダウンメニューの絞り込み
Ultimate memberのプルダウンメニューの絞り込み機能については、公式サイトに説明があります。
Ultimate Member Ver2.1から仕様が変わっている
Ultimate Member Ver2.1以降とそれ以前でプルダウンメニューの絞り込みの実現方法の記載が分かれておりますので、最近UltimateMemberをインストールした人はVer2.1以降の説明を見る必要があります。
ネットに転がっている情報は、Ver2.1以前の情報が多く、公式サイトを見た方が安全です。
プルダウンメニューの絞り込みとは?
プルダウンメニューの絞り込みというのは、2つのプルダウンメニューに、親子関係を持たせ、親の選択結果から子供のプルダウンメニューの中身を連動させるというものです。
よく見かける例として、日本の都道府県を選ぶときに親メニューとして地方を選択してもらい、子メニューはその地方に属する県だけ表示させるというものです。
プルダウンメニューの絞り込みの実現手順
登録フォームで、プルダウンメニューを選ぶと、プルダウンメニューの親(parent)を指定する項目があります。
まず、絞り込みの親となるメニューを作ります。
次に、同じように、プルダウンメニューを選び、絞り込みの子となるメニューを作ります。その時にparentに先ほど作成した親のプルダウンメニューの名前を指定します。これで親子関係が紐づきます。
さらに、絞り込みのロジックは、callback関数が入力できるので、そこに絞り込みのロジックが書かれた関数名を記載します。
通常、callback関数は、function.phpにphp関数として定義します。
callback関数は何をする?
一言で言えば、プルダウンの内容を定義することです。
callback関数を登録すると、本来手動で入力していたプルダウンメニュー欄にcallback関数の出力が表示されるようになります。
つまり、callback関数の出力はプルダウンメニューの定義リストになります。
callback関数の例:プルダウンメニューのリストを定義
callback関数の役割からすれば、親メニューからの絞り込みの時だけでなく、通常のプルダウンメニューの登録時にもcallback関数でプルダウンメニューの内容を定義することもできるのです。
つまり、親メニューのプルダウンメニューを定義する関数をfunction.phpに記述して、callback関数として呼び出せば、プルダウンメニューをフォームに直書きしないで、callback関数内部で定義することができます。
次のコードは、都道府県の親プルダウンメニューの定義ですが、関数として定義しています。
callback関数にこの関数を指定すれば、プルダウンメニューの定義リストが自動的に出力されます。
function state_dropdown(){
$state = array(
"北海道"=>"北海道",
"関東"=>"関東",
"甲信越・北陸"=>"甲信越・北陸",
"東海"=>"東海",
"関西"=>"関西",
"中国"=>"中国",
"四国"=>"四国",
"九州"=>"九州",
"沖縄"=>"沖縄"
);
return $state;
}
親子関係のある絞り込みプルダウンメニューの実装
Ultimate member でプルダウンメニューの親子関係を定義し、親の選択結果を受け取って子のプルダウンメニューの表示を変更する時の手順を説明しいます。
今回、親のプルダウンメニューをcallback関数で指定する方法をご紹介しましたが、子のプルダウンメニューの関数内でその関数は出てきません。選択結果が渡されるだけです。
all_optionsの部分だけ変更すれば、他にも応用できると思います。
function todoufuken($has_parent = false){
$parent_options = isset( $_POST['parent_option'] ) ? $_POST['parent_option'] : false;
$all_options = array(
"北海道" => array(
"北海道"=>"北海道"
),
"関東"=> array(
"茨城県"=>"茨城県",
"栃木県"=>"栃木県",
"群馬県"=>"群馬県",
"埼玉県"=>"埼玉県",
"千葉県"=>"千葉県",
"東京都"=>"東京都",
"神奈川県"=>"神奈川県"
),
"甲信越・北陸"=> array(
"新潟県"=>"新潟県",
"富山県"=>"富山県",
"石川県"=>"石川県",
"福井県"=>"福井県",
"山梨県"=>"山梨県",
"長野県"=>"長野県"
),
"東海"=> array(
"岐阜県"=>"岐阜県",
"静岡県"=>"静岡県",
"愛知県"=>"愛知県",
"三重県"=>"三重県"
),
"関西"=> array(
"滋賀県"=>"滋賀県",
"京都府"=>"京都府",
"大阪府"=>"大阪府",
"兵庫県"=>"兵庫県",
"奈良県"=>"奈良県",
"和歌山県"=>"和歌山県"
),
"中国"=> array(
"鳥取県"=>"鳥取県",
"島根県"=>"島根県",
"岡山県"=>"岡山県",
"広島県"=>"広島県",
"山口県"=>"山口県"
),
"四国"=> array(
"徳島県"=>"徳島県",
"香川県"=>"香川県",
"愛媛県"=>"愛媛県",
"高知県"=>"高知県"
),
"九州"=> array(
"福岡県"=>"福岡県",
"佐賀県"=>"佐賀県",
"長崎県"=>"長崎県",
"熊本県"=>"熊本県",
"大分県"=>"大分県",
"宮崎県"=>"宮崎県",
"鹿児島県"=>"鹿児島県"
),
"沖縄"=> array(
"沖縄"=>"沖縄"
),
);
$arr_options = array();
if ( ! is_array( $parent_options ) ) {
$parent_options = array( $parent_options );
}
foreach ( $parent_options as $parent_option ) {
if ( isset( $all_options[ $parent_option ] ) ) {
$arr_options = array_merge( $arr_options, $all_options[ $parent_option ] );
} elseif ( ! isset( $_POST['parent_option'] ) ) {
foreach ( $all_options as $k => $opts ) {
$arr_options = array_merge( $opts, $arr_options );
}
}
}
//code to do something if other options are not selected or empty match
if ( empty( $arr_options ) ) {
$arr_options[ ] = "no states";
} else {
$arr_options = array_unique( $arr_options );
}
return $arr_options;
}
まとめ
Ultimate memberは会員サイトを作る時に便利なのですが、有料のアドオンが必要になると、サブスクリプションタイプなので、無限にお金がかかります。
無料で使える範囲で目的が達成できるのであれば、とても便利なプラグインだと思いますが、それだとwordpressのユーザー登録と機能的にあまり変わらないので、導入する時は無料で自分のやりたいことができるのかどうかよく考えた方が良いと思います。