HTML タグの制約を一部緩和する一点物プラグイン

一点物プラグインとは

プラグインには一般向けで汎用的なプラグインと一点物のプラグインの2種類があります。一般向けは一般的なニーズに合わせて作るもので、ある程度ニーズの幅に対応できるように作らなくてはいけません。一点物はある特定のケースだけを想定して作るもので、そのケースをピンポイントに解決できればそれでいいというものです。普通、プラグインといえば一般向けのものを指します。

一般向けのプラグインを作る場合、ニーズに幅があることを考慮して作らないといけないので、「こういう機能が欲しい人もいるかもしれない」とか、「こういうデータも入力されるかもしれない」とか、いろいろと心配が多くなります。いきおいコードは複雑になってしまいます。

一方、一点物はどうかというと、極めてシンプルに作ることができます。対応する必要のある状況は特定されているので、オプションを設定するための UI を用意する必要もないわけです。

これまで、求められる状況に応じて一点物のプラグインをいくつか作ってきました。一般向けではないので公開したりはしてきませんでした。ふと思い立って、これからは一点物のプラグインも公開することにしました。一点物ならシンプルに作れるので、これから WordPress のプラグインを作りたいと考えている人にとって良い教材になるだろう思ったからです。

個人的な意見ですが、コアのコードに手を入れるのは極力避けるべきです。どこをどう変更したのか忘れますし、バージョンアップのたびに同じ変更を行なわなければならなくなります。変更はプラグインで行なうべきです。プラグインなら必要がなくなれば無効化すればいいだけです。

欲しい機能を持ったプラグインが探しても見つからないかもしれません。無いなら作ればいいのです。ここで紹介するプラグインを参考に、自作プラグインに挑戦してみてください。

HTML タグの制約を一部緩和する一点物プラグイン

最初に紹介する一点物プラグインは、投稿コンテンツの HTML タグに適用されるフィルタリングの制約を一部分だけ緩和するというものです。以前フォーラムでの質問に回答として作成したものですが、その時作ったそのままを公開します。

背景を説明すると、WordPress のユーザロールにはデフォルトで5種類があり、権限が大きい順に Administrator、 Editor、Author、Contributor、Subscriber とあります。このうち Author 以下のロールでは、投稿コンテンツ(ブログの本文)に一部の限定されたもの以外の HTML タグを含めることができません。あらゆるタグを使えるようにするとセキュリティ上のリスクになる場合があるためです。コンテンツの保存時にフィルタリングされ、許可された一部のもの以外のタグや属性が使われている場合はその部分が削除されます。

場合によっては、このフィルタリングの制約を少しだけ緩和したいこともあるでしょう。今回紹介するプラグインはそのために使うものです。

さっそく、プラグインのコードを見ていただきます。一点物プラグインのお約束ですが、ファイルとしては配布しません。ご自分でコピー&ペーストして、好きなファイル名で保存してお使いください。なお、保存時にコードの前後に不必要な空白が混入されるなどしてエラーになるケースがありますので、保存の際には注意してください。

ソースコード

<?php
/*
Plugin Name: Author Can Edit Script Tag
*/

function author_can_edit_script_tag() {
  global $allowedposttags;
  $user = wp_get_current_user();
  $role = array_shift($user->roles);
  if ('author' == $role) {
    $allowedposttags['script'] = array('language' => array(), 'src' => array());
  }
}

add_action('init', 'author_can_edit_script_tag', 20);

?>

解説

このプラグインでは Author ロールでログインしている場合に限り、使用可能なタグのリストに <script> タグを追加します。他のロールでログインしたユーザ、他のタグには影響は及びません。もちろん一点物のプラグインなので、他のタグを追加したいなど変更が必要な場合は直接コードを書き換える必要があります。

例えば <script> タグではなく <div> タグを使えるようにしたいなら、赤字で書かれた行を次のように変更します。

$allowedposttags['div'] = array('class' => array(), 'style' => array());

$allowedposttags の配列のキーがタグの要素名に相当し、さらにその値となる配列のキーが属性名に相当します。この例では class 属性と style 属性が使えるようになります。

なお、$allowedposttags の配列は <WP_INSTALL>/wp-includes/kses.php で定義されていて、フィルタリングで使用が許可されるタグの要素と属性の情報を保持しています。

次に適用対象となるユーザロールを変更してみます。Author ではなく Contributor に適用したいなら、青字で書かれた行を、

if ('contributor' == $role) {

のように変更します。Author と Contributor に適用したいなら、

if ('contributor' == $role || 'author' == $role) {

のように変更します。

シリーズ化?

「こういうプラグインはどう作るの?」というリクエストがありましたらコメントでお知らせください。採用するかどうかはわかりませんけど…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s