Habakiri のアクションフックの使い方

この記事は Habakiri Advent Calendar 2015 10日目の記事です。8日目は Taz さんの「最近Habakiriのテーマをいじって勉強したのでその時の感想など。」でした。9日目を飛ばしてしまいましたが(実際この記事も11日に書いてしまっていますが)、1ネタ思いついたので書いていきたいと思います。

Habakiri にはアクションフックがたくさん!っていうけど、どう使うの?

Habakiri にはテンプレートを上書きせずに HTML を追加できるように各所にアクションフックが仕込んであります。このアクションフックを使って任意の HTML を追加しようという場合、単純にやると下記のようになるかと思います。

<?php
function habakiri_child_theme_setup() {
	class Habakiri extends Habakiri_Base_Functions {

		public function __construct() {
			parent::__construct();
			
			add_action(
				'habakiri_after_entry_content',
				array( $this, 'habakiri_after_entry_content' )
			);
		}

		/**
		 * .entry__content の後に新着記事を表示
		 */
		public function habakiri_after_entry_content() {
			global $post;
			$recent_posts = get_posts( array(
				'posts_per_page' => 3,
			) );
			?>
			<div class="recent-posts">
				<?php foreach ( $recent_posts as $post ) : setup_postdata( $post ); ?>
				<div>
					.....
				</div>
				<?php endforeach; wp_reset_postdata(); ?>
			</div>
			<?php
		}
	}
}
add_action( 'after_setup_theme', 'habakiri_child_theme_setup' );

だいたい上記のような感じだと思います。habakiri_after_entry_contentフックを使って、.entry__contentの後に新着記事を3件表示する例ですが、コールバック関数の中に全部書いてしまっているため、もしこのようなアクションフックによる HTML の追加が複数あると、functions.phpがとても長くなってしまい、結果、メンテもとても難しくなってしまいます。

そこで、下記のようにするのがおすすめです。

// コールバック関数の部分だけ抜粋

public function habakiri_after_entry_content() {
	get_template_part( 'modules/after-entry-content' );
}

最新記事の取得の記事を HTML の生成をmodules/after-entry-content.phpに切り出し、それをget_template_part()で呼び出す方法です。これであればアクションフックの利用が複数になっても、各パーツ毎にファイルが分割されている構成になるため、場所ごとに管理しやすくなりますね。

フィルターフックの場合

アクションフックの場合の例をご紹介しましたが、フィルターフックでも上記のように切り出しを行いたいとしても、そのままでは正しく表示されません。アクションフックの場合は HTML をそのまま出力すれば良いのですが、フィルターフックの場合は文字列としてretrunしなければならないからです。例えばthe_contentフィルターフックを使い本文の前に HTML を追加したい場合は下記のようにすれば OK です。

// コールバック関数の部分だけ抜粋

public function the_content( $content ) {
	ob_start();
	get_template_part( 'modules/before-content' );
	$before_content = ob_get_clean();
	return $before_content . $content;
}

ob_start()でバッファリングを有効にすることで、通常get_template_part()で HTML 出力されるところが、出力ではなく、変数に格納できる状態になります。そして、ob_get_clean()で変数への格納とバッファリングの終了を行い、もともとの内容($content)と連結させてreturnさせれば OK です。

この投稿へのコメント

コメントはありません。

コメントを残す

この投稿へのトラックバック

  1. […] Habakiri のアクションフックの使い方 […]

  2. […] 表示されません。 例えばthe_contentフィルターフックを使い本文の前に HTML を追加したい場合は下記のようにすれば OK です。 [紹介元] Habakiri のアクションフックの使い方 – Habakiri […]

  3. […] ば記事の前後とか、タイトルの前後とか、ヘッダーの前後とか、いろいろなところにアクションフックが用意してあります。なので「ここに何かを足したいんですよ」みたいなときにテ […]

トラックバック URL