
私が運営しているWordPressサイトで、承認済みユーザーのコメントでも自動承認されず、毎回承認待ちになってしまう問題が発生していました。
メールアドレス欄を非表示にしていることが原因かと思いましたが、テストでインストールした直後のWordPressで名前・メールアドレスを入力しても自動承認されず。
そこで、WordPressのコメント自動承認プロセスを棄て、承認済みコメントと名前・IPアドレス一致で自動承認にして解決したのでやり方を解説します。
トラブルの状況
- 承認済みユーザーのコメントでも自動承認されない
- ログインユーザーのコメントは自動承認される
- 「設定」-「ディスカッション」の「コメントの手動承認を必須にする」はオフ
「すでに承認されたコメントの投稿者のコメントを許可し、それ以外のコメントを承認待ちにする」はオン - メールアドレス欄非表示はもちろん、同じ名前・メールアドレスを入力しても自動承認されない
- インストール直後のWordPressでも状況変わらず
- WordPressのバージョンは6.8.2
自動承認パターン別コード
自動承認のパターン別に2つのコードを紹介します。
希望するどちらか一つのコードを、使用しているテーマの functions.php
に貼り付けて下さい。
おすすめは「承認済コメントと名前・IPアドレスが一致したら自動承認」です。
スパム以外のコメントはすべて自動承認
スパム判定されたコメント以外は、すべて自動承認します。
Akismet等がスパム判定したメールも承認待ちになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function auto_approve_all_nonspam( $approved, $commentdata ) { // 管理者・投稿者は無条件承認 if ( current_user_can('edit_posts') ) { return '1'; } // 標準スパム判定(Akismet等が有効ならそちらも判定) if ( wp_is_comment_spam( $commentdata ) ) { return '0'; // スパムなら承認待ち } // スパム以外は自動承認 return '1'; } add_filter( 'pre_comment_approved', 'auto_approve_all_nonspam', 99, 2 ); |
承認済コメントと名前・IPアドレスが一致したら自動承認
承認済みのコメントと「名前とIPアドレス」が一致したら、そのコメントを自動的に承認します。
名前が未入力(匿名コメント)の場合でも、過去に匿名で同じIPから投稿された承認済みコメントがあれば自動承認されます。
メールアドレス欄を非表示にしていても問題なく動作します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
function auto_approve_name_ip( $approved, $commentdata ) { global $wpdb; // 管理者・投稿者は無条件承認 if ( current_user_can('edit_posts') ) { return '1'; } $comment_author = $commentdata['comment_author']; $comment_ip = $commentdata['comment_author_IP']; if ( empty( $comment_ip ) ) { return $approved; // IPが空なら通常処理 } if ( $comment_author === '' ) { // 匿名コメント(DB上では空白)+IPアドレス一致で承認 $has_approved = $wpdb->get_var( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_author = '' AND comment_author_IP = %s AND comment_approved = '1' LIMIT 1", $comment_ip )); } else { // 名前とIPアドレスが一致したら承認 $has_approved = $wpdb->get_var( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_author = %s AND comment_author_IP = %s AND comment_approved = '1' LIMIT 1", $comment_author, $comment_ip )); } if ( $has_approved ) { return '1'; // 自動承認 } return $approved; // 通常処理 } add_filter( 'pre_comment_approved', 'auto_approve_name_ip', 9999, 2 ); |
まとめ
今回紹介したコードを使えば、承認済みのユーザーでも毎回承認待ちになる不具合を解消し、本来の承認フローで動作するようになります。
お好みのパターンでコメント運用してみて下さい。