アクションフックは、WordPressでPHPを使ったカスタマイズで、頻繁に使用される機能です。
殆どすべてのWordPressサイトでは、テーマやプラグインを使っていると思いますが、コアプログラム、プラグイン、テーマが協働して、WEBサイトを表示するために、欠かせない機能でもあります。
テーマのカスタマイズと言えば、テンプレートの一部を書き換えるもの思っておられる方もおられると思います。
そうですね、例えば、投稿本文の前に、要約文を付けたい場合テンプレートをカスタマイズするのと、アクションフィルタを使って処理するのでは、どんな違いがあるのか見てみたいと思います。
- テンプレートをカスタマイズする
Raindropsの場合 raindrops_entry_content() 関数が投稿本文を表示しますが、この関数はテーマの中で 38か所 程記述されています。 実際に使用されているテンプレートだけで変更するとしても、おそらく8か所 以上の変更を行う事になります。 さて、テーマのアップデートを行っても安全に運用できるように、チャイルドテーマを作成する事になります。 あなたは、投稿タイトルにサブタイトルを付けるために、実際に使用される8枚のテンプレートをコピーし、チャイルドテーマ用のstyle.cssを記述しまして、チャイルドテーマに保存しました。
- フィルターを使ってカスタマイズする
チャイルドテーマを作成するのは、テンプレートのカスタマイズと同様です。 このページで記述されているアクション名を使ってコードを記述するスキルは、誰にでもあるわけではありません。 しかし、このテーマでは、主要アクションフックを視覚化して表示する機能がありますので、この機能を使って、タイトルの後にサブタイトルを配置したいと思います。
-
テンプレート オートロード
公開済み2013年7月8日
を読んで、使い方を頭に入れてください。
開発者用設定を表示にして、カスタマイザープリビューを確認すると投稿本文の上部に 以下のメッセージを見つけることが出来ます。
アクションフック add_action( 'raindrops_prepend_entry_content', 'your_function' ) あるいは hook-prepend-entry-content.php テンプレートを追加していただく事で、この場所にコンテンツを追加できます。
上記の、フックを使うことで、要約文が追加できます。
でも、アクションフックの書き方は、誰にでも解かるものではなく、PHPの関数が作れるくらいのスキルを必要とします。
そのような場合には、Raindropsは、「hook-prepend-entry-content.php」というファイルを追加してくれれば、その内容を追加できるようになっています。
結果として、
チャイルドテーマに、style.css hook-prepend-entry-content.php この2つのファイルを追加する事で実現できるでしょう。
この二つのカスタマイズ方法を比較してみると、
- テンプレートのカスタマイズ
- チャイルドテーマに主要な8枚のテンプレート+style.cssを含む
- アクションフックによるカスタマイズ
- チャイルドテーマに、1枚のテンプレートの追加 or functions.phpの追加 + style.css
アクションフックは、使用するためのハードル(PHPが使える事、WordPressフックをつかえる事 WordPressコンディショナるタグを理解している事)は、やや高いものの、
この方法を使うと、テンプレートを直接書き換える事よりも、はるかにシンプルにカスタマイズを行う事が出来ます。 -
プレアクション
プレアクションは、テンプレート、テンプレートパートファイルで、テンプレートファイルでは、get_header()の直後に配置され、テンプレートパートファイルでは、global変数などの読み込み直後に配置されたアクションフックです。
このフックによって、htmlブロックを差し込んだり、他にも様々な用途に利用できます。
使用例
-
以下のコードは、author.phpにメッセージを表示して、author.phpのカラム数を、1カラムに変更ます。 functions.php
add_action('raindrops_pre_author.php','extend_raindrops_pre_author_php'); function extend_raindrops_pre_author_php(){ echo '<p style="text-align:center;">フィルタを使って1カラム表示を行います</p>'; global $raindrops_current_column; $raindrops_current_column= 1; }
-
次に、テンプレートパートファイルのアクションの例を見てみます。
(テンプレートパートファイルは、テンプレートの一部を構成する部分的なテンプレートファイルです) header.php には、raindrops_pre_part_header_$template.php というアクションフックがあります。 $template.php と記述された部分は、このテンプレートファイルを読み込んだテンプレートファイル名になります。 以下のコードは、category.phpから読み込まれた、header.phpファイルにだけ、アクションが行われます。 このコードを実行すると、カテゴリーアーカイブの uncategorized アーカイブがリクエストされた場合、アーカイブページを表示しないで、トップページにリダイレクトします。
add_action('raindrops_pre_part_header_category.php','extend_raindrops_pre_part_header_category_php'); function extend_raindrops_pre_part_header_category_php(){ if(is_category('uncategorized') ) { wp_redirect( home_url() ); exit; } }
404.php
- raindrops_pre_404.php
-
do_action( 'raindrops_pre_404.php' );
author.php
bbpress.php
- raindrops_pre_bbpress.php
-
do_action( 'raindrops_pre_bbpress.php' );
blank_front.php
- raindrops_pre_blank_front.php
-
do_action( 'raindrops_pre_blank_front.php' );
category.php
- raindrops_pre_category.php
-
do_action( 'raindrops_pre_category.php' );
date.php
- raindrops_pre_date.php
-
do_action( 'raindrops_pre_date.php' );
image.php
- raindrops_pre_image.php
-
do_action( 'raindrops_pre_image.php' );
index.php
- raindrops_pre_index.php
-
do_action( 'raindrops_pre_index.php' );
front-page.php
- raindrops_pre_front-page.php
-
do_action( 'raindrops_pre_front-page.php' );
front-portfolio.php
- raindrops_pre_front-portfolio.php
-
do_action( 'raindrops_pre_front-portfolio.php' );
full-width.php
- raindrops_pre_full-width.php
-
do_action( 'raindrops_pre_full-width.php' );
list-of-post.php
- raindrops_pre_list-of-post.php
-
do_action( 'raindrops_pre_list-of-post.php' );
page-featured.php
- raindrops_pre_page-featured.php
-
do_action( 'raindrops_pre_page-featured.php' );
page.php
- raindrops_pre_page.php
-
do_action( 'raindrops_pre_page.php' );
pdf.php
- raindrops_pre_pdf.php
-
do_action( 'raindrops_pre_pdf.php' );
search.php
- raindrops_pre_search.php
-
do_action( 'raindrops_pre_search.php' );
single.php
- raindrops_pre_single.php
-
do_action( 'raindrops_pre_single.php' );
footer.php
header-front.php
- raindrops_pre_part_header-front
-
do_action( 'raindrops_pre_part_header-front' );
header-front.php
- raindrops_pre_part_header-front_$template.php
-
do_action( 'raindrops_pre_part_header-front_$template.php' );
header-xhtml.php
- raindrops_pre_part_header-xhtml
-
do_action( 'raindrops_pre_part_header-xhtml' );
header-xhtml.php
- raindrops_pre_part_header-xhtml_$template.php
-
do_action( 'raindrops_pre_part_header-xhtml_$template.php' );
header.php
- raindrops_pre_part_header
-
do_action( 'raindrops_pre_part_header' );
header.php
- raindrops_pre_part_header_$template.php
-
do_action( 'raindrops_pre_part_header_$template.php' );
part-additional.php
- raindrops_pre_part_part-additional_$template.php
-
do_action( 'raindrops_pre_part_part-additional_$template.php' );
part-blog.php
- raindrops_pre_part_part-blog_$template.php
-
do_action( 'raindrops_pre_part_part-blog_$template.php' );
part-gallery.php
- raindrops_pre_part-gallery_$template.php
-
do_action( 'raindrops_pre_part-gallery_$template.php' );
part.php
- raindrops_pre_part_part_$template.php
-
do_action( 'raindrops_pre_part_part_$template.php' );
sidebar-default.php
sidebar-extra.php
sidebar.php
searchform.php
- raindrops_pre_part_searchform_$template.php
-
do_action( 'raindrops_pre_part_searchform_$template.php' );
アフターアクション
アフターアクションは、テンプレートの最後の行に記述された アクションフックです。
すべてのテンプレートに追加されているわけではありません。必要な場合は、get_footer アクションフックをで代用が可能です
使用例
以下の例は、category.phpで、get_header()で呼ばれるheader.phpのアクションフックを使って、
カテゴリーアーカイブを表示した時には、カテゴリーウィジェットを非表示にするという、ちょっと変わった例です。
ウィジェットのタイトルは、このアクションフックだけだと表示され続けるので、
フィルタを使って、CSSを追加しています( あくまで、こういうことも出来ますよという例示です )
functions.php
/** * フィルタを使って、カテゴリーウィジェットリンクリストを削除 * ヘッダーの最後のフィルタで、カテゴリテンプレートが使われた時に、ファイア */ add_action( 'raindrops_after_part_header_category.php','extend_raindrops_after_part_header_category_php'); function extend_raindrops_after_part_header_category_php(){ add_filter('wp_list_categories','__return_false' ); } /** * フィルタを使って、カテゴリーウィジェットのタイトル部分をCSSで非表示 * フィルタの説明用、 単に、cssで .category .widget_categories .widgettitle{display:none;} でよい */ add_filter('raindrops_embed_meta_css', 'hide_category_title_by_raindrops_embed_meta_css' ); function hide_category_title_by_raindrops_embed_meta_css($css){ if( is_category() ) { $css .= ' .widget_categories .widgettitle{display:none;}'; } return $css; }
404.php
- raindrops_after_404.php
-
footer.php
header-front.php
- raindrops_after_part_header-front_$template.php
-
header-xhtml.php
- raindrops_after_part_header-xhtml_$template.php
-
header.php
- raindrops_after_part_header_$template.php
-
part-additional.php
- raindrops_after_part_part-additional_$template.php
-
part-blog.php
- raindrops_after_part_part-blog_$template.php
-
part-gallery.php
- raindrops_after_part_part-gallery_$template.php
-
part.php
- raindrops_after_part_part_$template.php
-
searchform.php
- raindrops_after_part_searchform_$template.php
-