¿Cómo enganchar update_post_meta y delete_post_meta?

29

Todavía estoy luchando por entender todo este enganche a las cosas, así que estoy realmente atascado en tratar de hacer la siguiente tarea:

Si update_post_metase dispara, compruebe si meta_keyes igual a algo (quiero activar algún código si se usa una meta_key particular). Si la meta clave que estoy buscando, ejecute algún código que necesite saber $post->IDla meta clave que se está actualizando.

Necesito conectarme delete_post_metatambién al tipo que hace lo contrario que arriba.

¿Alguien puede proporcionarme algún código de ejemplo para conectar update_post_metay delete_post_meta?

Brady
fuente

Respuestas:

45

Los update_post_metaganchos se llaman desde la update_metadata()función más genérica , por lo que es posible que no lo haya encontrado directamente. Los tres ganchos son:

  • update_post_metadata, un filtro que le permite "secuestrar" la actualización de metadatos y hacer otra cosa. Si conecta una función que devuelve un valor booleano, la ejecución se detiene allí y se devuelve el valor 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 actualizan en la base de datos.

Si la tecla meta no existía en la base de datos, sin embargo, update_metadata()pasa el control add_metadata(), que tiene los ganchos similares add_post_metadata, add_post_metay added_post_meta. Esto sucede antes de que lo update[d]_post_metallamen. Por lo tanto, si desea hacer algo cuando se agrega o actualiza la meta clave , asegúrese de engancharse en update*los add*ganchos y en los ganchos, pero tenga en cuenta que mientras las acciones updated_*y added_*pasan parámetros similares, update_*y add_*no lo add_post_metahace ( no pasa primero una meta ID) .

delete_metadata()tiene ganchos similares: delete_post_metadata, delete_post_metay deleted_post_meta.

Código de muestra:

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 );
    }
}
Jan Fabry
fuente
Super gracias por esto. Era consciente del update_post_metauso update_metadatay allí había ganchos added_post_metay updated_post_metaeso era lo más lejos que podía llegar. No entendí cómo usarlo. Pero ahora creo que lo tengo :)
Brady
3
Más específicamente, el gancho esupdated_{$post_type}_meta
Benjamin Intal
8

La respuesta de Jan cubre casi todo lo anterior, excepto en el caso de que se eliminen metadatos personalizados de la página Editar publicación. Esto sucede de forma asíncrona tan pronto como hace clic en el botón "Eliminar" debajo de los metadatos, a través de una llamada a wp-admin / admin-ajax.php. Desafortunadamente, esas llamadas omiten la delete_metadata()función en meta.php y las llamadas delete_meta()en wp-admin / includes / post.php (no deben confundirse con wp-includes / post.php).

Sin embargo, todavía se pueden usar 2 acciones delete_postmeta(antes de la eliminación) y deleted_postmeta(después de la eliminación). Ambos aceptan un único parámetro $mid, que es la ID de los metadatos ( no la clave). Puede recuperar el objeto de metadatos 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 deleted_postmetase llama, los metadatos se han eliminado, por get_post_meta_by_id()lo que no funcionarán (lo que hace que esa acción sea inútil)

Lo mismo ocurre con la actualización de metadatos personalizados desde la página Editar publicación. La update_metadata()función (y sus acciones) en meta.php es no llaman, pero la update_meta()función en wp-admin / includes / post.php es su lugar. Dos acciones nuevamente aquí, update_postmetay updated_postmeta. Los argumentos son $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
fuente