Как подключить обновление мета-записи и удалить мета-запись?
Я все еще пытаюсь разобраться во всем этом, поэтому я действительно застрял, пытаясь выполнить следующую задачу:
Если update_post_meta
срабатывает, то проверьте, равно ли meta_key
чему-то (я хочу запустить некоторый код, если используется определенный meta_key). Если я ищу мета-ключ, то запустите некоторый код, который должен будет знать $post->ID
обновляемого мета-ключа.
Мне тоже нужно подключиться к delete_post_meta
, что делает обратное как и выше.
Может ли кто-нибудь предоставить мне пример кода для подключения к update_post_meta
и delete_post_meta
?
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 );
}
}
Ответ Яна охватывает в значительной степени это выше, за исключением случая, когда пользовательские метаданные удаляются со страницы редактирования публикации. Это происходит асинхронно, как только вы нажимаете кнопку "Удалить" под метаданными, с помощью вызова 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.