
How to allow guest posting on a WordPress blog?
The simplest way to allow guest posting on a WordPress blog is to create a user account with the Contributor role for each guest writer. Contributors can write and submit posts, but they can't publish them, so you review everything before it goes live. If you'd rather not create accounts, you can use a front-end submission plugin that lets guests submit posts through a form, which WordPress saves as pending drafts for your approval.
Guest posts can bring fresh perspectives, new audiences, and a steady flow of content to your blog. But opening your site to outside writers also means thinking about quality, security, and workflow. This article covers the different ways to accept guest posts in WordPress, how to set up each one, how to manage submissions efficiently, and how to protect your site and your SEO along the way.
Why Accept Guest Posts on Your Blog?
Accepting guest contributions can benefit your blog in several ways:
- More content with less effort: Regular guest posts help you publish consistently without writing everything yourself.
- Fresh expertise: Guest authors can cover topics outside your own experience.
- Wider reach: Guest writers often share their posts with their own audiences, bringing new visitors to your site.
- Community building: Featuring readers and peers as authors strengthens relationships in your niche.
- Networking opportunities: Guest posting can lead to collaborations, partnerships, and cross-promotion.
The trade-off is that you need a clear process for reviewing submissions and maintaining quality.
Method 1: Create Contributor Accounts for Guest Writers
This is the most common and secure approach. It uses WordPress's built-in roles, requires no extra plugins, and gives guest authors a familiar writing experience in the block editor.
What Contributors Can and Can't Do
Contributors can:
- Log in to the dashboard.
- Write new posts and edit their own drafts.
- Submit posts for review.
Contributors can't:
- Publish posts.
- Upload images or other files (by default).
- Edit other people's posts or any post after it's published.
- Access settings, plugins, themes, or other users.
This makes the Contributor role a natural fit for guest writers.
How to Add a Guest Writer as a Contributor
- Go to Users > Add New User.
- Enter the guest's username and email address.
- Add their first and last name so their byline displays correctly.
- Keep Send the new user an email about their account checked so they can set their own password.
- Set Role to Contributor.
- Click Add New User.
The guest receives an email with a link to set their password and log in.
How Guest Writers Submit a Post
Once logged in, the guest writer:
- Goes to Posts > Add New Post.
- Writes their article in the block editor.
- Clicks Submit for Review instead of Publish.
The post is saved with a Pending status, and you can find it under Posts > All Posts by clicking the Pending filter.
Letting Contributors Upload Images
By default, Contributors can't upload images, which can be frustrating for guest writers. You have a few options:
- Ask them to send images separately, and add them yourself during review.
- Use a role editor plugin such as User Role Editor or PublishPress Capabilities to give the Contributor role the
upload_filescapability. - Add the capability with code in a small custom plugin:
<?php
/**
* Plugin Name: Sajjad Contributor Uploads
* Description: Allows Contributors to upload media files.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function sajjad_contributor_uploads_on() {
$role = get_role( 'contributor' );
if ( $role ) {
$role->add_cap( 'upload_files' );
}
}
register_activation_hook( __FILE__, 'sajjad_contributor_uploads_on' );
function sajjad_contributor_uploads_off() {
$role = get_role( 'contributor' );
if ( $role ) {
$role->remove_cap( 'upload_files' );
}
}
register_deactivation_hook( __FILE__, 'sajjad_contributor_uploads_off' );
Role changes are saved to the database, which is why this code runs on plugin activation rather than on every page load. Deactivating the plugin removes the capability again.
Note that giving Contributors upload_files also gives them access to the Media Library, where they can browse files uploaded by other users. If that's a concern, some role and media plugins can restrict the library so users only see their own uploads.
Method 2: Use a Front-End Post Submission Plugin
If you don't want to create accounts for every guest, a front-end submission plugin lets anyone submit a post through a form on your site. Submissions are saved as pending posts for you to review in the dashboard.
Well-known options include:
User Submitted Posts: A free plugin that adds a front-end submission form via a shortcode. Guests can submit a title, content, category, tags, and images, and posts are saved as pending by default.
WPForms Post Submissions addon: Available with WPForms paid plans. It lets you build a submission form visually and map fields to the post title, content, excerpt, featured image, categories, and custom fields.
Gravity Forms Advanced Post Creation Add-On: Available with higher Gravity Forms licenses, it creates posts (including custom post types) from form entries with detailed field mapping.
WP User Frontend: Provides front-end post submission, editing, and user dashboards, with more advanced features in its Pro version.
Setting Up a Submission Form
Using User Submitted Posts as an example:
- Install and activate the plugin from Plugins > Add New Plugin.
- Open the plugin's settings under Settings > User Submitted Posts.
- Choose which fields to display, such as name, email, URL, title, tags, category, content, and images.
- Set the post status for new submissions to Pending so nothing publishes without review.
- Assign a default author, often a dedicated "Guest Author" user account.
- Enable spam protection, such as the built-in challenge question or reCAPTCHA.
- Create a "Write for Us" page and add the plugin's shortcode.
- Test the form by submitting a post while logged out.
The process is similar in WPForms or Gravity Forms: create the form, map fields to post data, set the status to pending, and publish the form on a page.
Method 3: Accept Guest Posts by Email or Document
Some blogs keep things simple: guest writers email a Google Doc, Word file, or Markdown file, and the site owner adds it to WordPress. This approach:
- Requires no accounts or plugins.
- Gives you complete control over formatting and images.
- Takes more of your time, since you handle every post manually.
Copying from Google Docs into the block editor usually preserves headings, lists, links, and basic formatting well. You'll still need to upload images and check the final layout.
Method 4: Build a Simple Submission Form With Code
Developers can create a lightweight front-end submission form without a plugin. This example uses a shortcode, a nonce for security, and wp_insert_post() to save submissions as pending posts. Add it to a custom plugin.
<?php
/**
* Plugin Name: Sajjad Guest Post Form
* Description: A simple front-end guest post submission form.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function sajjad_guest_post_form() {
$output = '';
if ( isset( $_GET['sajjad_guest'] ) && 'thanks' === $_GET['sajjad_guest'] ) {
$output .= '<p class="sajjad-guest-success">' . esc_html__( 'Thanks! Your post has been submitted for review.', 'sajjad' ) . '</p>';
}
ob_start();
?>
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
<p>
<label for="sajjad_guest_name"><?php esc_html_e( 'Your name', 'sajjad' ); ?></label>
<input type="text" id="sajjad_guest_name" name="sajjad_guest_name" required>
</p>
<p>
<label for="sajjad_guest_email"><?php esc_html_e( 'Your email', 'sajjad' ); ?></label>
<input type="email" id="sajjad_guest_email" name="sajjad_guest_email" required>
</p>
<p>
<label for="sajjad_guest_title"><?php esc_html_e( 'Post title', 'sajjad' ); ?></label>
<input type="text" id="sajjad_guest_title" name="sajjad_guest_title" required>
</p>
<p>
<label for="sajjad_guest_content"><?php esc_html_e( 'Post content', 'sajjad' ); ?></label>
<textarea id="sajjad_guest_content" name="sajjad_guest_content" rows="12" required></textarea>
</p>
<input type="hidden" name="action" value="sajjad_submit_guest_post">
<?php wp_nonce_field( 'sajjad_submit_guest_post', 'sajjad_guest_nonce' ); ?>
<p><button type="submit"><?php esc_html_e( 'Submit for review', 'sajjad' ); ?></button></p>
</form>
<?php
return $output . ob_get_clean();
}
add_shortcode( 'sajjad_guest_post_form', 'sajjad_guest_post_form' );
function sajjad_handle_guest_post() {
if ( ! isset( $_POST['sajjad_guest_nonce'] ) ||
! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['sajjad_guest_nonce'] ) ), 'sajjad_submit_guest_post' ) ) {
wp_die( esc_html__( 'Security check failed.', 'sajjad' ) );
}
$name = isset( $_POST['sajjad_guest_name'] ) ? sanitize_text_field( wp_unslash( $_POST['sajjad_guest_name'] ) ) : '';
$email = isset( $_POST['sajjad_guest_email'] ) ? sanitize_email( wp_unslash( $_POST['sajjad_guest_email'] ) ) : '';
$title = isset( $_POST['sajjad_guest_title'] ) ? sanitize_text_field( wp_unslash( $_POST['sajjad_guest_title'] ) ) : '';
$content = isset( $_POST['sajjad_guest_content'] ) ? wp_kses_post( wp_unslash( $_POST['sajjad_guest_content'] ) ) : '';
if ( '' === $name || ! is_email( $email ) || '' === $title || '' === $content ) {
wp_die( esc_html__( 'Please fill in all fields with valid information.', 'sajjad' ) );
}
// Assign submissions to a dedicated guest author account, if it exists.
$guest_author = get_user_by( 'login', 'guest-author' );
$post_id = wp_insert_post(
array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'pending',
'post_type' => 'post',
'post_author' => $guest_author ? $guest_author->ID : 0,
),
true
);
if ( is_wp_error( $post_id ) ) {
wp_die( esc_html__( 'Your post could not be saved. Please try again.', 'sajjad' ) );
}
update_post_meta( $post_id, 'sajjad_guest_name', $name );
update_post_meta( $post_id, 'sajjad_guest_email', $email );
// Let the site admin know there's a new submission.
wp_mail(
get_option( 'admin_email' ),
__( 'New guest post submission', 'sajjad' ),
sprintf(
/* translators: 1: post title, 2: author name, 3: edit link */
__( "A new guest post \"%1\$s\" was submitted by %2\$s.\n\nReview it here: %3\$s", 'sajjad' ),
$title,
$name,
admin_url( 'post.php?post=' . $post_id . '&action=edit' )
)
);
$redirect = wp_get_referer() ? wp_get_referer() : home_url( '/' );
wp_safe_redirect( add_query_arg( 'sajjad_guest', 'thanks', $redirect ) );
exit;
}
add_action( 'admin_post_nopriv_sajjad_submit_guest_post', 'sajjad_handle_guest_post' );
add_action( 'admin_post_sajjad_submit_guest_post', 'sajjad_handle_guest_post' );
Create a user with the username guest-author (and the Contributor role) to own these submissions, then add [sajjad_guest_post_form] to a page using a Shortcode block. Because wp_kses_post() filters the content, only safe HTML is saved. For a production site, add a CAPTCHA or honeypot field to reduce spam.
Displaying the Guest Author's Name
When posts come from a shared "Guest Author" account or from a submission form, you'll want to show the real writer's name. Options include:
- Create a proper user account for regular guest writers so their name, bio, and avatar appear automatically.
- Use a co-authors plugin: Plugins like Co-Authors Plus and PublishPress Authors let you create guest author profiles without login accounts and assign them to posts.
- Use a custom field: Store the guest's name in post meta, as in the code example above, and display it in your template.
For block themes, PublishPress Authors provides blocks for author boxes, while Co-Authors Plus integrates with template tags in classic themes.
Setting Up a Review Workflow
Whichever method you use, a clear review process keeps quality high.
- Check pending posts regularly: Go to Posts > All Posts and click Pending.
- Preview each submission: Use the Preview button to see how the post will look.
- Edit for quality and style: Fix grammar, tighten headlines, and make sure the post matches your tone.
- Check facts and links: Verify claims and review every outbound link.
- Add images, categories, and tags: Ensure the post fits your site structure.
- Schedule or publish: Use the scheduling feature to space out guest posts evenly.
If you have several editors, plugins like PublishPress Planner provide an editorial calendar, custom statuses, and editorial comments. Enabling pending post notifications helps too, so you don't miss new submissions.
Creating Guest Posting Guidelines
Clear guidelines save you time and attract better submissions. Publish them on a "Write for Us" page that covers:
- Topics you accept: Be specific about your niche and what you don't cover.
- Length and format: Suggest a typical word count range and structure.
- Originality: Require that posts be original and not published elsewhere.
- Links policy: Explain how many links are allowed and whether self-promotional links are acceptable.
- Images: State whether writers should supply images and what licensing is required.
- Author bio: Tell writers what to include in their bio and whether a headshot is needed.
- Review process: Explain how long reviews take and that you may edit or decline submissions.
- How to submit: Link to your form or explain how to request a Contributor account.
Protecting Your SEO and Reputation
Guest posting is sometimes abused for link schemes, so be careful about outbound links.
- Review every link: Remove links to irrelevant, low-quality, or spammy sites.
- Use the right link attributes: Search engines recommend
rel="sponsored"for paid or sponsored links andrel="ugc"for user-generated content.rel="nofollow"remains an option for links you don't want to endorse. You can set link attributes in the block editor's link settings or via some SEO plugins. - Avoid duplicate content: Check that submissions aren't copied from elsewhere. Online plagiarism checkers make this quick.
- Maintain quality standards: A few thin, promotional guest posts can hurt your credibility with readers.
- Disclose sponsorships: If a guest post is paid, clearly label it as sponsored.
Security Tips for Guest Posting
Every new account and form is a potential entry point, so:
- Never give guest writers more than Contributor or Author access.
- Remove or downgrade accounts when a guest writer is no longer active.
- Protect submission forms with CAPTCHA, Cloudflare Turnstile, or honeypot fields.
- Limit file uploads to images and set size limits if your form accepts them.
- Keep submission plugins updated, since forms that accept public input are a common target.
- Encourage strong passwords and 2FA, especially if guest writers have Author access.
FAQ: Guest Posting on WordPress
Contributor is usually the best choice. Contributors can write and submit posts for review but can't publish, upload files by default, or edit published content.
Yes. Front-end submission plugins like User Submitted Posts, the WPForms Post Submissions addon, or WP User Frontend let visitors submit posts through a form, which are saved as pending drafts for review.
Go to Posts > All Posts and click the Pending filter. Open each submission, preview and edit it, then publish or schedule it when it's ready.
Not by default, because they lack the upload_files capability. You can grant it with a role editor plugin or a small custom plugin, or ask writers to send images separately.
Use a plugin like Co-Authors Plus or PublishPress Authors to create guest author profiles, or store the author's name in a custom field and display it in your template.
Not inherently. High-quality, original guest posts can be valuable. Problems arise when guest posts are low quality or exist mainly for links, so review content carefully and use sponsored or ugc attributes where appropriate.
That's up to you. Many blogs offer exposure and a byline, while others pay a fee for high-quality content. If you pay, set clear expectations about quality, rights, and deadlines.
Conclusion
Allowing guest posting on a WordPress blog is easy once you choose the right approach. Contributor accounts give trusted writers a familiar editor with built-in review, front-end submission plugins let anyone submit posts without an account, and a small custom plugin gives developers a lightweight, fully controlled option.
Whichever method you use, success depends on clear guidelines, a consistent review workflow, and careful attention to quality, links, and security. Set those foundations, and guest posts can become a reliable source of fresh ideas, new readers, and valuable relationships for your blog.


