WordPress.org に初めて出したプラグインが2回差し戻された話|審査で実際に指摘された8項目と直し方

WordPress.org に初めて出したプラグインが2回差し戻された話|審査で実際に指摘された8項目と直し方 WordPress
この記事は約9分で読めます。

WordPress.org にプラグインを出して、最初に止まるのは、コードの中身ではありませんでした。止まるのは、名前、プレフィックス、同梱物です。私は1本目で2回差し戻され、3バージョン直して、提出から承認まで約2週間半かかりました。ただ、そのとき指摘された8項目を手元に残しておいたら、2本目は初回で1発通過しました。だから先に、その8項目と直し方を渡します。経緯やコードは、その後ろに置きました。審査に通ったあとの SVN 公開作業は、別記事「WordPress.org の SVN で初めてプラグインを公開した話」にまとめています。

差し戻された8項目と、直し方

2段階の審査で指摘されたのは、この8つです。上から、後戻りしにくい名前まわりと、見落としやすく重い exec() を優先して対処しました。

指摘 直し方
プラグイン名が一般的すぎる ハンドルネームを頭に付けてユニークに(例: Rapls PDF Image Creator)
所有権の確認(メールと Author URI のドメイン不一致) 単独の開発者で両方とも自分のもの、と返信で説明。最初から1ドメインに統一すると楽
プレフィックスが短い(pic_ の3文字) 4文字以上・ユニーク・アンダースコア区切りに(例: rapls_pic_)
deprecated 関数 imagedestroy() PHP 8.0 以降は不要なので削除
ZIP にバナー・アイコンを同梱 ZIP から除外。承認後に SVN リポジトリ直下の assets/ に置く
exec() / shell_exec() の使用(手動レビューで最重要) 外部コマンド実行をやめる。私は Ghostscript を削除し Imagick 単体に絞った
エラー応答にファイルパスを含む パスを応答から除去
load_plugin_textdomain() の明示呼び出し WordPress 4.6 以降は自動読み込みなので削除

差し戻しで指摘された8項目の内訳サマリー

長い英文メールに見えても、分解すればこの8項目に収まります。

提出前に、自分で潰せるもの

8項目のうち、提出前に自分でゼロにできるものがあります。先に潰しておくと、最初の差し戻しの量がかなり減ります。

まず Plugin Check を最低1回は回します。私の最初の実行では ERROR が15件ほど出ました。エスケープ・サニタイズ・出力エスケープが中心で、30分ほどでゼロにできます。ここを詰めたおかげで、エスケープ系は審査中に一度も指摘されませんでした。名前は、提出前に別の人の目で見てもらうか、WordPress.org の検索で類似名を調べて、ハンドルネームを頭に付けます。自分では機能を表す良い名前のつもりでも、客観的には一般名詞そのもの、ということが起きます。プレフィックスは1文字目から4文字以上で書きます。私は pic_ という3文字で始めてしまい、コードの隅から隅まで grep して置換する手戻りになりました。バナーとアイコンは ZIP に入れず、承認後に SVN の assets/ に置きます。

ただし、提出前のチェックだけでは潰せないものもあります。注意したいのが exec() です。Plugin Check では、これは ERROR ではなく WARNING 止まりでした。WARNING は目立たないので見落としがちですが、私の場合はこれが手動レビューで一番大きな差し戻し理由になりました。提出前は、WARNING 欄の外部コマンド実行を、ERROR と同じ重さで見てください。

exec() の指摘は、設計の作り直しになった

8項目のうち、コードを1行直して済まないのが exec() でした。手動レビューで指摘され、対処に一番時間がかかったので、ここだけ詳しく書きます。指摘は、私のプラグインの Ghostscript エンジンの3行に対してでした。

Using exec()/shell_exec() in PHP is considered dangerous. exec commands send code to the server, and can be used for remote code execution actions. In addition, many hosts block the use.

