1. HOME
  2. WordPress
  3. MW WP Form スラッグを活用したフォーム管理と開発効率化
WordPress - 2022-09-20

MW WP Form スラッグを活用したフォーム管理と開発効率化

MW WP FormはWordPressで柔軟なフォームを構築できる人気のプラグインですが、開発環境と本番環境でのフォーム管理において、formkeyの違いが課題となることがあります。特に、フォームのバリデーションルールやメール設定などをfunctions.phpでカスタマイズしている場合、環境ごとにformkeyを書き換える手間は開発効率を著しく低下させます。

この記事では、MW WP Formの「スラッグ」機能を活用し、formkeyに依存しない堅牢なフォーム管理を実現する方法を、具体的なコード例を交えて詳しく解説します。これにより、開発から本番へのデプロイプロセスをスムーズにし、メンテナンス性を向上させることができます。

なぜスラッグを使うのか?

MW WP Formでフォームを作成すると、各フォームには自動的にユニークなID(formkey)が割り当てられます。しかし、このIDは環境(開発、ステージング、本番)間で異なることが多く、特に手動でフォームを移行する際に問題となります。

スラッグは、WordPressの投稿や固定ページと同様に、フォームに人間が読みやすい一意の識別子を割り当てる機能です。このスラッグを基準にフォームIDを取得することで、環境に依存しないコード記述が可能となり、以下のメリットが得られます。

  • デプロイの簡素化: formkeyの書き換えが不要になり、開発環境で作成したコードをそのまま本番環境に適用できます。
  • メンテナンス性の向上: コードが特定のIDにハードコードされないため、フォームIDが変更されてもコードの修正が不要になります。
  • 可読性の向上: スラッグ名でフォームを識別できるため、コードの意図がより明確になります。

事前準備:MW WP Formでスラッグ表示を有効にする

MW WP Formのフォーム編集画面では、デフォルトでスラッグの入力エリアが表示されていない場合があります。スラッグを設定するためには、以下の手順で表示を有効にする必要があります。

  1. WordPress管理画面で、MW WP Formのフォーム編集画面を開きます。
  2. 画面右上の「表示オプション」をクリックします。
  3. 表示されるメニューの中から「スラッグ」にチェックを入れます。

これにより、フォーム編集画面にスラッグ入力フィールドが表示され、任意のスラッグを設定できるようになります。例えば、「お問い合わせフォーム」であればcontact-formといったスラッグを設定します。

functions.phpへの記述:スラッグからフォームIDを取得する関数

まず、スラッグからMW WP Formの投稿ID(formkey)を取得するためのヘルパー関数をfunctions.phpに記述します。

/**
 * MW WP FormのスラッグからフォームIDを取得する
 *
 * @param string $slug 取得したいフォームのスラッグ
 * @return int フォームの投稿ID (formkey)
 */
function ag_get_mwwpform_id( $slug = '' ) {
    global $wpdb; // WordPressのデータベース操作用グローバル変数
    $table = $wpdb->prefix . 'posts'; // 投稿テーブル名(wp_postsなど)

    // MW WP Formの投稿タイプで、公開済みかつ指定されたスラッグの投稿を検索
    $query  = "SELECT ID FROM $table WHERE post_type='mw-wp-form' AND post_status='publish' AND post_name = %s";

    // SQLインジェクション対策としてwpdb::prepareを使用
    $result = $wpdb->get_row( $wpdb->prepare( $query, $slug ) );

    // 結果が存在すればIDを、なければ0を返す
    return ( int ) ( $result ? $result->ID : 0 );
}

関数の解説

  • ag_get_mwwpform_id( $slug = '' ): 引数としてフォームのスラッグを受け取ります。
  • global $wpdb;: WordPressのデータベースにアクセスするためのグローバルオブジェクト$wpdbを宣言します。
  • $table = $wpdb->prefix . 'posts';: WordPressの投稿が保存されているテーブル名を取得します。$wpdb->prefixはWordPressのテーブル接頭辞(通常wp_)です。
  • $query = "SELECT ID FROM $table WHERE post_type='mw-wp-form' AND post_status='publish' AND post_name = %s";:
    • post_type='mw-wp-form': MW WP Formによって作成された投稿タイプを指定します。
    • post_status='publish': 公開済みのフォームのみを対象とします。
    • post_name = %s: 指定されたスラッグ(post_nameカラム)に一致するフォームを検索します。%swpdb::prepareで文字列が挿入されるプレースホルダーです。
  • $result = $wpdb->get_row( $wpdb->prepare( $query, $slug ) );:
    • $wpdb->prepare(): SQLクエリのセキュリティを確保するために、ユーザー入力(ここでは$slug)をエスケープします。
    • $wpdb->get_row(): データベースから単一の行(オブジェクト形式)を取得します。
  • return ( int ) ( $result ? $result->ID : 0 );: 検索結果が存在すればそのIDを整数型で返し、存在しない場合は0を返します。

使用例:バリデーションルールへの適用

ag_get_mwwpform_id関数を使用することで、MW WP Formの各種フックにスラッグベースでフォームを紐付けることができます。ここでは、バリデーションルールを適用する例を示します。

