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

Хуки 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
не передаёт 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
, но дальше этого я не продвинулся. Я не понимал, как их использовать. Но теперь, кажется, разобрался :)

Ответ Яна выше довольно полно охватывает тему, за исключением случая, когда пользовательские метаданные удаляются со страницы редактирования записи. Это происходит асинхронно, как только вы нажимаете кнопку "Удалить" под метаданными, через вызов 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
- ID метаданных (не ключ). Вы можете получить объект метаданных с помощью:
$meta = get_post_meta_by_id($mid);
который возвращает объект с полями meta_id, post_id, meta_key и meta_value. Конечно, к моменту вызова 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.
