Intereting Posts
Admin-Ajax.php, SSL, Non-SSL Стиль очереди внутри короткого кода, но он загружен в нижней части страницы (перед сценариями нижнего колонтитула) Как изменить URL-адрес (добавить значения GET) после отправки формы в конец? Цитаты в названии таблицы Получить только сообщения от определенного пользователя в wp-admin / edit.php Плагин: как сделать ссылки на странице администратора открытыми внутри панели администратора Откуда это странное сообщение og: description? Как изменить wp.media для получения и отображения нескольких изображений Изменить постоянную ссылку на страницу вложений Как отображать следующие заголовки сообщений в отдельных div на отдельной веб-странице Программно добавьте шрифты «Удивительные шрифты» в категорию «Виджет» Показать сообщения от автора с помощью параметров поиска (not author template / query_posts) Поиск по нескольким категориям Отправить электронное письмо при публикации новой публикации в определенных категориях has_shortcode для контента, добавленного после содержимого

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

Я пытаюсь обновить настраиваемое поле после миниатюры сообщений (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); } }