WordPress Front-End Post Submission Without Plugin!

If you want to add a new post without logging into the WordPress dashboard or allow your visitors a way to submit content of their own, you can do this by front end post submission.

In this post I will show you the way to submit a post from the front end. Let’s start…

You need to follow the below essential steps for making a form for user submitted posts

Step 1. Create a form by which a user can submit the post title, content, tags, category, featured image. You can put this code into your theme functions.php or any other file.

 add_shortcode( 'themedomain_frontend_post', 'themedomain_frontend_post' );
    function themedomain_frontend_post() {
        themedomain_post_if_submitted(); ?>
        <form id="new_post" name="new_post" method="post"  enctype="multipart/form-data">

            <p><label for="title"><?php echo esc_html__('Title','theme-domain'); ?></label><br />
                <input type="text" id="title" value="" tabindex="1" size="20" name="title" />

            <?php wp_editor( '', 'content' ); ?>

            <p><?php wp_dropdown_categories( 'show_option_none=Category&tab_index=4&taxonomy=category' ); ?></p>

            <p><label for="post_tags"><?php echo esc_html__('Tags','theme-domain'); ?></label>

            <input type="text" value="" tabindex="5" size="16" name="post_tags" id="post_tags" /></p>

            <input type="file" name="post_image" id="post_image" aria-required="true">

            <p><input type="submit" value="Publish" tabindex="6" id="submit" name="submit" /></p>
    } ?>

Step 2. Capturing the input from the front-end user post submission form. You can also put this code into your theme functions.php or any other file.

function themedomain_post_if_submitted() {
    // Stop running function if form wasn't submitted
    if ( !isset($_POST['title']) ) {

    // Add the content of the form to $post as an array
    $post = array(
        'post_title'    => $_POST['title'],
        'post_content'  => $_POST['content'],
        'post_category' => array($_POST['cat']), 
        'tags_input'    => $_POST['post_tags'],
        'post_status'   => 'draft',   // Could be: publish
        'post_type' 	=> 'post' // Could be: 'page' or your CPT
	$post_id = wp_insert_post($post);
	// For Featured Image
	if( !function_exists('wp_generate_attachment_metadata')){
		require_once(ABSPATH . "wp-admin" . '/includes/image.php');
		require_once(ABSPATH . "wp-admin" . '/includes/file.php');
		require_once(ABSPATH . "wp-admin" . '/includes/media.php');
	if($_FILES) {
		foreach( $_FILES as $file => $array ) {
			if($_FILES[$file]['error'] !== UPLOAD_ERR_OK){
				return "upload error : " . $_FILES[$file]['error'];
			$attach_id = media_handle_upload( $file, $post_id );
	if($attach_id > 0) {
		update_post_meta( $post_id,'_thumbnail_id', $attach_id );

    echo 'Saved your post successfully! :)';
} ?>

Step 3. Paste the form shortcode where you want to display the form

<?php echo do_shortcode('[themedomain_frontend_post]'); ?>

That’s it. 

I think the post will be helpful for you and save your time.

Happy Coding. Thanks!


  1. I use the code and face some strange error in my theme (using wordpress default theme 2022) … I add step 1 & 2 in my function.php file (end of it) and call shortcode in gutenberg block editor.
    and the form starts after head tag element after inspecting it … can you advice me about it … hope you check here regurarly and have chance to fix my problem with it 🙂

  2. Thank you so much for this. The only thing is that the second set of code didn’t run at first. Then I put this under it: add_action(‘after_setup_theme’, ‘themedomain_post_if_submitted’);
    And now it works!!! 🙂

  3. I tried add those code from step 1 and 2 into my theme functions.php file. It produced error and unable to save the file. I am using Divi theme for my website.
    If were to add those code to other file, may I know, what other file you actually meant? Where this other file is located? Please advise.
    Thanks you.

  4. I have tried your tutorial, it can be successfully entered but the post type is a draft. how to be automatically published ?

Leave a Reply

Your email address will not be published. Required fields are marked *