Como conectar update_post_meta e delete_post_meta?

29

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

Se update_post_metafor acionado, verifique se o valor meta_keyé igual a algo (eu quero acionar algum código se uma meta_key específica for usada). Se a meta-chave que estou procurando, execute algum código que precisará saber o que $post->IDestá sendo atualizado.

Eu preciso me conectar ao delete_post_metaque faz o inverso como acima.

Alguém pode me fornecer algum código de exemplo para conectar update_post_metae delete_post_meta?

Brady
fonte

Respostas:

45

Os update_post_metaganchos são chamados a partir da update_metadata()função mais genérica , portanto você pode não encontrá-lo diretamente. Os três ganchos são:

  • update_post_metadata, um filtro que permite "seqüestrar" a atualização de metadados e fazer outra coisa. Se você conectar uma função que retorne um booleano, a execução será interrompida e o booleano será retornado.
  • update_post_meta, uma ação que é chamada antes que os dados sejam atualizados no banco de dados.
  • updated_post_meta, uma ação que é chamada depois que os dados são atualizados no banco de dados.

Se a tecla meta não existe na base de dados, no entanto, update_metadata()passa o controlo para add_metadata(), que tem os ganchos semelhantes add_post_metadata, add_post_metae added_post_meta. Isso acontece antes de update[d]_post_metaser chamado. Então, se você quer fazer algo quando a tecla meta é adicionado ou atualizado, certifique-se de ligar para ambos os update*e os add*ganchos - de notar que, enquanto o updated_*e added_*acções passar parâmetros semelhantes, update_*e add_*não ( add_post_metanão passa um ID meta em primeiro lugar) .

delete_metadata()tem ganchos semelhantes: delete_post_metadata, delete_post_metae deleted_post_meta.

Código de amostra:

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
fonte
super thx para isso. Eu estava ciente sobre o update_post_metauso update_metadatae lá, havia ganchos para added_post_metae, updated_post_metamas isso é tanto quanto eu poderia conseguir. Não entendi como usar. Mas agora eu acho que eu tenho que :)
Brady
3
Mais especificamente, o gancho éupdated_{$post_type}_meta
Benjamin Intal
8

A resposta de Jan aborda praticamente a questão 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" abaixo dos metadados, através de uma chamada para wp-admin / admin-ajax.php. Infelizmente, essas chamadas ignoram a delete_metadata()função no meta.php e chama delete_meta()wp-admin / includes / post.php (não deve ser confundido com wp-includes / post.php).

Existem 2 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. Obviamente, quando deleted_postmetaos metadados são excluídos, eles são excluídos e, portanto get_post_meta_by_id(), não funcionam (o que meio que torna essa ação inútil)

O mesmo vale para a atualização de metadados personalizados na página Editar postagem. A update_metadata()função (e suas ações) no meta.php não é chamada, mas a update_meta()função no wp-admin / includes / post.php. Duas ações novamente aqui, update_postmetae updated_postmeta. Os argumentos são $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
fonte