【WordPress】MW WP Formで選択肢にカスタム投稿タイプのリストを表示する方法

【WordPress】MW WP Formで選択肢にカスタム投稿タイプのリストを表示する方法

2017.5.1

WordPressの案件で何かのお申込みフォームが必要な場合、よくMW WP Formというフォーム生成プラグインを利用しています。

今回、そのフォーム項目で、プルダウンリストに「カスタム投稿タイプに登録した投稿を一覧表示させたい」という要件があったので、そのカスタマイズ方法のメモです!

MW WP Formの選択肢にカスタム投稿タイプをリスト表示する

よっひー(@yosiakatsuki)です。

選択肢の内容がそれほど頻繁に変更されるようなものでなければ、追加した投稿内容に対応するリスト項目を手動で追加する運用でも問題ないと思います。

ですが、頻繁に内容が書き換わるような場合、毎回手動で選択項目をメンテナンスするのは大変ですよね…

ということで、今回、例えば「イベント情報」や「セミナー情報」といったカスタム投稿タイプの投稿をフォームの選択肢に表示したい

…といったことを実現する方法です。

フィルターフックを使って選択肢を追加

まずは対応するフォーム項目の定義から

<!-- events という名前のセレクトボックスを作る -->
<dl>
<dt>イベント</dt>
<dd>[mwform_select name="event" ]</dd>
</dl>

今回は説明のためにeventという名前のセレクトボックスを定義します。

このセレクトボックスにカスタム投稿の内容を表示する方法は次の通りです(functions.phpに記述してください)

function add_event_list( $children, $atts ) {

    if ( 'event' == $atts['name'] ) {
        $events = get_posts( array(
            'post_type' => 'event',
            'posts_per_page' => -1,
        ) );

        foreach ( $events as $event ) {
            $children[$event->post_title] = $event->post_title;
        }
    }
    return $children;
}
add_filter( 'mwform_choices_mw-wp-form-xxx', 'add_event_list', 10, 2 );

mwform_choices_mw-wp-form-xxxフィルターフックを使い、nameeventの項目のときだけget_postsで取得した投稿一覧(今回はeventカスタム投稿)を選択肢に追加しています。

フィルターフックの末尾はフォーム識別子のkey値と対応している

mwform_choices_mw-wp-form-xxxxxxの部分はMW WP Formのフォーム識別子(ショートコード)のkeyに対応しています。

実際にはもう少し複雑なパラメータ指定になっていて、下記のコードのように、カスタムフィールドに開催日を持たせて、「まだ終了していないイベントをリストに表示する」のようなことをやっています。

function add_event_list( $children, $atts ) {

    if ( 'event' == $atts['name'] ) {
        $events = get_posts( array(
            'post_type' => 'event',
            'posts_per_page' => -1,
            'meta_query' => array(
                              array(
                                'key'     => 'event_date',
                                'value'   => date_i18n('Y-m-d'),
                                'compare' => '>=',
                                'type' => 'DATE'
                              ),
                            ),
            'order'=>'ASC',
            'orderby' => 'meta_value',
        ) );

        foreach ( $events as $event ) {
            $children[$event->post_title] = $event->post_title;
        }
    }
    return $children;
}
add_filter( 'mwform_choices_mw-wp-form-xxx', 'add_event_list', 10, 2 );

さいごに

メンテナンスが頻繁に発生するような選択肢は、メンテナンス用に1つカスタム投稿を用意してしまってもいいかもしれないですね…

(心当たりがあるのでなんとかしたい…)

ではまた。