/**
 * フォームのバリデーションルールを定義する関数
 *
 * @param MW_WP_Form_Validation $Validation MW_WP_Form_Validationオブジェクト
 * @param array $data 送信されたデータ
 * @param MW_WP_Form_Data $Data MW_WP_Form_Dataオブジェクト
 * @return MW_WP_Form_Validation 変更されたValidationオブジェクト
 */
function my_custom_validation_rule( $Validation, $data, $Data ) {
    // 例: 'your-name'フィールドが必須であることを確認
    $Validation->set_rule( 'your-name', 'noEmpty' );

    // 例: 'your-email'フィールドがメールアドレス形式であることを確認
    $Validation->set_rule( 'your-email', 'mail' );

    // 例: 'your-message'フィールドが特定の文字数以上であることを確認
    // if ( isset( $data['your-message'] ) && mb_strlen( $data['your-message'] ) < 10 ) {
    //     $Validation->set_error( 'your-message', 'メッセージは10文字以上で入力してください。' );
    // }

    return $Validation;
}

// スラッグ名が【contact-form】のフォームにバリデーションルールを適用
$contact_form_id = ag_get_mwwpform_id( 'contact-form' ); // スラッグからIDを取得
if ( $contact_form_id ) { // IDが取得できた場合のみフックを適用
    $mwform_validation_hook_name = 'mwform_validation_mw-wp-form-' . $contact_form_id;
    add_filter( $mwform_validation_hook_name, 'my_custom_validation_rule', 10, 3 );
}

// 別のフォーム(例: 'seminar-entry')にもバリデーションルールを適用する場合
// function seminar_entry_validation_rule( $Validation, $data, $Data ) {
//     $Validation->set_rule( 'seminar-date', 'noEmpty' );
//     return $Validation;
// }
// $seminar_form_id = ag_get_mwwpform_id( 'seminar-entry' );
// if ( $seminar_form_id ) {
//     $mwform_validation_hook_name_seminar = 'mwform_validation_mw-wp-form-' . $seminar_form_id;
//     add_filter( $mwform_validation_hook_name_seminar, 'seminar_entry_validation_rule', 10, 3 );
// }

解説

  1. my_custom_validation_rule関数: MW WP Formのバリデーションフックに渡される関数です。この中で$Validation->set_rule()を使ってバリデーションルールを定義します。
  2. ag_get_mwwpform_id( 'contact-form' ): ここで、スラッグcontact-formを持つフォームのIDを取得します。
  3. if ( $contact_form_id ): ag_get_mwwpform_id0を返す(フォームが見つからない)可能性を考慮し、IDが有効な場合にのみadd_filterを実行するようにします。これにより、フォームが存在しない環境でのエラーを防ぎます。
  4. $mwform_validation_hook_name = 'mwform_validation_mw-wp-form-' . $contact_form_id;: MW WP Formのバリデーションフック名はmwform_validation_mw-wp-form-{フォームID}という形式です。取得したIDをこの文字列に結合してフック名を生成します。
  5. add_filter( $mwform_validation_hook_name, 'my_custom_validation_rule', 10, 3 );: 生成したフック名に、定義したバリデーション関数を紐付けます。

その他のフックへの適用例

MW WP Formでは、バリデーション以外にも様々なフックが用意されており、同様にスラッグベースで適用することが可能です。

確認画面表示前のデータ加工 (mwform_value_mw-wp-form-{formkey})

/**
 * 確認画面表示前にデータを加工する例
 */
function my_custom_value_filter( $value, $name, $Data ) {
    if ( $name === 'your-tel' ) {
        // 電話番号からハイフンを除去する例
        return str_replace( '-', '', $value );
    }
    return $value;
}

$contact_form_id = ag_get_mwwpform_id( 'contact-form' );
if ( $contact_form_id ) {
    add_filter( 'mwform_value_mw-wp-form-' . $contact_form_id, 'my_custom_value_filter', 10, 3 );
}

管理者宛メールの本文加工 (mwform_mail_raw_mw-wp-form-{formkey})

/**
 * 管理者宛メールの本文を加工する例
 */
function my_custom_mail_raw_filter( $body, $Data ) {
    // 送信されたデータを取得
    $data = $Data->get_post_data();

    // 例: 特定のフィールドの値をメール本文に追加
    if ( isset( $data['your-name'] ) ) {
        $body .= "

--- ユーザー情報 ---
";
        $body .= "お名前: " . $data['your-name'] . "
";
    }
    return $body;
}

$contact_form_id = ag_get_mwwpform_id( 'contact-form' );
if ( $contact_form_id ) {
    add_filter( 'mwform_mail_raw_mw-wp-form-' . $contact_form_id, 'my_custom_mail_raw_filter', 10, 2 );
}

まとめ

MW WP Formでスラッグを活用し、フォームIDを動的に取得するag_get_mwwpform_id関数を導入することで、開発環境と本番環境間でのデプロイ作業を大幅に簡素化し、コードのメンテナンス性と可読性を向上させることができます。

このアプローチは、特に複数のフォームを管理し、それぞれにカスタムロジックを適用する必要があるプロジェクトにおいて、その真価を発揮します。