¿Cómo conectar update_post_meta y delete_post_meta?

10 may 2011, 15:01:32
Vistas: 42.5K
Votos: 34

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?

0
Todas las respuestas a la pregunta 2
3
56

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 );
    }
}
10 may 2011 15:25:31
Comentarios

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 :)

Scott Scott
10 may 2011 15:34:55

Más específicamente, el hook es updated_{$post_type}_meta

Benjamin Intal Benjamin Intal
8 ago 2015 06:46:20

¿Es posible engancharse al lugar donde se actualizan los meta datos de las publicaciones a través de la API REST? Quiero hacer que se cree una revisión de la publicación cuando solo se actualizan los meta datos a través de la API REST.

Amjad Amjad
13 feb 2020 20:52:37
0

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.

21 ago 2011 02:59:20