WordPress の「アクション」と「フィルタ」を「フック」してプラグインを開発してみる

WordPress

この記事は下のページの続きになります。

WordPressのプラグインを自分で開発してみる
WordPressを運用しているなら必ずと言ってもいいほどお世話になるプラグイン。お問い合わせフォームからSEO対策、サイトマップ生成やサイトの高速化まで様々なプラグインがあります。何かWordPressに欲しい機能があった場合、ネットで探

最小限のプラグインが用意出来たらいよいよ機能を追加していきましょう!

最初に

WordPressのプラグインを作成するうえで絶対に必要な概念として「アクション」「フィルタ」があります。

WordPressは本体だけで色々な機能が備わっていますが、プログラムの所々で「アクション」と「フィルタ」を適用するプログラムが書かれています。

  • アクション
do_action( 'admin_notices' );
do_action_ref_array( 'pre_get_posts', array( &$this ) );
  • フィルタ
$content = apply_filters( 'the_content', $content );
$where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) );

この「アクション」と「フィルタ」は「フック」することができます。

「フック」するとは

機能を追加することです。

具体的には「do_action」「apply_filters」「do_action_ref_array」「apply_filters_ref_array」が書かれている箇所に処理を挟むことができます。

試しに前回作成したプラグインファイルにプログラムを追加していきます。

<?php
/*
Plugin Name: My
Description: 自分用プラグイン
Version: 1.0
Author: technote
Author URI: https://technote.space
License: GPL2
*/

add_action( 'admin_notices', function () {
   echo 'Hello World!';
} );

管理画面にアクセスすると上部に「Hello World!」と表示されるはずです。

管理画面のヘッダ部分の処理をする「【WordPressをインストールしたフォルダ】\wp-admin\admin-header.php」にある

do_action( 'admin_notices' );

をフックして「Hello World!」を表示するプログラムを割り込ませたことになります。

アクションに対しては「add_action」、フィルタに対しては「add_filter」でフックしていきます。

https://wpdocs.osdn.jp/関数リファレンス/add_filter

https://wpdocs.osdn.jp/関数リファレンス/add_action

 * @param string   $tag             フィルタ名
 * @param callable $function_to_add 実行する処理(グローバルに定義した関数や無名関数、array($this, 'func')のようにクラスメソッドなどを渡す)
 * @param int      $priority        優先順位(デフォルト=10、小さいほど先に処理される)
 * @param int      $accepted_args   引数の数(デフォルト=1)
 * @return true
 */
function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 )

add_actionは実装を見るとわかる通りadd_filterと同じです。

function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
   return add_filter($tag, $function_to_add, $priority, $accepted_args);
}

アクションとフィルタの違い

どちらも処理を割り込ませるのですが

  • アクションは処理を実行
  • フィルタは値を変更

という目的で使い分けがされています。

先ほどの例ではアクションを追加して「Hello World!」を表示する処理を実行しました。

一方でフィルタの例として、投稿タイトルを取得する関数「get_the_title」を見てみます。

function get_the_title( $post = 0 ) {
   $post = get_post( $post );

   $title = isset( $post->post_title ) ? $post->post_title : '';
   $id = isset( $post->ID ) ? $post->ID : 0;

  ~省略~

   /**
    * Filters the post title.
    *
    * @since 0.71
    *
    * @param string $title The post title.
    * @param int    $id    The post ID.
    */
   return apply_filters( 'the_title', $title, $id );
}

一番最後に「apply_filters」があり、その返り値が「get_the_title」の返り値になっています。

試しにタイトルの最後に必ず「Hello World!」がつくようにしてみましょう。

add_action( 'the_title', function ( $title, $id ) {
   return $title . ' Hello World!';
}, 10, 2 );

このように「$title」の値を変更することができます。

よく使う「アクション」と「フィルタ」

初期化

init – アクション

WordPressの読み込みが完了し、ヘッダーが送信される前に実行されます。

ユーザ情報は取得できますが、投稿はまだ取得できません。

