WordPressの編集フローに校正を組み込む:書いている場所でルールを出し、公開前で止める

日本語校正のプラグインを開発していて、最初に決めたのは検出精度の話ではありませんでした。ルールを一つにしない、という設計方針です。

理由は単純で、メディアの現場では「新人ライターとベテランに同じ強さの指摘を出す」ことが役に立たないからです。ベテランに一文80文字の警告を出し続けても無視されるだけだし、新人に重大な指摘だけ見せても育たない。サイトに1つのルールを持つ設計だと、この差を表現できません。

この記事では、WordPressの編集フローに校正を組み込むときに何をどこへ置くのか、そしてこの製品(日本語校正マネージャー)がそれをどう実装しているかを一通り書きます。

目次

置き場所に求められる三つの条件

校正の置き場所に求められる3条件(書いている画面・相手に合わせる・公開の直前)を示した図

校正を仕組みにするなら、置き場所に求められる条件は三つ。

  1. 書いている画面の中にある — ライターが別タブを開かない、思い出さない、コピペしない
  2. 相手によって強さが変わる — 人・カテゴリ・投稿タイプで、出す指摘のレベルを変えられる
  3. 重大なものは本当に止まる — 警告を出すだけでなく、公開そのものを止められる

3つ目が抜けている仕組みは、結局「見なくてもいい警告」になります。逆に3つ目だけ強すぎると、導入初日に全記事が公開できなくなって、その週のうちに外される。

書いている画面に出す

ブロックエディタの校正サイドバーに、重要度別の件数と指摘一覧、修正ボタンが並んでいる画面
校正エンジンが検出する8種類のチェックを4つのグループに整理した図

WordPressの場合、置き場所はブロックエディタ(Gutenberg)のサイドバーになります。

編集中に校正を実行すると、指摘が一覧で出ます。重要度別の件数、該当箇所へのジャンプ、修正候補。自動チェックをオンにしておけば、入力が止まってから1.5〜3秒ほどのデバウンスを挟んで走ります。毎打鍵でチェックすると重いので、間隔を空けて差分を見る作りです。

検出しているのは8種類。

