【WordPress】投稿ステータスを「レビュー待ち」に強制変更する方法

【WordPress】投稿ステータスを「レビュー待ち」に強制変更する方法 WordPress

WordPressで複数人が投稿を行うサイトでは、誤って「公開」されてしまうことを防ぐために、投稿ステータスを「レビュー待ち(pending)」に強制変更したい場面があります。

この記事では、寄稿者や編集者が投稿を保存・更新したときでも、自動的に「レビュー待ち」に変更されるようにする方法を紹介します。管理者による確認を必須としたい場合に有効です。

スポンサーリンク

functions.php に処理を追加する

使用中のテーマまたは子テーマの functions.php に、以下のコードを追加してください。

functions.php:非管理者の投稿を強制的にレビュー待ちにする
<?php
function force_pending_status_for_non_admin( $data, $postarr ) {
    // 管理者は除外(manage_optionsで実際の権限を確認する)
    if ( current_user_can( 'manage_options' ) ) {
        return $data;
    }

    // 投稿タイプが "post" のときのみ適用(カスタム投稿にも対応可能)
    if ( $data['post_type'] === 'post' ) {
        // ステータスが公開・下書き・非公開 などでも強制的にレビュー待ちに変更
        $data['post_status'] = 'pending';
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'force_pending_status_for_non_admin', 10, 2 );
?>

このコードでは、管理者以外のユーザーが投稿を保存した場合に、必ずステータスを「pending」に書き換える処理を行っています。編集者や寄稿者がうっかり「公開」してしまう事故を防止できます。

公開済みの記事を編集しただけで非公開に戻ってしまう
このコードは、保存前の投稿ステータスを一切確認せず、対象ユーザーによる保存であれば常にpost_statusをpendingに書き換えます。そのため、既に公開済みの記事を非管理者ユーザーが誤字修正などの軽微な編集をしただけでも、その記事は非公開状態に戻ってしまいます。これは「寄稿者や編集者の投稿は常にレビュー待ちにしたい」という運用であれば意図通りですが、「新規投稿の公開だけを審査対象にしたい(公開済み記事の軽微な編集までは巻き込みたくない)」場合は、下記のように保存前のステータスを確認する分岐を追加してください。

新規投稿のみを対象にする場合

公開済みの記事への軽微な編集までレビュー待ちに戻したくない場合は、保存前のステータスがpublishでないときだけ処理するよう変更します。

functions.php:新規投稿のみを対象にする場合
<?php
function force_pending_status_for_new_posts_only( $data, $postarr ) {
    if ( current_user_can( 'manage_options' ) ) {
        return $data;
    }

    if ( $data['post_type'] !== 'post' ) {
        return $data;
    }

    // 保存前のステータスが既に公開済みの場合は対象外にする
    // (軽微な編集で公開済み記事が非公開に戻るのを防ぐ)
    $existing_status = ! empty( $postarr['ID'] ) ? get_post_status( $postarr['ID'] ) : false;
    if ( $existing_status === 'publish' ) {
        return $data;
    }

    $data['post_status'] = 'pending';
    return $data;
}
add_filter( 'wp_insert_post_data', 'force_pending_status_for_new_posts_only', 10, 2 );
?>

カスタム投稿タイプにも対応させるには

投稿タイプを限定したくない場合は、条件部分を次のように変更できます。

全投稿タイプに適用する場合
// if ( $data['post_type'] === 'post' ) を削除またはコメントアウト

あるいは、対象を複数にしたい場合は以下のように配列でチェックします。

複数の投稿タイプを対象にする場合
$target_post_types = array( 'post', 'custom_post' );
if ( in_array( $data['post_type'], $target_post_types, true ) ) {
    $data['post_status'] = 'pending';
}

注意点

  • この処理は新規投稿・更新の両方に適用されます。
  • 管理者ユーザーには影響しないため、通常どおりの公開・下書き保存が可能です。
  • カスタム投稿タイプのワークフロー管理にも応用できます。

よくある質問(FAQ)

Q記事のステータスを「pending(審査待ち)」に変更するには?
Awp_update_post(array(‘ID’ => $post_id, ‘post_status’ => ‘pending’))で変更できます。Gutenbergエディターのステータスセレクターからも変更できます。
Q投稿者が公開できないよう審査フローを強制するには?
A投稿者(author)ロールにはpublish_postsケイパビリティを持たせず、submitに相当する処理でpost_statusをpendingに設定します。管理者・エディターがpendingの記事を承認して公開します。
Qステータス変更時に通知メールを送る実装は?
Atransition_post_statusフックでpending状態になった場合にwp_mail()で管理者に通知します。pending to publishの遷移では投稿者に公開完了通知を送ります。

まとめ

WordPressサイトを複数人で運用する場合、投稿ステータスを「レビュー待ち」に強制変更することで、誤公開や内容チェック漏れを未然に防ぐことができます。

特に、寄稿者や編集者に一時的な執筆権限を与える場合や、品質管理を徹底したいチーム運用においては、非常に有効なカスタマイズです。ただし、公開済み記事の軽微な編集まで巻き込みたくない場合は、保存前のステータスを確認する分岐を必ず検討しましょう。