コンテンツにスキップ

OpenAI Moderation API で WordPress のコメントモデレーションを行う方法

メインイメージ

OpenAI の Moderation API を使って WordPress のコメントモデレーションを行う方法をご紹介します。

「コメントモデレーション」というのはコメントの審査のことです。 不特定多数のユーザーがコメントを投稿可能なサイトでは、 SEO スパムや嫌がらせ・性的表現など有害なコメントが投稿されるリスクがあります。 そのため、コメントが投稿されたら即サイトに反映するのではなく、機械的・人的なチェックを事前に行った上でサイトに反映する処理や作業を意味します。

確認時のバージョン

  • WordPress: 6.6.2
  • OpenAI Moderation API: v1

WordPress 本体には以下 2 つのコメントモデレーション機能が備わっています。

  1. N 個以上のリンクを含む → 承認待ち
  2. 特定の単語を含む → 承認待ち or ゴミ箱に移動

WordPress 管理画面: ディスカッション: コメント

フックを使うことでこれらにプラスして独自のモデレーションルールを適用できます。

今回は 2024/09/27 に OpenAI がリリースした Moderation API の新しいモデル omni-moderation-latest を使って追加のモデレーションを実装します。

Upgrading the Moderation API with our new multimodal moderation model | OpenAI

この Moderation API は本稿執筆時点で API ユーザーは(なぜか)無料で利用できます。 rate limit はある程度高い頻度の利用にも耐えられる高さに設定されています。

コメントモデレーションを行う方法

1. プラグインを作成・有効化

プラグインを作成して有効化します。 wp-content/plugins の下に次のファイルを作成します。

ai-comment-moderation/ai-comment-moderation.php:

<?php

/**
 * Plugin Name: AI Comment Moderation
 * Version: 0.1.0
 */

namespace AiCommentModeration;

defined( 'ABSPATH' ) || exit;

ファイルを設置したら管理画面にログインしてプラグインを有効化します。

2. コメント投稿時に Moderation API でチェックする

コメントが投稿されたときに Moderation API を使って有害・無害の判定を行います。 pre_comment_approved というフックがあるので、これを使ってその中で Moderation API にリクエストをかけます。

<?php

/**
 * Plugin Name: AI Comment Moderation
 * Version: 0.1.0
 */

namespace AiCommentModeration;

defined( 'ABSPATH' ) || exit;

const OPTION_API_KEY = 'ai_comment_moderation_openai_api_key';

/**
 * コメントのモデレーション処理を行う
 *
 * @see wp_allow_comment()
 */
add_filter( 'pre_comment_approved', function( $approved, $comment ) {
  // API の無駄遣いを減らすため spam や trash 判定が行われたものは処理しない
  if ( in_array( $approved, [1, 0], true ) ) {
    $api_key = get_option( OPTION_API_KEY, '' );
    $content = implode( PHP_EOL, [
      $comment['comment_content'],
      $comment['comment_author'],
      $comment['comment_author_email'],
      $comment['comment_author_url'],
    ] );

    try {
      $is_flagged = moderate( $api_key, $comment['comment_content'] );
    } catch (\Exception $e) {
      error_log( 'Error: ai_comment_moderation moderate: ' . var_export($response, true) );
      return $approved;
    }

    if ( $is_flagged ) {
      $approved = 'spam';
    }
  }

  return $approved;
}, 10, 2 );

/**
 * OpenAI Moderation API を使って有害判定を行う
 *
 * @return bool: 有害判定をされたら true 、されなかった false
 */
function moderate( string $api_key, string $comment_content ) {
  if ( empty( $api_key ) ) {
    return false;
  }

  $url = 'https://api.openai.com/v1/moderations';
  $args = [
    'headers' => [
      'Content-Type' => 'application/json',
      'Authorization' => 'Bearer ' . $api_key,
    ],
    'body' => json_encode( [
      'model' => 'omni-moderation-latest',
      'input' => $comment_content,
    ] ),
  ];
  $response = wp_remote_post( $url, $args );

  if ( is_wp_error( $response ) ) {
    error_log( 'Error: ai_comment_moderation request: ' . var_export($response, true) );
    return false;
  }

  $body = wp_remote_retrieve_body( $response );
  $data = json_decode( $body, true );

  $result = !empty( $data['results'] ) ? $data['results'][0] : [];
  $flagged = isset( $result['flagged'] ) ? (bool) $result['flagged'] : false;

  return $flagged;
}

moderate() という関数で OpenAI API キーとコメントの本文を使って Moderation API にリクエストをかけています。

その結果を受けて pre_comment_approved のフックコールバック内でモデレーション処理を行います。 変数 $approved が取りうる値は次の 4 つです。

意味
1 承認パス
0 保留(承認待ち)
'spam' スパム
'trash' ゴミ箱行き

実際に動かして試すには API キーのセットが必要です。 wp_options テーブルの ai_comment_moderation_openai_api_key というキーのレコードに OpenAI の API キーをセットしてください。

正式にプラグインにする場合は管理画面があると便利ですが、今回は管理画面は割愛して wp_options テーブルに直接値を保存してください。 例えば WP-CLI を使う場合は次のコマンドでセットできます:

wp option update ai_comment_moderation_openai_api_key 'OpenAI の API キー'

PHP で行う場合はアクティブなテーマの functions.php に一時的に次の行を追加してください:

update_option( 'ai_comment_moderation_openai_api_key', 'OpenAI の API キー', false );

管理画面を作りたい場合は次のページを参考にしてみてください。

なお、ここで使用する OpenAI の API キーは Moderation のエンドポイントに対する書き込み権限を付与されている必要があります。

OpenAI の API キーのパーミッション: Moderation API

ということで、実際に API キーをセットして私の手元で動かしたところ、いい感じに動き有害なコメントをスパム判定できました。 ぜひ参考にしてみてください。

参考

WordPress

OpenAI Moderation API

関連ページ