¿Cómo enlazar update_post_meta y delete_post_meta?

23

Todavía estoy luchando para que mi cabeza se entere de todo engancharme a las cosas, así que estoy realmente estancada en tratar de hacer la siguiente tarea:

Si se ejecuta update_post_meta, verifique si la meta_key es igual a algo (quiero activar algún código si se usa una meta_key en particular). Si estoy buscando la clave de metadatos, ejecute algún código que necesite conocer el $post->ID de la clave de metadatos que se está actualizando.

También necesito enlazar a la delete_post_meta que hace lo contrario al anterior.

¿Puede alguien proporcionarme algún código de ejemplo para enlazar a update_post_meta y delete_post_meta?

    
pregunta Brady 10.05.2011 - 14:01

2 respuestas

41

Los ganchos update_post_meta se llaman desde el más genérico update_metadata() , por lo que es posible que no la hayas encontrado directamente. Los tres ganchos son:

  • update_post_metadata , un filtro que te 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 < em> before los datos se actualizan en la base de datos.
  • updated_post_meta , una acción que se llama < em> after los datos se actualizan en la base de datos.

Si la meta clave no existía todavía en la base de datos, update_metadata() pasa el control a add_metadata() , que tiene los ganchos similares add_post_metadata , add_post_meta y added_post_meta . Esto sucede antes de que se llame a update[d]_post_meta . Por lo tanto, si desea hacer algo cuando se agrega la clave de metadatos o , asegúrese de enlazar tanto el update* como el add* ganchos, pero tenga en cuenta que mientras el updated_* y el% Las acciones de added_* pasan parámetros similares, update_* y add_* no ( add_post_meta no pasa primero un ID de meta).

delete_metadata() tiene ganchos similares: delete_post_metadata , delete_post_meta y 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 );
    }
}
    
respondido por el Jan Fabry 10.05.2011 - 14:25
8

La respuesta de enero cubre prácticamente 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, las llamadas omiten la función delete_metadata() en meta.php y las llamadas delete_meta() en wp-admin / includes / post.php (no debe confundirse con wp-includes / post.php).

Hay 2 acciones que aún se pueden usar, delete_postmeta (antes de la eliminación) y deleted_postmeta (después de la eliminación). Ambos aceptan un solo parámetro $mid , que es el ID de los metadatos ( no la clave). Puede recuperar el objeto de metadatos utilizando:

$meta = get_post_meta_by_id($mid);  

que devuelve un objeto con meta_id, post_id, meta_key abd meta_value. Por supuesto, para cuando deleted_postmeta se llama, los metadatos se han eliminado, por lo que get_post_meta_by_id() no funcionará (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 función update_metadata() (y sus acciones) en meta.php se no , pero la función update_meta() en wp-admin / includes / post.php es en su lugar. Dos acciones de nuevo aquí, update_postmeta y updated_postmeta . Los argumentos son $ meta_id, $ post_id, $ meta_key, $ meta_value.

    
respondido por el sebastien.b 21.08.2011 - 01:59

Lea otras preguntas en las etiquetas