Как подключить update_post_meta и delete_post_meta?

29

Я все еще изо всех сил пытаюсь разобраться во всем этом, поэтому я действительно застрял в попытке выполнить следующую задачу:

Если update_post_metaзапущено, то проверьте, meta_keyравно ли оно чему-либо (я хочу вызвать некоторый код, если используется определенный meta_key). Если мета-ключ, который я ищу, запустите некоторый код, который должен знать $post->IDоб обновляемом мета-ключе.

Мне нужно подключиться к delete_post_metaтому же типу, что и наоборот.

Может ли кто-нибудь предоставить мне пример кода для подключения update_post_metaи delete_post_meta?

Brady
источник

Ответы:

45

Эти update_post_metaкрючки вызываются из более общей update_metadata()функции, так что вы не могли бы найти его непосредственно. Три крючка:

  • update_post_metadataфильтр, который позволяет «захватить» обновление метаданных и сделать что-то еще. Если вы подключите функцию, которая возвращает логическое значение, выполнение на этом останавливается и возвращается логическое значение.
  • update_post_meta, Это действие , которое вызывается прежде , чем данные обновляются в базе данных.
  • updated_post_meta, Это действие , которое вызывается после того, как данные обновляются в базе данных.

Если ключ мета не существует в базе данных еще, update_metadata()передает управление add_metadata(), которое имеет аналогичные крючки add_post_metadata, add_post_metaи added_post_meta. Это происходит до того, как update[d]_post_metaбудет вызван. Так что если вы хотите сделать что - то , когда ключ мета добавляется или обновляется, убедитесь , что крюк в обоих update*и на add*крючках - но обратите внимание , что в то время как updated_*и added_*действия проходят аналогичные параметры, update_*а add_*не ( add_post_metaне проходит мета ID первого) ,

delete_metadata()имеет аналогичные крючки: delete_post_metadata, delete_post_metaи deleted_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 );
    }
}
Ян Фабри
источник
супер спасибо за это. Я знал об update_post_metaиспользовании update_metadataи там, там были крючки, added_post_metaи updated_post_metaэто все, насколько я мог получить. Я не понял, как использовать. Но теперь я думаю, что у меня это получилось :)
Брейди
3
Более конкретно, крючокupdated_{$post_type}_meta
Бенджамин Интал
8

Ян ответ охватывает в значительной степени это выше, за исключением случая, когда пользовательские метаданные удаляются со страницы редактирования сообщения. Это происходит асинхронно, как только вы нажимаете кнопку «Удалить» под метаданными, через вызов wp-admin / admin-ajax.php. К сожалению, эти вызовы обходят delete_metadata()функцию в meta.php и вместо этого вызывают delete_meta()в wp-admin / includes / post.php (не путать с wp-include / post.php).

Тем не менее, есть 2 действия, которые можно использовать delete_postmeta(до удаления) и deleted_postmeta(после удаления). Оба принимают один параметр $mid, который является идентификатором метаданных (а не ключом). Вы можете получить объект метаданных, используя:

$meta = get_post_meta_by_id($mid);  

который возвращает объект с meta_id, post_id, meta_key abd meta_value. Конечно, к моменту deleted_postmetaвызова метаданные были удалены, поэтому get_post_meta_by_id()они не будут работать (что делает это действие бесполезным)

То же самое касается обновления пользовательских метаданных со страницы редактирования сообщения. update_metadata()Функция (и его действия) в meta.php это не называется, но update_meta()функция в WP-администратора / включает / post.php вместо этого. Здесь снова два действия, update_postmetaи updated_postmeta. Аргументы: $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
источник