¿Cómo conectar update_post_meta y delete_post_meta?
Todavía estoy tratando de entender todo este tema de conectar hooks a las funciones, así que estoy realmente atascado tratando de realizar la siguiente tarea:
Si se ejecuta update_post_meta
, necesito verificar si el meta_key
es igual a algo específico (quiero activar algún código si se usa una meta_key particular). Si encuentro la meta key que estoy buscando, ejecutar algún código que necesitará conocer el $post->ID
de la meta key que se está actualizando.
También necesito conectarme a delete_post_meta
que hace algo similar pero a la inversa de lo anterior.
¿Alguien puede proporcionarme algún ejemplo de código para conectar hooks a update_post_meta
y delete_post_meta
?

Los hooks update_post_meta
son llamados desde la función más genérica update_metadata()
, por lo que quizás no los hayas encontrado directamente. Los tres hooks son:
update_post_metadata
, un filtro que te permite "interceptar" la actualización de metadatos y hacer algo más. Si enlazas una función que devuelve un booleano, la ejecución se detiene allí y se devuelve el booleano.update_post_meta
, una acción que se llama antes de que los datos se actualicen en la base de datos.updated_post_meta
, una acción que se llama después de que los datos se actualicen en la base de datos.
Si la meta clave aún no existía en la base de datos, update_metadata()
pasa el control a add_metadata()
, que tiene hooks similares: add_post_metadata
, add_post_meta
y added_post_meta
. Esto ocurre antes de que se llame a update[d]_post_meta
. Así que si deseas hacer algo cuando la meta clave se agrega o actualiza, asegúrate de enlazar tanto los hooks update*
como los add*
. Pero ten en cuenta que mientras las acciones updated_*
y added_*
pasan parámetros similares, update_*
y add_*
no lo hacen (add_post_meta
no pasa primero un meta ID).
delete_metadata()
tiene hooks similares: delete_post_metadata
, delete_post_meta
y deleted_post_meta
.
Código de ejemplo:
add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
if ( 'wpse16835_meta_key' == $meta_key ) {
wpse16835_do_something( $post_id, $meta_value );
}
}
add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
if ( 'wpse16835_meta_key' == $meta_key ) {
wpse16835_undo_something( $post_id );
}
}

super gracias por esto. Sabía sobre update_post_meta
usando update_metadata
y allí había hooks para added_post_meta
y updated_post_meta
pero eso era lo más lejos que pude llegar. No entendía cómo usarlos. Pero ahora creo que lo tengo :)

La respuesta de Jan cubre prácticamente todo lo mencionado anteriormente, excepto en el caso donde se elimina un metadato personalizado desde la página de Editar Entrada. Esto sucede de manera asíncrona tan pronto como haces clic en el botón "Eliminar" debajo del metadato, mediante una llamada a wp-admin/admin-ajax.php. Desafortunadamente, esa llamada omite la función delete_metadata()
en meta.php y llama a delete_meta()
en wp-admin/includes/post.php en su lugar (no confundir con wp-includes/post.php).
Sin embargo, hay 2 acciones que aún pueden utilizarse: delete_postmeta
(antes de la eliminación) y deleted_postmeta
(después de la eliminación). Ambas aceptan un único parámetro $mid
, que es el ID del metadato (no la clave). Puedes recuperar el objeto del metadato usando:
$meta = get_post_meta_by_id($mid);
que devuelve un objeto con meta_id, post_id, meta_key y meta_value. Por supuesto, para cuando se llama a deleted_postmeta
, el metadato ya ha sido eliminado, por lo que get_post_meta_by_id()
no funcionará (lo que hace que esa acción sea un poco inútil).
Lo mismo ocurre al actualizar un metadato personalizado desde la página de Editar Entrada. La función update_metadata()
(y sus acciones) en meta.php no se llama, sino que en su lugar se utiliza la función update_meta()
en wp-admin/includes/post.php. Nuevamente, aquí hay dos acciones: update_postmeta
y updated_postmeta
. Los argumentos son $meta_id, $post_id, $meta_key, $meta_value.
