WordPress Create a Post Programmatically

Help us to keep this website almost Ad Free! It takes only 10 seconds of your time:
> Step 1: Go view our video on YouTube: EF Core Bulk Insert
> Step 2: And Like the video. BONUS: You can also share it!

Syntax

  • wp_insert_post(array $args, bool $wp_error);

Parameters

ParameterDescription
$args (Array Required)A Key Value Array of the below elements.
$wp_error (Boolean Optional)Return a WP_Error in case of failure.

Remarks


Arguments

The next table shows you a list of elements that you can use inside of the first parameter (Array).

ParameterDescription
ID(Int) The post ID. If equal to something other than 0, the post with that ID will be updated. Default 0.
post_author(Int) The ID of the user who added the post. Default is the current user ID.
post_date(String) The date of the post. Default is the current time.
post_date_gmt(String) The date of the post in the GMT timezone. Default is the value of $post_date.
post_content(Mixed) The post content. Default empty.
post_content_filtered(String) The filtered post content. Default empty.
post_title(String) The post title. Default empty.
post_category(Array) Array of post category values.
post_excerpt (String) The post excerpt. Default empty.
post_status(String) The post status. Default draft.
post_type(String) The post type. Default post.
comment_status(String) Whether the post can accept comments. Accepts open or closed. Default is the value of default_comment_status option.
ping_status(String) Whether the post can accept pings. Accepts open or closed. Default is the value of default_ping_status option.
post_password(String) The password to access the post. Default empty.
post_name(String) The post name or slug. Default is the sanitized post title when creating a new post.
to_ping(String) Space or carriage return-separated list of URLs to ping. Default empty.
pinged(String) Space or carriage return-separated list of URLs that have been pinged. Default empty.
post_modified(String) The date when the post was last modified. Default is the current time.
post_modified_gmt(String) The date when the post was last modified in the GMT timezone. Default is the current time.
post_parent(Int) Set this for the post it belongs to, if any. Default 0.
menu_order(Int) The order the post should be displayed in. Default 0.
post_mime_type(String) The mime type of the post. Default empty.
guid(String) Global Unique ID for referencing the post. Default empty.
tax_input(Array) Array of taxonomy terms keyed by their taxonomy name. Default empty.
meta_input(Array) Array of post meta values keyed by their post meta key. Default empty.

Avoid Duplicated Posts

When you execute this function, you could probably get a duplicated post, at least that happened to me. (You can check it into the Post WordPress Section)

I found a solution:

if( !get_page_by_title( $title, 'OBJECT', 'post' ) ){
    $my_post = array('post_title' => $title,
        'post_content' => 'Content',
        'tags_input' => $tags,
        'post_category' => array(2),
        'post_status' => 'publish'
    );

    $result = wp_insert_post( $my_post );
}

Explanation

Before you save a new post, validate if the new post already exists using the post title as a parameter, if there's not a post title, you can save your new post.

Check get_page_by_title's documentation here.



Got any WordPress Question?