Как подключить обновление мета-записи и удалить мета-запись?


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

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

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

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

Author: Eje, 2011-05-10

2 answers

Крючки 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 сначала не передает мета-идентификатор).

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 );
    }
}
 47
Author: Jan Fabry, 2011-05-10 12:25:31

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

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

$meta = get_post_meta_by_id($mid);  

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

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

 9
Author: sebastien.b, 2011-08-21 01:04:41