Como ligar update_post_meta e delete_post_meta?

23

Ainda estou lutando para entender tudo isso, então estou realmente empenhado em fazer a seguinte tarefa:

Se update_post_meta for disparado, verifique se meta_key é igual a alguma coisa (quero disparar algum código se uma meta_key específica for usada). Se a meta-chave que estou procurando, execute um código que precisará saber o $post->ID da meta-chave que está sendo atualizada.

Eu preciso ligar ao delete_post_meta também, que faz o inverso como acima.

Alguém pode me fornecer algum código de exemplo para conectar-se a update_post_meta e delete_post_meta?

    
por Brady 10.05.2011 / 14:01
fonte

2 respostas

41

Os ganchos update_post_meta são chamados dos mais genéricos update_metadata() , então você pode não ter encontrado diretamente. Os três ganchos são:

  • update_post_metadata , um filtro que permite a você "seqüestrar" a atualização de metadados e fazer outra coisa. Se você ligar uma função que retorna um booleano, a execução pára e o booleano é retornado.
  • update_post_meta , uma ação que é chamada < em> antes os dados são atualizados no banco de dados.
  • updated_post_meta , uma ação que é chamada < em> após os dados são atualizados no banco de dados.

Se a meta-chave ainda não existia no banco de dados, update_metadata() passa o controle para add_metadata() , que possui os ganchos semelhantes add_post_metadata , add_post_meta e added_post_meta . Isso acontece antes de update[d]_post_meta ser chamado. Portanto, se você quiser fazer algo quando a meta key for adicionada ou , certifique-se de conectar os ganchos update* e add* , mas observe que, enquanto updated_* e% as açõesadded_* transmitem parâmetros semelhantes, update_* e add_* não ( add_post_meta não passa uma meta ID primeiro).

delete_metadata() tem ganchos semelhantes: delete_post_metadata , delete_post_meta e deleted_post_meta .

Exemplo de código:

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 );
    }
}
    
por Jan Fabry 10.05.2011 / 14:25
fonte
8

A resposta do Jan abrange basicamente o que está acima, exceto no caso em que um metadado personalizado é excluído da página Editar postagem. Isso acontece de forma assíncrona, assim que você clica no botão "Excluir" sob os metadados, através de uma chamada para wp-admin / admin-ajax.php. Infelizmente, essas chamadas ignoram a função delete_metadata() em meta.php e chamam delete_meta() em wp-admin / includes / post.php (não deve ser confundido com wp-includes / post.php).

Existem duas ações que ainda podem ser usadas, delete_postmeta (antes da exclusão) e deleted_postmeta (após a exclusão). Ambos aceitam um único parâmetro $mid , que é o ID dos metadados ( não a chave). Você pode recuperar o objeto de metadados usando:

$meta = get_post_meta_by_id($mid);  

que retorna um objeto com meta_id, post_id, meta_key e meta_value. É claro, no momento em que deleted_postmeta é chamado, os metadados foram excluídos, então get_post_meta_by_id() não funcionará (o que meio que torna essa ação inútil)

O mesmo vale para atualizar um metadado personalizado da página Editar postagem. A função update_metadata() (e suas ações) em meta.php é não chamada, mas a função update_meta() em wp-admin / includes / post.php é. Duas ações novamente aqui, update_postmeta e updated_postmeta . Os argumentos são $ meta_id, $ post_id, $ meta_key, $ meta_value.

    
por sebastien.b 21.08.2011 / 01:59
fonte