See llms.txt for all machine-readable content.
When a writer submits a WordPress post for review, Gemini checks it and an editor gets it in Slack with one Review button. Publish it, or send it back with a note: the post returns to drafts and the author gets the note by email.
{"post_id": 123} from WordPress the moment a post moves to Pending, so there is no schedule to tune. Header Auth keeps the endpoint private.review_channel, describe your house style in house_style (Gemini reviews against it), and adjust min_words, require_featured_image, require_excerpt, answer_within_hours (default 48) and from_email.X-Webhook-Token with a long random value) and copy the production URL.gemini-3.1-flash-lite, which is enough for a copy check.chat:write scope, connect its bot token on Ask Editor and Post Update, and invite the app to the channel (/invite @your-app), or Slack answers not_in_channel. The Review button opens an n8n form, so no Slack interactivity setup is needed.from_email.{"post_id": 123} to the webhook URL when a post moves to Pending. The free Webhook Actions plugin does it without code: new webhook on wp_after_insert_post, map args.0 to post_id, add the conditions args.1.post_status equals pending, args.3.post_status is not pending and args.1.post_type equals post, and attach the header credential. Or import the ready-made build with exactly this setup. A short PHP snippet that does the same is under Additional info.house_style in Settings, or the issue descriptions in Review Post's schema, for example to check SEO titles or banned words.Who is this for. Blogs where contributors, freelancers or guest authors submit posts for review. WordPress has the Pending status but never tells the editor, so pending posts wait until someone looks.
Why wp_after_insert_post. It fires once the post, its featured image and its categories are all saved. transition_post_status fires earlier, so with the block editor a post submitted together with its featured image would be reported as having none.
WordPress side without a plugin. Put this in functions.php or a custom plugin, and replace the URL and the token with yours (the token must match the Header Auth credential in n8n):
add_action( 'wp_after_insert_post', function ( $post_id, $post, $update, $post_before ) {
// Only the moment a post is submitted for review, not each save while it waits.
$before = $post_before ? get_post_status( $post_before ) : '';
if ( 'post' !== get_post_type( $post_id ) || 'pending' !== get_post_status( $post_id ) || 'pending' === $before ) {
return;
}
$payload = [];
$payload['post_id'] = $post_id;
$args = [];
$args['headers']['Content-Type'] = 'application/json';
$args['headers']['X-Webhook-Token'] = 'YOUR-TOKEN';
$args['body'] = wp_json_encode( $payload );
$args['blocking'] = false; // do not make the writer wait for n8n
wp_remote_post( 'https://YOUR-N8N/webhook/wordpress-post-review', $args );
}, 10, 4 );