WordPress Jetpack pluginを強制的に止める

非常に限定的な状況での話なのですが、とあるWordPressサーバで Jetpack プラグインが動作しなくなるということがあり相談を受けました。

動かないなら止めればいい、と思うのですが、Jetpackの管理画面も、プラグインの停止リンクも、真っ白やデザインの無いページに遷移してしまい、プラグインを止めることができません。

自分の管理下のサーバなら、直接サーバをいじればいいのですが、サーバーにログインする権限がなく、pluginフォルダを削除できません。(サーバに触れるなら、プラグインのファイルを消してしまえば終わりです) mysqlの直接アクセスも許されていないので、プラグインの利用フラグを直接オフにすることもできません。

WordPressの管理画面だけは管理権限があるので、これでなんとか止めよう、となると、管理画面からの「プラグイン」の「編集」しかありません。

jetpack/jetpack.php を単に止めただけでは、Jetpack の処理は起動しなくなりますが、Jetpack プラグインを停止・削除できないのは同じです。そこで、jetpack.php の冒頭にある要求WordPressのバージョン番号

define( ‘JETPACK__MINIMUM_WP_VERSION’, ‘4.5’ );

を、現在のWordPressバージョンより大きな数字、たとえば’10.0’とかに書き換えて保存することで、Jetpackのバージョンチェックが走り、プラグインは停止してくれました。

一旦停止状態になれば、管理画面から削除してしまうことも可能です。

[メモ] symfony/sfPayloadFilterChainPluginによる文字列のフィルタ保存

sfPayloadFilterChainPlugin

掲示板とかで、表示時にフィルタをかけるんじゃなくて、保存時にまずい文字列とかを見つけて伏字にしたりするためのsymfony プラグイン。

インストール方法

> symfony plugin-install http://plugins.symfony-project.com/sfPayloadFilterChainPlugin

設定ファイル

$ cd frontend/config/pfc
$ edit frontend/config/pfc/profiles.yml
post_comment: [censor_bad_words, hide_phone_number]

$ edit frontend/config/pfc/filters.yml

  censor_bad_words:
    enabled: on
    class:   myCensorshipFilter
    params:
      bad_words:        [死ね, 死ねばいいのに, 氏ね]
      replacement_word: "王大人に死亡確認されればいいのに"
  hide_phone_number:
    enabled: on
    class:   akkyHidePhoneNumberFilter
    params:
      replacement_word: "***-****-****"

payloadでフィルタするテキストを受け渡す作りで、説明にあるように単純なpayloadクラスを作っておく

lib/payload/myTextPayload.class.php

[code lang=”php”]
class myTextPayload
{
public function getText()
{
return $this->text;
}
public function setText($text)
{
$this->text = $text;
}
}
[/code]

あとはフィルタクラスを実装して配置。autoloadさせるので置いたら”symfony cc”を呼ぶこと

lib/filter/akkyHidePhoneNumberFilter.class.php

[code lang=”php”]
/**
* hide Japan’s phone number from text
*
*/
class akkyHidePhoneNumberFilter extends sfFilter
{
// not a perfect solution
// see http://blog.livedoor.jp/nipotan/archives/17526053.html
const PATTERN = ‘/(?:0\d{1,4}[-.]?)?\d{1,4}[-.]?\d{4}/’;
/**
* Make phone number unreadable.
*
* @param string $text
* @return string
*/
public function execute($chain, $payload)
{
$replacementWord
= $this->getParameter(‘replacement_word’, ‘xxx-xxxx-xxxx’);

// Retrieve text from payload
$text = $payload->getText();

$censoredText = preg_replace(self::PATTERN, $replacementWord, $text);

// Replace payload text
$payload->setText($censoredText);

// Execute next filter in chain
$chain->execute($payload);
}
}
[/code]

あとは、実際に書き込みの発生するところで、手動(アクション側)または自動(モデル側)でこのfilterを呼び出すことで、まずい単語にマスクをかけるフィルタなどを、フィールド毎に適用させることができます。

[code lang=”php”]
class messageActions extends sfActions
{
public function executePost()
{
$payloadComment = new myTextPayload();
$payloadComment->setText($this->getRequestParameter(‘comment’));
// Filter payload
$chain = new pfcPayloadFilterChain();
$chain->loadProfile(‘post_comment’);
$chain->setPayload($payloadComment);
$chain->execute();
$this->comment = $payloadComment->getText();

(このあとpropelオブジェクトにセットして保存とか)
[/code]

で、入力フィールドのこういうのが

秋元(030-5555-5555)死ね

こうなる

秋元(***-****-****)王大人に死亡確認されればいいのに

アクションごとに適用できるフィルタをきめ細かく変更できるところと、適用するfilterをyamlで調整したり、可変のパラメータを設定できたりするところが利点なんでしょうか。もうちょっと使ってみようかと思っています。