お問い合わせ

Cocoonにもテンプレート読み込みフックが追加される

SnowMonkeyやArkheに実装されているget_template_part関数のフックがCocoonにも実装されました。

テンプレート呼び出しをget_template_part関数からcocoon_template_part関数に変更

https://wp-cocoon.com/2-6-8/

Cocoonの場合、フックが多数仕込まれてるのと、関数は子テーマから置き換えができるようになっています。SnowMonkeyやArkheとはカスタマイズの思想が異なることから実装されることは無いかと予想していた機能です。

修正範囲がソースコードの全体にわたる機能追加であるので機能追加としては手を出しにくい項目ですので、わいひら氏の英断だとおもいます。

cocoon_template_part($slug)関数が追加され、その中に実装されたのは3つのフックです。

cocoon_template_part($slug)関数とフック

//get_template_partに関するフック付加
if ( !function_exists( 'cocoon_template_part' ) ):
function cocoon_template_part($slug){
  ob_start();
  get_template_part($slug);
  $content = ob_get_clean();

  // 読み込み前発火
  if (has_filter("cocoon_part_before__{$slug}")) {
    do_action("cocoon_part_before__{$slug}");
  }

  // 書き換え
  if (has_filter("cocoon_part__{$slug}")) {
    $content = apply_filters("cocoon_part__{$slug}" ,$content);
  }
  echo $content;

  // 読み込み後発火
  if (has_filter("cocoon_part_after__{$slug}")) {
    do_action("cocoon_part_after__{$slug}");
  }
}
endif;

do_action(“cocoon_part_before__{$slug}”)

テンプレートファイルの読み込み前発火のアクションフック

このアクションフックは、get_template_partにも同じフックがありますので、get_template_partを使っていたテンプレート読み込みでは以前から使えました。

do_action( 'get_template_part', string $slug, string $name, string[] $templates, array $args )

Cocoonのソースコードには、get_template_part_tmp/xxxというフックが結構見当たります。

apply_filters(“cocoon_part__{$slug}” ,$content);

テンプレートファイルの出力を書き換えるためのフィルターフック

このフィルタは今回追加された機能です。

テンプレートパーツのHTML出力を書き換えるものですが、PHPのテンプレートを丸ごと差し替えることも可能です。

do_action(“cocoon_part_after__{$slug}”);

テンプレートファイルの読み込み後発火するアクションフック

このアクションフックは、get_template_partフックには無い機能で、この機能が増えたことでHTMLを追加したり、テンプレート出力後に行いたい処理を発火させることが簡単にできるようになりました。

Cocoonのテンプレート読み込みフックの使用例

Coconのソースコードの中で、cocoon_template_part($slug)で読み込まれているテンプレートパーツがあって、その部分に何らかの処理を加えたい時に、今回追加されたフックを利用することができます。

テンプレートパーツ出力のHTMLを書き換えたい場合

テンプレートパーツが以下のように読み込まれているとします。

<?php //ヘッドタグ内挿入用のアクセス解析用テンプレート
cocoon_template_part('tmp/head-analytics'); ?>

Cocoonではtmpディレクトリのファイルに書き込むことで実現している機能があります。

そのファイルを編集しなくても、子テーマのfunctions.phpから設定することができます。

add_filter("cocoon_part__tmp/head-analytics" ,function($content){

ob_start();

return ob_get_clean();

});

テンプレートパーツ出力前・後にHTMLに追加したい場合

add_action("cocoon_part_before__tmp/head-analytics",function(){
?>

<?php
});

add_action("cocoon_part_after__tmp/head-analytics",function(){
?>

<?php
});

Cocoonのテンプレート読み込みフックは使いにくい

Coconのフックには、フックに渡される引数がありません。そのため、引数から情報をもらって動作を切り替えるという使い方ができない欠点があります。

このあたりは、SnowMonkeyやArkheの実装を見ると必要な機能だとわかると思うのですが、Cocoonではそこが考慮されていません。

Arkheはフックを使って、テンプレートパーツ出力をキャッシュする機能を実装していますが、Cocoonでは同じように実装することはできません。

	public static function get_part( $slug = '', $args = null ) {

		if ( '' === $slug ) return '';

		// パーツ読み込み前に発火するフック
		if ( has_filter( "arkhe_pre_get_part__{$slug}" ) ) {
			do_action( "arkhe_pre_get_part__{$slug}" );
		}

		// $args 上書き用フック
		if ( has_filter( "arkhe_part_args__{$slug}" ) ) {
			$args = apply_filters( "arkhe_part_args__{$slug}", $args );
		}

		// ファイルまでのパスを取得
		$inc_path = self::get_include_part_path( $slug );

		// $inc_path を任意のパスに上書き可能なフック
		if ( has_filter( "arkhe_part_path__{$slug}" ) ) {
			$inc_path = apply_filters( "arkhe_part_path__{$slug}", $inc_path );
		}

		if ( '' === $inc_path ) {
			if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
				echo 'Not found : part "' . esc_html( $slug ) . '"';
			}
			return;
		}

		$cache_data = null;

		// キャッシュ取得用フック
		if ( has_filter( "arkhe_part_cache__{$slug}" ) ) {

			$cache_data = apply_filters( "arkhe_part_cache__{$slug}", null, $slug, $inc_path, $args );
		}

		// キャッシュがあればそれを出力
		if ( null !== $cache_data ) {
			echo $cache_data; // phpcs:ignore
		} else {
			// キャッシュなければ普通にパーツを読み込んで出力
			self::the_part_content( $slug, $inc_path, $args );
		}

		// パーツ読み込み後に発火するフック
		if ( has_filter( "arkhe_did_get_part__{$slug}" ) ) {
			do_action( "arkhe_did_get_part__{$slug}" );
		}
	}

Cocoonの機能追加が目覚ましい

Cocoonは開発当初と比べて、ブロックエディタ周りの機能追加を積極的に行っていない印象がありました。

無料テーマなので、当然開発コストの問題やわいひら氏の体調の問題もあるでしょう。

しかし、最近、ブロックエディタ周りの装飾で大幅な機能追加がありました。

今回の機能追加もかなりアグレッシブな内容ですので、今後、Cocoonの反撃が始まるのかもしれません。

まとめ

Coconがget_template_part関数のラッパー関数を導入し、SnowMonkeyやArkheのようなフックを追加してきたことはSWELLにとって少なからず影響があるでしょう。

SWELLはArkheとの差別化のために、あえて実装しない方針だそうです。SWELLが避けてきた機能をCocoonが実装したことで、今後、SWELLにも実装される可能性が出てきたと思います。

役に立ったら他の人にもシェア!
  • URLをコピーしました!
  • URLをコピーしました!
コメントを閉じる

コメント

コメント一覧 (3件)

  • プラグインなしでswellの人気記事を、特定の期間ごとにウィジェットから並べ替える方法をできればお願いします!

コメントする

コメントは日本語で入力してください。(スパム対策)

クリックできる目次