¿Cuál es la forma correcta de enganchar cuando se actualiza un post?
Intento enganchar cuando se actualiza un post pero todos los hooks que pruebo no se ejecutan excepto updated_post_meta
add_action('updated_post_meta', 'mi_funcion');
function mi_funcion($post_id) {
echo 'Este es mi ID de post: '.$post_id;
}
He probado esto add_action('save_post', 'mi_funcion');
pero no se mostró ningún ID, o quizás este mensaje ya se mostró pero nunca se renderizó porque se envió un encabezado de redirección.

Cuando se actualiza una publicación, se activan algunos hooks:
'pre_post_update'
es una acción que se ejecuta justo antes de que se actualice la publicación, los argumentos que se pasan son 2:$post_ID
y$data
que es un array con todas las demás columnas de la tabla de publicaciones en la base de datos.'transition_post_status'
es un hook que se ejecuta al actualizar y recibe 3 argumentos: $new_post_status,$old_post_status
y$post
(objeto).- Luego, hay otros 2 hooks de transición que se ejecutan, pero tienen nombres dinámicos, lo que significa que la acción efectiva que se ejecuta depende del estado anterior y nuevo de la publicación.
"{$old_status}_to_{$new_status}"
y"{$new_status}_{$post->post_type}"
. El primero recibe solo el objeto de la publicación como argumento, el segundo recibe el ID de la publicación y el objeto de la publicación. Encuentra documentación aquí. 'edit_post'
que recibe 2 argumentos:$post_ID
y$post
(objeto)'post_updated'
que recibe 3 argumentos:$post_ID
,$post_after
(objeto de la publicación después de la actualización),$post_before
(objeto de la publicación antes de la actualización)- Otro hook dinámico:
"save_post_{$post->post_type}"
que depende del tipo de publicación, por ejemplo, para publicaciones estándar es'save_post_post'
y para páginas es'save_post_page'
, este hook recibe 3 argumentos:$post_ID
,$post
(objeto) y$update
que es un booleano (verdadero o falso) que es verdadero cuando se realiza una actualización, de hecho este hook también se ejecuta cuando una publicación se guarda por primera vez. - '
save_post
' que se ejecuta tanto en actualizaciones como en el primer guardado, y recibe los mismos 3 argumentos del hook anterior. - '
save_post_{$post_type}
' que se ejecuta tanto en actualizaciones como en el primer guardado, y recibe los mismos 2 primeros argumentos del hook anterior. - Finalmente tienes '
wp_insert_post
', que se ejecuta tanto en actualizaciones como en el primer guardado, y recibe los mismos 3 argumentos de los 2 hooks anteriores.
Estos hooks se ejecutan cada vez que se actualiza una publicación, tanto a través de las páginas de administración en el backend como cuando se actualiza "manualmente" usando las funciones wp_update_post
o wp_insert_post
.
Cuando la publicación se actualiza usando las páginas de administración, se ejecutan hooks adicionales, un ejemplo es 'update_post_redirect'
o 'post_updated_messages'
. (Ver esta y esta respuestas en WPSE para ejemplos de uso).
Ten en cuenta que si quieres usar algún argumento de los hooks que no sea el primero, debes declararlo explícitamente en la llamada add_action
.
Por ejemplo, si quieres usar el argumento '$update'
(que es el tercero) del hook 'save_post'
, necesitas agregar 3
como parámetro $accepted_args
en add_action
(ver documentación):
// si no agregas 3 como cuarto argumento, esto no funcionará como se espera
add_action( 'save_post', 'my_save_post_function', 10, 3 );
function my_save_post_function( $post_ID, $post, $update ) {
$msg = '¿Es esto una actualización? ';
$msg .= $update ? 'Sí.' : 'No.';
wp_die( $msg );
}
Una última nota sobre el momento: debes asegurarte de que add_action
se llame antes de que se active la acción, o no hará nada.
Por ejemplo, este código:
wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );
no hará nada, porque la acción se agrega después de que se activa el hook. Aquí es fácil de reconocer, en el código del mundo real no siempre es así.

Creo que el hook de acción 'save_post' también se ejecuta al hacer clic en Añadir nuevo (Entrada, Página, CPT) en el panel. Para comprobarlo puedes ejecutar este código. `function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id );
print ' post : '; var_export( $post );
print ' update : '; var_export( $update );
wp_die( 'El hook save_post se ejecuta cuando haces clic en Añadir nuevo..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );` ¿Por qué se ejecuta la acción 'save_post' en Añadir nuevo en lugar de en Publicar? Supongo que es para crear el borrador automático.

@lowtechsun Como se menciona en la respuesta, los hooks se disparan cada vez que una entrada se actualiza, es decir, se guarda en la base de datos. Cuando haces clic en "Añadir nuevo", casi al cargar la página, WP crea un borrador de entrada almacenado en la base de datos, por lo que los hooks se disparan.

Gracias por responder. Acabo de descubrir esto ayer y pensé que el concepto es confuso. Es decir, primero abro la página para añadir una nueva entrada. En esta etapa pensé que no había creado una entrada todavía. Solo cuando hago clic en Publicar pensaría que se crea la nueva entrada. Llevando esto más allá, espero que WP elimine el borrador automático si hago clic en Añadir nuevo pero luego abandono la página sin hacer clic en Publicar.

¿Por qué no engancharte al filtro post_updated_messages
? De esta manera puedes mostrar este mensaje igual que la actualización de entradas predeterminada de WordPress.
add_filter('post_updated_messages', 'tu_mensaje');
function tu_mensaje(){
}
Busca un ejemplo aquí:
http://codex.wordpress.org/Function_Reference/register_post_type
bajo la sección post_updated_messages