困りました。Ghostscript は PDF を画像に変換するコマンドラインツールで、PHP から呼ぶには通常 exec() を使います。Ghostscript を使うけれど exec() は使わない、という方法は基本的にありません。proc_open() も同じ系統なので回避になりません。関数を一段ラップしても、レビューチームが見ているのはユーザーのサーバーで何が起きるかなので、本質は変わりません。多くの共有レンタルサーバーでは exec() がそもそも無効化されている、という現実もあります。結局、Ghostscript エンジンを丸ごと削除して、Imagick だけで処理する形に絞りました。ページ指定や解像度調整まで書いてあったので git rm した瞬間は少し寂しかったですが、切り替えは丸1日で動くものになりました。

Ghostscript+Imagickの2エンジン構成からImagick単体へ絞り込んだ構成図

2エンジン構成から Imagick 単体へ。審査のための削除でしたが、共有サーバーで動く範囲に絞れたという意味では、結果的に良かったです。

提出前のチェックだけでは通らない理由

1本目で2回差し戻されたのは、WordPress.org の審査が2段階だからです。最初の差し戻しは、AI を含む自動チェックによる事前判定で、プラグイン名、所有権、プレフィックス、deprecated 関数、ZIP 同梱物といった、機械的に拾える項目を見ます。これを通過しないと、人間のレビュアーまで進みません。自動チェックを通過すると、次にボランティアの人間が手動でレビューし、自動チェックでは拾えないコードの中身まで踏み込みます。私の exec() は、この段階で出ました。だから最初のメールの指摘を全部直しても、それで承認とは限りません。Plugin Check の ERROR をゼロにして出しても、手動レビューで止まることがあるのは、この構造のためです。

Plugin CheckのERRORとWARNINGの違いを示した図

exec() は WARNING 側にいました。目立たないぶん、ここを軽く見ると手動レビューで刺さります。

提出から承認までの、期間と手数

提出してから最初の応答まで、10日間ありました。レビューチームは週に約1,000件をボランティアで処理しているので、1〜2週間連絡がないのは普通です。催促は逆効果なので、待つしかありません。最初の応答で名前・所有権・プレフィックス・deprecated・ZIP 同梱の指摘が来て、直して再提出した翌日、手動レビューで exec() が来ました。Ghostscript を削除して再提出し、最後に load_plugin_textdomain() の明示呼び出しを自分で見つけて削除し、もう一度提出。承認はその数日後でした。差し戻しから承認までの実作業は、合計15時間ほどです。

再提出の連絡は、長文の説明より、何をどう直したかを箇条書きで簡潔に書くほうが歓迎されます。担当者は週に何百件も見ているからです。私はこの粒度で書きました。

次の自分に渡すメモ

この経験のあと、2本目の Thanks Mail for Stripe は、最初から名前をユニークにし、プレフィックスを tmfs_(4文字以上)にし、外部コマンド実行を使わず、Plugin Check の ERROR と WARNING を両方ゼロにし、assets を分離して出しました。結果、初回審査で1発通過。1本目で1週間かかった工程が、ほぼ即日で済みました。早見表の8項目が、2本目では全部チェック済みの前提になっていた、ということです。

WordPress.org の差し戻しは、コーディングが下手だという話ではありません。世界中のサイトに配布されるコードとしての作法を教えてくれているだけで、個人サイトで動かすコードとは要求水準が違います。1本目で詰まっても、指摘を早見表のように残しておけば、2本目はずっと楽になります。次に出すときは、この8項目のうち、いくつを提出前に潰しておくか、から始めるのが良さそうです。

参考にしたページ

関連記事

WordPress
この記事を書いた人
rapls

WordPressのプラグインを作っているフリーランスエンジニアです。Web開発はもう6年以上。WordPress.orgで Rapls AI Chatbot、Thanks Mail for Stripe、Rapls PDF Image Creator の3本を公開し、保守を続けながら、日本語ロケールの翻訳エディター(PTE)も務めています。このブログに書くのは、現場で自分が実際にハマって、調べて、直した話です。

raplsをフォローする
raplsをフォローする

コメント

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