Як підключити update_post_meta та delete_post_meta?


29

Я все ще борюсь за те, щоб обернутись цілою цілковитою справою, тому я дуже зациклювався на спробі виконати наступне завдання:

Якщо update_post_metaвін meta_keyзапускається, перевірте, чи дорівнює значення чогось (я хочу запустити якийсь код, якщо використовується певна мета_кейк). Якщо мета-ключ, якого я шукаю, запустіть якийсь код, який повинен знати $post->IDмета-ключ, який оновлюється.

Мені потрібно зачепитись над тим, delete_post_metaщо робить зворотний, як зазначено вище.

Хтось може надати мені якийсь приклад коду для підключення до update_post_metaта delete_post_meta?

Відповіді:


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

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 );
    }
}

супер THX для цього. Я знав про 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 / включає / post.php замість цього (не плутати з wp-include / post.php).

Є ще дві дії, які все ще можна використовувати, delete_postmeta(перед видаленням) та deleted_postmeta(після видалення). Обидва приймають один параметр $mid, який є ідентифікатором метаданих (а не ключовим). Ви можете отримати об'єкт метаданих за допомогою:

$meta = get_post_meta_by_id($mid);  

який повертає об'єкт з мета_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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.