WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there any hook which is fired only when the post is "published" for the first time.

I dont want to execute my code when the post is "updated" or when its status is set to "not-published" and then "published" again.



function func_tion($post){
    $post_id = $post->ID;   

    if ( !get_post_meta( $post_id, 'mycoderan', $single = true ) )
    // run code to manipulate data
    wp_enqueue_script('plugin_name',plugin_dir_url(__FILE__ ).'script.js');
    $params = array() // set parameters
    wp_localize_script('plugin_name', 'params', $params );
    update_post_meta( $post_id, 'mycoderan', true );
share|improve this question
You have to enclose everything in the if statement inside { ... } braces. w3schools.com/php/php_if_else.asp – soulseekah Apr 1 '12 at 17:01
I need similar functionality, but can't figure out how to check if a post is being published for the first time or not. draft_to_published action seem to be triggered every time a post is published from draft multiple times. Are you relying on post meta to check if a post is published for the 1st time. Is there any native WP function that can be used instead? – dashaluna May 1 '13 at 17:33
@dashaluna Please review the answer to my other question. wordpress.stackexchange.com/questions/46783/… With Wordpress 3.5, there have been a few changes so what you've written is also possible. The flow script should be tremendous help in this. Helped me alot – BAU May 3 '13 at 17:50
up vote 5 down vote accepted

The {$old_status}_to_{$new_status} and {$new_status}_{$post->post_type} hooks tend to generally solve the problem.

To avoid running the code in case post status is changed to draft then published again (after already being published), implement a simple flag using the post_meta functionality.

Note: the updated hook should be 'draft_to_publish' instead of 'draft_to_published' however, the code below is not modified and should be if you plan to use in WP 3.5

add_action( 'draft_to_published', 'wpse47566_do_once_on_publish' );
function wpse47566_do_once_on_publish( $post ) {
    // check post type if necessary
    if ( $post->post_type != 'a_specific_type' ) return;

    $post_id = $post->ID;

    if ( !get_post_meta( $post_id, 'mycoderan', $single = true ) ) {
        // ...run code once
        update_post_meta( $post_id, 'mycoderan', true );
share|improve this answer
my code should run on any category type so i dont think i need this line // check post type if necessary if ( $post->post_type != 'a_specific_type' ) return; i have written my query within this function to get the post data and then i have to run a script by passing the post data as parameters... your function requires the post as an argument... so is the following ok?? – BAU Apr 1 '12 at 15:13
add_action( 'draft_to_published', 'func_tion' ); function func_tion() { /* query code */ if ( !get_post_meta( $post_id, 'mycoderan', $single = true ) ) // ...run code once update_post_meta( $post_id, 'mycoderan', true ); } – BAU Apr 1 '12 at 15:16
the {$status}_to_{$status} action passes on the $post object, so $post_id = $post->ID, fixed my answer. – soulseekah Apr 1 '12 at 15:17
i'm sorry i didnt know comments cannot process new-lines... i have only written the query to get post data inside the function... then i enqueue and localize the script inside the // run code once block... is that ok?? – BAU Apr 1 '12 at 15:18
i have edited the question... please let me know why my script is not executing.. where am i going wrong?? – BAU Apr 1 '12 at 15:39

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.