web-dev-qa-db-ja.com

Update_post_metaとdelete_post_metaをフックする方法

私はまだ頭の中で物事に夢中になっているので、次のタスクをやろうとしています。

Update_post_metaが起動した場合は、meta_keyが何かに等しいかどうかを確認してください(特定のmeta_keyが使用されている場合はコードをトリガーします)。探しているメタキーがあれば、更新されているメタキーの$post->IDを知る必要があるコードを実行します。

私はdelete_post_metaにもフックする必要があります。そのような種類のものは上記のように逆になります。

Update_post_metaとdelete_post_metaにフックするためのコード例を私に提供できる人はいますか?

27
Brady

update_post_metaフックは、より一般的な update_metadata() 関数から呼び出されるため、直接見つけることはできません。 3つのフックは次のとおりです。

  • update_post_metadata 、メタデータの更新を「ハイジャック」して他の操作を実行できるフィルター。ブール値を返す関数を接続すると、そこで実行が停止し、ブール値が返されます。
  • update_post_meta 、データがデータベースで更新される前に呼び出されるアクション。
  • updated_post_meta 、呼び出されたアクションafterデータベースでデータが更新されます。

メタキーがまだデータベースに存在しなかった場合、update_metadata()は制御を add_metadata() に渡します。これには、同様のフックadd_post_metadataadd_post_meta、およびadded_post_metaがあります。これは、update[d]_post_metaが呼び出される前に発生します。したがって、メタキーが追加または更新されたときに何かをしたい場合は、必ずupdate*フックとadd*フックの両方にフックしてください-ただし、 updated_*added_*アクションは同様のパラメーターを渡しますが、update_*add_*は渡しません(add_post_metaは最初にメタIDを渡しません)。

delete_metadata() には同様のフックがあります:delete_post_metadatadelete_post_metadeleted_post_meta

サンプルコード:

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 );
    }
}
44
Jan Fabry

Janの回答は、カスタム投稿がEdit Postページから削除された場合を除いて、上記のほとんどをカバーしています。これは、wp-admin/admin-ajax.phpの呼び出しを介して、メタデータの下にある[削除]ボタンをクリックすると同時に非同期的に行われます。残念ながら、これはmeta.phpのdelete_metadata()関数を迂回し、代わりにwp-admin/includes/post.phpのdelete_meta()を呼び出します(wp-includes/post.phpと混同しないでください)。

まだ使用できるアクションは2つあります。delete_postmeta(削除前)、およびdeleted_postmeta(削除後)です。どちらもメタデータのIDである単一のパラメータ$midを受け入れます(not the key)。以下を使用してメタデータオブジェクトを取得できます。

$meta = get_post_meta_by_id($mid);  

meta_id、post_id、meta_key、およびmeta_valueを持つオブジェクトを返します。もちろん、deleted_postmetaが呼ばれるまでにメタデータは削除されているのでget_post_meta_by_id()は機能しません(ちょっとそのアクションが役に立たなくなります)

投稿の編集ページからカスタムメタデータを更新する場合も同様です。 meta.phpのupdate_metadata()関数(およびそのアクション)はnot呼び出されますが、代わりにwp-admin/includes/post.phpのupdate_meta()関数が呼び出されます。ここでもupdate_postmetaupdated_postmetaの2つのアクションがあります。引数は$ meta_id、$ post_id、$ meta_key、$ meta_valueです。

8
sebastien.b