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

PHP
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!」と表示されるはずです。

これは管理画面のヘッダ部分の処理を行うファイル「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

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

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

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

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

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

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

wp-includes/post-template.php

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 – アクション

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

wp_enqueue_style

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

投稿保存

save_post – アクション

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

transition_post_status – アクション

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

delete_post – アクション

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

検索

pre_get_posts – アクション

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

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

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

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

慣れてきたら

処理を追ってみる

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

do_actionapply_filters で検索してみるのもよいです。

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

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

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

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

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

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

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

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

例えば

[affitiate id="1"]

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

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

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

セキュリティ対策

CSRF

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

WordPress Nonce - WordPress Codex 日本語版

適切な権限

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

入力値の無害化

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

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

Securing (sanitizing) Input | Plugin Developer Handbook | WordPress Developer Resources
Securing input is the process of sanitizing (cleaning, filtering) input data. You use sanitizing when you don't know what to expect or you…

出力値の無害化

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

さもなければXSSなどの問題が発生します。

Securing (escaping) Output | Plugin Developer Handbook | WordPress Developer Resources
Securing output is the process of escaping output data. Escaping means stripping out unwanted data, like malformed HTML or script tags.…

公開してみる

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

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

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

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

まとめ

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

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

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

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

コメント

タイトルとURLをコピーしました