{$old_status}_to_{$new_status}
e {$new_status}_{$post->post_type}
ganchos geralmente tendem a resolver o problema.
Para evitar a execução do código caso o status da postagem seja alterado para rascunho e publicado novamente (depois de já ter sido publicado), implemente um sinalizador simples usando a funcionalidade post_meta
.
Observação : o gancho atualizado deve ser 'draft_to_publish' em vez de 'draft_to_published', no entanto, o código abaixo não é modificado e deve ser se você planeja usar no 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 );
}
}