Ejecutar función cuando se publica una entrada
Estoy intentando usar esta función que he creado cuando una entrada se publica por primera vez.
function a_new_post($post){
$post_id = $post->ID;
if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
// ...ejecutar código una vez
update_post_meta( $post_id, 'firstpublish', true );
}
}
add_action( 'draft_to_published', 'a_new_post' );
No veo nada mal en el código, pero cuando intento crear algunas entradas de prueba y reviso la base de datos, el campo "firstpublished" no se ha creado.
¿Alguien ve algo mal?

La acción correcta es 'draft_to_publish'
.
Para asegurarte de que estás usando el estado correcto, intenta obtener una lista de todos los estados de publicación registrados (incluyendo estados personalizados) con:
<pre><?php print '- ' . implode( "\n- ", array_keys( get_post_stati() ) );?></pre>
En una instalación estándar deberías obtener:
- publish
- future
- draft
- pending
- private
- trash
- auto-draft
- inherit
Ten en cuenta que publish_post
se llama cada vez que editas una publicación publicada.
También nota que get_post_stati()
es uno de esos nombres impredecibles en WordPress: es simplemente incorrecto. El plural del sustantivo status es statuses en inglés y statūs en latín. :D
También podrías engancharte a 'transition_post_status'
, dependiendo de tus necesidades. Recibes el nuevo y el antiguo estado como argumentos, el tercer argumento es el objeto de la publicación. Capturará future_to_publish
también, y también publicaciones que fueron eliminadas una vez y republicadas ahora (trash_to_publish
).
Ejemplo:
add_action( 'transition_post_status', 'a_new_post', 10, 3 );
function a_new_post( $new_status, $old_status, $post )
{
if ( 'publish' !== $new_status or 'publish' === $old_status )
return;
if ( 'post' !== $post->post_type )
return; // restringe el filtro a un tipo de publicación específico
// haz algo increíble
}

Establecer el valor meta del tiempo del primer guardado es muy fácil de aplicar la primera vez.
function a_new_post( $post_id, $post, $update ) {
if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
update_post_meta( $post_id, 'firstpublish', true );
}
}
add_action( 'save_post', 'a_new_post', 10, 3 );