フロント、管理画面どちらでも実行されます。

プラグインで使用するアクションやフィルタを登録したりします。

admin_init – アクション

管理画面にてページが表示される前に実行されます。

値を保存したり管理画面用のアクションやフィルタを登録したりします。

template_redirect – アクション

フロント側で使用するアクションやフィルタを登録したりします。

投稿表示

the_title – フィルタ

タイトルを一部変更したりすることができます。

the_content – フィルタ

投稿の一番最後に共通文言を追加したり、投稿内容を書き換えたりすることができます。

CSS、JS登録

wp_enqueue_scripts – アクション

CSSやJSを登録する際に使用します。

投稿保存

save_post – アクション

投稿保存時に処理を追加できます。

transition_post_status – アクション

投稿ステータス(公開、下書き等)が変更されたときに処理を追加できます。

delete_post – アクション

投稿削除時に処理を追加できます。

検索

pre_get_posts – アクション

検索条件を色々操作することができます。

使用可能なアクションとフィルタの一覧

https://wpdocs.osdn.jp/プラグイン_API/アクションフック一覧

最初のうちはあまりにも多くのフック可能な箇所に戸惑ってしまうかもしれません。

慣れてきたら

処理を追ってみる

プログラムの処理を追って、割り込めるアクションやフィルタがないか探します。

いろんな箇所にアクションやフィルタがあり、先ほどは戸惑うかもしれないと言ったそのアクションやフィルタの多さが、今度はありがたく感じてくるはずです。

プラグインの構成を考える

ここまではプラグインのファイルは一つのPHPファイルのみの場合を解説してきました。

ですがほとんどのプラグインはディレクトリ構造になっていると思います。

プラグインファイル名でディレクトリを作ってその中にPHPファイルを入れても同じようにプラグインと認識してくれます。

さらにPHPファイルから機能ごとに分けた別のPHPファイルを呼び出してあげると見通しがよくなると思います。

ショートコードを追加してみる

WordPressでは投稿記事内からちょっとしたプログラムを実行してその結果を表示させる機能があります。

例えば

[affitiate id="1"]

でアフィリエイトタグを挿入できるようにショートコードを作成すれば便利になるでしょう。

ショートコードの詳細は以下を参照してください。

https://wpdocs.osdn.jp/ショートコード_API

セキュリティ対策

CSRF

主に管理画面で設定値を保存する場合にCSRFの対策をする必要があります。

WordPress Nonce - WordPress Codex 日本語版

適切な権限

またWordPressには権限という概念があり、あなたの追加した機能は適切な権限のユーザが使用できるものになっている必要があります。

(管理画面のみであなただけしか使用しないのであればあまり問題はありません)

入力値の無害化

フォームから送信された値は無害化して使用しましょう。

そのための関数がWordPressには用意されています。

Securing Input | Plugin Developer Handbook | WordPress Developer Resources

出力値の無害化

出力する際も無害化しましょう。

Securing Output | Plugin Developer Handbook | WordPress Developer Resources

公開してみる

あなたが必要とした機能はきっと他の人も必要としているでしょう。

公式ディレクトということろに登録すると、他の人がプラグイン一覧から検索してプラグインとして利用することができるようになります。

自作WordPressプラグインを公式リリースするまでの手順まとめ
WordPress(ワードプレス)のプラグインを自作。そのままWordPressプラグイン公式サイトに登録してみたので手順まとめました。readme.txtの作成やSubversionでの管理方法についても触れています。

基本的にタダで公開することになりますが、最近は仮想通貨による寄付ボタンを設置しているものもありますし、プログラミングスキルを公開することにもなります。

まとめ

「アクション」と「フィルタ」さえ理解できれば簡単に機能を追加できるようになります。

他にもWordPressにはいろいろな便利な関数が用意されているので、それらも組み合わせると可能性は無限大に広がるでしょう。

まずはちょっとしたものから試してみて、だんだんと追加しながら慣れていくとよいかもしれません。

ぜひ自分でプラグインを作ることに挑戦してみてください。

コメント