ショートコードを含んだページを表示する前に何か処理する

ショートコードを含んだページを表示する前に何か処理する - 独自フォームの埋め込みをショートコードで実装する際に考えた

説明

固定ページまたは投稿ページに独自のフォームを埋め込む。入力→登録の2段階のフォームなら著名なプラグイン「Contact Form 7」を利用すればいいのだが、クライアントの依頼は入力→確認→登録の3段階で組み込む要素が特化していたので、独自の実装方法を考えることになった。

ショートコードによるフォームの実装で悩ましいのが、確認ページと登録ページでの処理のタイミング。特に確認ページにおいて入力ページから受け取ったパラメータのチェックし、必須項目が未入力だった場合に登録ページに戻すといった処理を実装することである。テーマ内のテンプレートファイルなどで行えば簡単なのだが、テンプレートファイルが煩雑になるのは避けたい。

というわけで思いいたったのが、template_redirectアクションを利用する方法である。このtemplate_redirectアクションは、リクエストパラメータに応じた投稿情報の取得後、現在のテーマで適切なテンプレートファイルを捜してロードする前に呼び出されるアクションである(/wp-includes/template-loader.php参照)。

実装するコードは次の通り。

add_action( 'template_redirect', 'extend_template_redirect' );

function extend_template_redirect() {
	if ( is_singular() ) {	// 投稿・固定ページのみ
		global $post;
		if ( false !== strpos( $post->post_content, '[' ) ) {
			$pattern = get_shortcode_regex();
			preg_replace_callback( "/$pattern/s", 'pre_shortcode_tag_callback', $post->post_content );
		}
	}
}

function pre_shortcode_tag_callback( $m ) {
	if ( ( $m[1] == '[' && $m[6] == ']' ) )
		return;

	$tag = $m[2];
	$attr = shortcode_parse_atts( $m[3] );
	$content = '';
	if ( isset( $m[5] ) ) $content = $m[5];
	do_action( 'pre_shortcode_'.$tag, $attr, $content );
}

これでショートコードが組み込まれたページを表示する前に、'pre_shortcode_ショートコード名'という名前のアクションが実行されることになる。独自のアクションはadd_action関数を使って必要なショートコードのアクション関数を登録しておけばいい。ショートコード名が'test'の場合は次のような感じになる。

add_action( 'pre_shortcode_test', 'my_pre_shortcode_test', 10, 2 );

function my_pre_shortcode_test( $attr, $content='' ) {
	// ここに前処理を記述
}

以前、前処理をテンプレートファイルに記述して実装したことがあったが、こちらの方がテンプレートファイルがすっきりする。独自フォームの埋め込みについては、ショートコードを使用せずにカスタムフィールドを使う方法もありそう。まあ、カスタムフィールドの場合でも同じようなことはできそうである。とりあえず自分用メモってことで。

関連

お勧めコンテンツ

get_search_form(2009年11月25日 登録)

void get_search_form( [ bool $echo = true ] )
サイト内検索フォームのテンプレートファイルを読み込んで表示する。

wp_image_editor_supports(2012年12月20日 登録)

bool wp_image_editor_supports( [ mixed $args = array() ] )
イメージエディタがサポートしているか調べる。

attachment_url_to_postid(2014年9月7日 登録)

int attachment_url_to_postid( string $url )
添付ファイルのURLから投稿IDを取得する。

delete_post_meta_by_key(2014年3月17日 登録)

bool delete_post_meta_by_key( string $post_meta_key )
カスタムフィールドの値を一括削除する。

has_excerpt(2011年4月22日 登録)

bool has_excerpt( [ int $id = 0 ] )
投稿情報に抜粋が含まれている(入力されている)か調べる。

最終更新日時 : 2014-05-28 15:29