Intereting Posts
Загрузка новой версии jQuery в WordPress Значение get_terms отличается от подсчета, показанного в бэкэнд Эта функция wp_get_nav_menu_object проверяет, существует или поддерживается навигационное меню? Несколько копий одного и того же сайта: как организовать код / ​​архитектуру? Невозможно установить пользовательские правила таксономии через пользовательскую форму Обработка результатов из данных, подключенных к admin_post Архивы пользовательских сообщений и одиночные страницы, не отображающие данные пользовательской таксономии Как выбрать категорию сообщения по электронной почте Можно ли удалить следующий пост / предыдущий пост без создания настраиваемого шаблона? Разбитая разметка при использовании the_excerpt () в виджетах? Где найти html для сайта WordPress? добавьте поле «загрузка файла» в подробности пользователя call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом Заголовок сообщения thumbnail alt WP cli -path, похоже, не работает

Есть ли крючок / действие, которое запускается при добавлении или удалении миниатюры сообщений?

Я пытаюсь обновить настраиваемое поле после миниатюры сообщений (Featured Image) либо добавляется, либо удаляется из сообщения. Целью этого является отслеживание того, было ли добавлено или удалено выбранное изображение, чтобы выполнить синхронизированный экспорт только обновленных «грязных» сообщений для использования во внешней службе.

Я просмотрел весь код для крючка, который будет запущен после установки post_thumbnail, но я ничего не смог найти. Решение, которое, как я надеялся, будет работать, заключается в использовании тонко документированного действия «updated_post_meta» (не путать с «update_post_meta»!), Используя следующий код:

add_action('updated_post_meta', 'check_dirty_fields_updated_post_meta', 10, 4); function check_dirty_fields_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value) { if ('_thumbnail_id' == $meta_key) { update_post_meta($post_id, 'thumbnails_dirty', 1); } if ('schedule' == $meta_key) { update_post_meta($post_id, 'schedule_dirty', 1); } } 

Таким образом, «updated_post_meta» должен запускаться всякий раз, когда post_meta обновляется, но, к сожалению, «_thumbnail_id» никогда не запускается, поэтому настраиваемое поле «thumbnails_dirty», которое я впоследствии хочу установить, не обновляется.

Вы увидите из этого кода, что я также проверяю, обновляется ли meta_key «расписания», а затем выделяется другое настраиваемое поле «schedule_dirty» (значение «schedule» post_meta – это настраиваемое поле, которое устанавливается в пределах стандартный пост-пользовательский интерфейс). В случае этого более стандартного настраиваемого поля действие «updated_post_meta» видит его, когда оно обновляется, и устанавливает «schedule_dirty», как предполагалось.

Проблема в том, что я не понимаю, почему post_meta_thumbnail_id не запускает действие «updated_post_meta».

Усугубляя проблему, я просто не могу найти четкую документацию о том, когда установлен миниатюра сообщения и впоследствии обновляется связанное с ней поле «_thumbnail_id» post_meta. Я отмечаю, что при настройке Featured Image в сообщении это устанавливается сразу и, следовательно, похоже, не зависит от действия save_post, поэтому, пока я просматривал различные аспекты, связанные с сохранением сообщений, я думаю, что ответ лежит в другом месте ,

Несколько других бит информации, которые могут иметь отношение к знанию:

  • Эти сообщения относятся к пользовательскому типу сообщений

  • Я также использую плагин Multiple Post Thumbnails и впоследствии хочу проверить обновленное состояние этих дополнительных миниатюр сообщений.

Solutions Collecting From Web of "Есть ли крючок / действие, которое запускается при добавлении или удалении миниатюры сообщений?"

Я думаю, вы хотите использовать added_post_meta вместо updated_post_meta потому что вы не обновляете мета здесь, а добавляете его только. По крайней мере, в случае _thumbnail_id , где мы должны удалить его, прежде чем добавлять его (без обновления) через интерфейс администратора.

Исследуя это, мы видим, что эта часть функции update_metadata() :

 if ( empty( $meta_ids ) ) { return add_metadata($meta_type, $object_id, $meta_key, $passed_value); } 

вызывает проблему, потому что она вызывает add_metadata() и возвращает ее, до того, как update_{$meta_type}_meta и updated_{$meta_type}_meta hooks.

Поэтому вам нужно подключиться к функции add_metadata() , а не к функции update_metadata() , например, add_{$meta_type}_meta ( до ) или added_{$meta_type}_meta ( после ) крючки.

Если мы проверяем wp_ajax_set_post_thumbnail() , это запрос ajax из пользовательского интерфейса администратора при добавлении / удалении признака, мы видим, что он использует функции set_post_thumbnail() и delete_post_thumbnail() .

Последний является оболочкой для delete_metadata() , которая запускает delete_{$meta_type}_meta ( before ) и deleted_{$meta_type}_meta ( после ).

Это рабочий пример, который перехватывает события добавления / удаления для миниатюры сообщений. Он также включает мета-ключ, необходимый для вторичного эскиза, созданного MultiPostThumbnail. Справка для этого решения появилась здесь и в документах MultiPostThumbnail. birgire дает хорошее объяснение этих крючков в принятом ответе.

 // Initialize the MultiPostThumbnails based on https://github.com/voceconnect/multi-post-thumbnails/wiki if (class_exists('MultiPostThumbnails')) { new MultiPostThumbnails( array( 'label' => 'Secondary Image', 'id' => 'secondary-image', 'post_type' => 'post' ) ); } // Listen for Updates add_action( 'added_post_meta', '___after_post_meta', 10, 4 ); add_action( 'updated_post_meta', '___after_post_meta', 10, 4 ); function ___after_post_meta( $meta_id, $post_id, $meta_key, $meta_value ) { if( $meta_key === '_thumbnail_id' ){ // Primary Thumbnail Added update_post_meta($post_id, 'thumbnails_dirty', 1); } else if ( $meta_key === 'post_secondary-image_thumbnail_id' ) { // Secondary Thumbnail Added update_post_meta($post_id, 'thumbnails_dirty', 1); } } add_action( 'deleted_post_meta', '___deleted_post_meta', 10, 4 ); function ___deleted_post_meta ( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values ) { if( $meta_key === '_thumbnail_id'){ // Primary Thumbnail Deleted update_post_meta($post_id, 'thumbnails_dirty', 1); } else if ( $meta_key === 'post_secondary-image_thumbnail_id' ) { // Secondary Thumbnail Deleted update_post_meta($post_id, 'thumbnails_dirty', 1); } }