LIGに勤めて半年で長野に左遷され、ゲストハウスをやることになりました。本当にありがとうございました。
2465338173
1
こんにちは、日々WordPressをカスタマイズしているエンジニアのひろゆきです。
今回はWordPressのカスタマイズの際に活躍するフィルターフック、アクションフックについてまとめました。
本稿ではフックを知ってもらって、とりあえず使ってみることを目的としますので、詳しい動作原理や本来の目的などについてはCodexなどを見てくださいね!
参考:プラグイン API – WordPress Codex 日本語版
http://wpdocs.sourceforge.jp/プラグイン_API
また、過去に弊社CTOのづやが便利なアクションフックについての記事「wordpressでよく使った管理画面用アクションフック」を書いておりますので、こちらもあわせて見てみてください!
まずはフィルターフックとアクションフックの違いについてですが、それぞれフックの種類によって便宜的に分けられているものの、機能としては同じです。
なので、本稿ではこれらについてあまり意識せずに解説を進めたいと思います。それぞれをまとめて、以下ではフックと呼びます。
また、そもそもフックとは何かということですが、簡単にいうと「きっかけ」のことです。WordPressには以下のように様々なタイミングでフックが用意されています。
フックを使うということは、これらのタイミングにあわせて自分が用意した関数を実行させるということです。例えばthe_title()が実行されたのをきっかけに、何かの処理をさせようという訳です。
言葉で説明するのは難しいので、習うより慣れろ!方式で、実際にどんな関数を使うとどういう挙動になるのかを見ていきましょう。
フックを利用する際にはadd_filter()またはadd_action()という関数を使います。どちらも機能は同じですので、どちらかを使えば動きます。
フィルターフックを使うときはadd_filter()、アクションフックのときはadd_action()を使うぐらいの認識で問題ないかと思います。
参考:フィルターフック一覧
http://wpdocs.sourceforge.jp/プラグイン_API/フィルターフック一覧
参考:アクションフック一覧
http://wpdocs.sourceforge.jp/プラグイン_API/アクションフック一覧
add_filter( $tag, $function_to_add, $priority, $accepted_args );
関数はこのように記述します。それぞれ役割を説明します。
それでは実際にフックを使ってWordPressの挙動を変えてみます。下記をfunctions.phpなどに追加します。
function my_the_title($title, $id) { return 'ID='.$id.$title; } add_filter('the_title', 'my_the_title', 10, 2);
これで、the_title()を実行するとID=〜タイトルという形で出力されます。ただこれだとフックせずともテンプレート側で実装できますね。
次はもう少し実用的な使い方を試しましょう。新規投稿の際にタイトル欄に表示されている「タイトルを入力してください」というプレースホルダを「タイトルを入力してや!」に変更してみます。
プレースホルダを出力する直前に実行されるenter_title_hereというフックを使います。
function my_enter_title_here($title){ return 'タイトルを入力してや!'; } add_filter('enter_title_here', 'my_enter_title_here', 10, 1);
引数を見てみると、中身には「タイトルを入力してください」という文字列が入っていましたので、そのまま「タイトルを入力してや!」という文字列を返してあげました。
これで、記事を新規登録するプレースホルダは「タイトルを入力してや!」となっているはずです。
なんとなくイメージは掴めたでしょうか?フックは数多く存在するので、自分が実行したいタイミングのフックを見つけて処理を追加するイメージです。
フィルターフック、アクションフックを使う際、特に気をつけていただきたいのが影響範囲です。例1をもう一度見てみます。
function my_the_title($title, $id) { return 'ID='.$id.$title; } add_filter('the_title', 'my_the_title', 10, 2);
実装する際にはこれをfunctions.phpなどに記述するわけですが、the_titleというフックはthe_title()やget_the_title()が実行されるときのフックであり、非常に影響範囲が広いです。
全体に適応したい場合は上記の記述で問題ないですが、限定したい場合は対策が必要です。方法は主に2通りあります。
remove_filter()を使い、add_filter()を取り消すことができます。
<?php add_filter('the_title', 'my_the_title', 10, 2); ?> <h2><?php the_title(); ?></h2> <?php remove_filter ('the_title', 'my_the_title'); ?>
使い方はこんな感じ。この記述だと上記のthe_title()1行にしか影響しません。
もう1つはフックで実行する関数の中で条件分岐させる方法です。今度は例2で見てみます。
function my_enter_title_here($title){ return 'タイトルを入力してや!'; } add_filter('enter_title_here', 'my_enter_title_here', 10, 1);
これだとどの投稿でも新規作成の場合は「タイトルを入力してや!」となってしまいます。これをpostの投稿タイプのみで表示されるように調整してみましょう。
function my_enter_title_here($title) { global $post; if(is_admin() && !empty($post->post_type) && $post->post_type == "post"){ return 'タイトルを入力してや!'; } return $title; } add_filter('enter_title_here', 'my_enter_title_here', 10, 1);
こんな感じになります。is_admin()というのは管理画面かどうかの判定で、念のために記述しています。これでpostの投稿タイプのときだけ、新規作成のプレスホルダが「タイトルを入力してや!」になるわけです。
例えば製品情報をpostと別の投稿タイプで扱っているときなどに、製品記事の投稿タイプでのみ「製品タイトルを入力してください」とかにしてあげると親切かもしれないですね。
最後にいくつか便利なフィルターをご紹介します!
記事の表示件数やソートをする時に使う有名なやつです。query_postsでやってたようなことができます。
function change_posts_per_page($query) { if ( is_admin() || ! $query->is_main_query() ) return; if($query->is_category()){ $query->set( 'posts_per_page', '10' );//件数変更 $query->set( 'orderby', 'post_date' );//ソート指定 $query->set( 'order', 'DESC' );//ソート順番 } } add_action( 'pre_get_posts', 'change_posts_per_page' );
上記の記述だとカテゴリ一覧の場合に10件の記事が表示されます。
Wordpressには本文を自動整形する機能があって、pタグがついたりbrタグが利かなかったりします。普通に使う分には便利なのですが、htmlを直接反映させたい場合などは不都合です。そんなときは下記のフィルターを使いましょう。
remove_filter( ‘the_content’, ‘wpautop’ );
the_contentから自動整形するフィルターを解除できます。
デフォルトでは「こんにちは、〇〇さん!」となってる管理画面のメッセージですが、自分のテンションが上がるように自由に変えることができます。
function replace_hello_text( $wp_admin_bar ) { $my_account = $wp_admin_bar->get_node( 'my-account' ); $newtitle = str_replace( 'こんにちは、', 'おかえりなさい、', $my_account->title ); $wp_admin_bar->add_menu( array( 'id' => 'my-account', 'title' => $newtitle, 'meta' => false ) ); } add_filter( 'admin_bar_menu', 'replace_hello_text', 25 );
これで「おかえりなさい、〇〇さん!」となります。うまく工夫すれば記事の入効率がアップするかもしれませんね!
最初はちょっとわかりにくいフィルター、アクションフックですが、便利なので是非使ってみてくださいね!今回はあまり概念的なところや仕組みには触れなかったのですが、慣れてきたら各自冒頭のリンク先で調べてみてください。
ではまた!
LIGの二代目広報担当、ひろゆきや。大阪生まれの大阪育ち。LIGの名を世界に広める為、頑張るで。ほんま、よろしくやで。
まいどおおきに。俺の名前は大田ひろゆき。LIGの広報担当や。FacebookとかTwitterとかメルマガで、皆にメッセージを届けさせてもらうで。ほんまに。 あと俺の発信する情報はLIGからの公式メッセージやと思ってもらってかまへんから。ってか公式のメッセージやわな。下にある「いいね!」を押すか、twitterをフォローして俺の情報を逃さんようにしてな。 メールマガジンの登録もめっちゃ簡単やから、おすすめやで~
一度も海を見たことない人が海を見て一言。