WP-Members登録ページをjQueryでタブ分けする。
はじめに。
WordPressを会員制サイトにするプラグインとして、WP-Members があります。
これの入力フィールドが多すぎるのでタブ分けしたい、という案件がありました。 jQueryを使って実装しました。
スクリプトの設置に関しては、サーバーへのアクセスが今回許可されなかったので、WordPress にカスタムCSSまたはJSを設置する、Simple Custom CSS and JS を使いました。
コード作成
まず構造をチェック
WP-Membersが作るフォーム構造はこんな感じ。
<div id="wpmem_reg"> <a name="register"></a> <form name="form" method="post" enctype="multipart/form-data" action="[url]" id="" class="form"> <fieldset> <legend>[ページタイトル]</legend> <label for="[field-name]" class="text ">[text-name]<span class="req">*</span></label> <div class="div_text"> <input name="first_name" type="text" id="[field-name]" value class="textbox" required=""> </div> <!-- 中略 --> <div class="button_div"> <input name="submit" type="submit" value="[Submit]" class="buttons"> </div> </fieldset> </form> </div>
<div id="wpmem_reg">
のあたりをセレクタとして考えると良さそう。
タブナビゲーションを挿入。
今回は、タブ部分のHTMLはULで作成。<legend>
の下に挿入しました。
jQueryは、タブが増減してもいいようにnumを定義する形で。
// button var btnnum = 6; // set html var setli = ""; for (var i=1; i<=btnnum; i++) { setli = setli + "<li class='btn-" + i + "'>書式" + i + "</li>"; } $(baseclass + ' legend').after('<ul class="tablelist">' + setli + '</ul>');
タブ分けのために、任意のタグに任意のクラスをjQueryで差し込む。
WP-membersで付与されるnameなどをあてにしてもよかったのですが、コードが煩雑になるため、単純に 「タグの並び順」でクラスを差し込みました。
tab01 loop では、 「fieldsetの中の任意の順番のlabel、および、そのラベルの次のdiv」を「最初から16個」選択して、 「tab01」「tab-all」というクラスを付与しています。
// base class var baseclass ="#wpmem_reg"; // tab01 loop for (var i=1; i<=16; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab1 tab-all"); } // tab02 loop for (var i=17; i<=40; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab2 tab-all"); } // tab03 loop for (var i=41; i<=51; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab3 tab-all"); } // tab04 loop for (var i=52; i<=56; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab4 tab-all"); } // tab05 loop for (var i=57; i<=66; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab5 tab-all"); } // tab06 loop for (var i=67; i<=76; i++) { $(baseclass + ' fieldset label:nth-of-type(' + i + '),' + baseclass + ' fieldset label:nth-of-type(' + i + ')+div').addClass("tab6 tab-all"); }
切り替えの動作
// セレクタ、tab2以降を隠す。 for (var i=2; i<=btnnum; i++) { $(baseclass + ' .tab' + i ).hide(); } // タブボタン、btn-1のスタイル $(baseclass + ' .tablelist .btn-1').css("background-color", "#eee"); $(baseclass + ' .tablelist').css("list-style","none") // タブボタン全般のスタイル $(baseclass + ' li').css({ "display":"inline-block", "padding":"5px 0", "width":"13%", "border":"1px solid #eee", "text-align":"center", "border-radius":"3px", "margin-right":".5%", "cursor":"pointer" }) // タブボタンがクリックされた時の動作 $(baseclass + ' .tablelist li').on("click", function(){ // クリックされたボタンのクラスを取得 var s = '.' + $(this).attr('class'); // クリックされたボタンのクラスから数字を拾って「.tab」に文字列連結。操作したいタブのクラスを取得 var t = '.tab' + s.replace(".btn-", ""); // 「.tab-all」クラスがついたタグを全部隠す。 $(baseclass + ' fieldset .tab-all').hide(); // 操作したいタブをfadeinさせる。 $(baseclass + ' fieldset ' + t).fadeIn(); // タブボタン全ての背景色を透明にする。 $(baseclass + ' .tablelist li').css("background-color", "transparent"); // クリックされたタブボタンの背景色を「#eee」とする。 $(baseclass + ' .tablelist ' + s).css("background-color", "#eee"); });
以上です。
全部をつなげてjQuery(document).ready(function( $ ){...});
に収めればOK。
WordPressなので書き出しは、 $functionとかではなく、 jQuery で始めるようにかく。
おわりに。
きっとかならずもっと良い書き方があると思います。