種別何を見るか
表記ゆれ辞書に登録した表記(WordpressWordPressお問合せお問い合わせ
禁止語・注意語使ってはいけない語、注意が要る語。理由を添えて出せる
冗長表現「することができます」「まず最初に」など
全角・半角100%、全角スペース、括弧内の余白
句読点句点の抜け、読点の数、、。,. の混在
文体です・ます調とだ・である調の混在、同じ語尾の連続
長文1文の文字数、1文内の読点の数、同じ接続詞の連続
SEO項目タイトル・スラッグ・抜粋、およびSEOプラグインのSEOタイトル・メタディスクリプション

修正候補があるものは、ボタン一つで置き換えられます。ここで一つ制約を書いておくと、ワンクリック修正が効くのは本文(RichText)だけです。カスタムHTMLブロックや対応外のブロックは指摘だけ。タイトルやメタディスクリプションへの指摘も、場所を示すところまでで、ボタンは出ません。

本文の生HTMLを文字列置換すればタイトル以外は全部直せるのですが、それをやるとブロック構造が壊れます。壊れ方が編集者から見えないのが最悪で、後から気づいたときには履歴も追えない。だから置換の対象をテキストノードに限りました。直せる範囲は狭くなりましたが、原稿が壊れるより良いという判断です。

相手によって強さを変える

ここがこの製品の中心です。

ルールは1枚の設定ではなく、7つのレイヤーの合成結果として決まります。弱い順に、サイト共通・ユーザー権限・投稿タイプ・タグ・カテゴリ・ライター・投稿単位。

上のレイヤーは、下の結果を丸ごと置き換えるのではなく、そのレイヤーが言及したルールの設定だけを上書きします。上書きできるのは3つ。有効か無効か、重要度、そしてルール固有のパラメータ(一文の上限文字数など)。

たとえばこう組めます。

  • サイト共通:標準の文体ルール一式(すべてWarning)
  • カテゴリ「ニュース」:文体の混在をErrorに上げる
  • ライター「新人Aさん」:一文の上限を80文字から60文字に下げる
  • ライター「ベテランBさん」:長文と冗長表現を無効にする

Aさんがニュースカテゴリの記事を書くと、この3つが順に重なった状態が適用されます。どのルールがどのレイヤー由来で効いているかは、割り当て画面のプレビューで確認できます。合成の結果を人が説明できないと運用に乗らないので、この画面は最初から仕様に入れました。

例外として、強制ルールという属性があります。これはレイヤーではなくルール側の設定で、合成の最後に適用されて、どのレイヤーからも無効化できません。会社名の正式表記、法務上使えない表現、PR表記の注記といった「ライターの裁量で外させたくないもの」に使います。

ルール別の設計の詳しいところはレイヤー合成の記事で書きました。

公開前で止める

止める条件は一本化してあります。そのプロファイルで公開ブロックが有効で、かつError指摘が1件以上残っているとき。それ以外では止まりません。Warning がいくつ残っていても公開できます。

止めるのはサーバ側です。ブロックエディタの警告表示はあくまで事前のお知らせで、強制はREST経由の保存時に行います。REST以外の経路(プログラムからの投稿など)でも wp_insert_post_data の側で検証して、下書きへ差し戻します。UIのガードだけにすると、経路を変えれば抜けられてしまうので。

抜け道は用意してあります。jpl_force_publish という権限を持っていれば、Errorが残っていても公開できる。既定では管理者と編集者に付いています。ただしバイパスした事実と、誰がやったかはログに残ります。急ぎで出したこと自体は責めなくていい。ただ、記録が残らないと運用が崩れます。

導入直後の話も書いておきます。同梱の既定プロファイル「標準メディア文体」は、すべてWarningで、公開ブロックなしです。有効化した瞬間に記事が公開できなくなる、ということは起きません。まず指摘を眺めて、止めるべきルールが決まってからErrorに上げる。この順番でないと、初日で外されます。

何が起きているかを見る

指摘は記録されます。記録するのは手動チェック・保存時・公開前チェックのときだけで、編集中のデバウンス自動チェックは記録しません(記録が指摘の山になって集計が意味を持たなくなるため)。

ダッシュボードで見られるのは、当月の指摘数と重要度別の内訳、ライター別・ルール別・投稿タイプ別・カテゴリ別の件数、よく出る表記ゆれと禁止語、そして公開前ブロックの件数(強制公開でバイパスされた分を含む)。

これが効くのは、ルールを見直すときです。特定のルールばかり大量に出ているなら、それはライターの問題ではなくルール設定が現場と合っていないサインかもしれない。逆に、ある指摘が特定の書き手に集中しているなら、そこは個別に話したほうが早い。

ログは本文の全文を保存しません。残すのは対象テキストの断片(100文字以内)まで。保持期間は既定90日で、日次のcronで自動的に消えます。

できないこと

正直に書いておきます。

  • 文脈を読んで判断しません。 形態素解析を使っておらず、辞書と正規表現と文分割で見ています。意味の分かりにくさ、敬語の過不足、論理の飛躍は検出できません
  • 過去記事の一括スキャンは現行バージョンにありません。 対象は編集中の記事です。既存記事の棚卸しが主目的なら、今はまだ合いません
  • 校正UIはGutenbergだけです。Classic Editorに指摘は出ません(公開前ゲートはサーバ側なので経路を問わず効きます)
  • マルチサイトには対応していません
  • AI最終チェックは任意機能です。WordPress 7.0以上で、サイト側にAIプロバイダを用意した場合だけ表示されます

動作要件はWordPress 6.6以上・PHP 8.1以上・シングルサイト。既定の対象は投稿と固定ページで、カスタム投稿タイプは設定で追加します。

どこから手を付けるか

導入直後の既定設定と、運用が乗ってからの設定を対比した図

導入の順番としては、いきなり全ルールを有効にするより、次のように進めるほうが摩擦が少ないはずです。

  1. 同梱の辞書とルールのまま有効にして、1週間ぶんの指摘を眺める
  2. 自社の表記レギュレーションを辞書に入れる(表記ゆれ辞書の作り方
  3. 絶対に出したくない表現だけをErrorに上げ、そこで初めて公開ブロックをオンにする(薬機法・景表法のNG表現
  4. ライターやカテゴリごとの調整は、指摘の傾向が見えてから

2と3を飛ばして4から始めると、たいてい設定だけ立派で誰も使っていない状態になります。

機能の一覧と動作環境は日本語校正マネージャーの製品ページにまとめてあります。

目次