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


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

Я просмотрел весь кодекс в поисках крючка, который будет срабатывать после установки 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", которое я впоследствии хочу установить, не обновляется.

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, почему сообщение "_thumbnail_id" не запускает действие "updated_post_meta".

Дальнейшее усложнение проблемы Я просто не могу найти какой-либо четкой документации о том, когда устанавливается миниатюра сообщения и впоследствии обновляется соответствующее поле post_meta "_thumbnail_id". Я отмечаю, что при установке отображаемого изображения в сообщении это устанавливается сразу и, следовательно, не зависит от действия "сохранить сообщение", поэтому, хотя я просмотрел различные аспекты, связанные с сохранением сообщений, я думаю, что ответ лежит в другом месте.

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

  • Сообщения, о которых здесь идет речь, являются пользовательским типом сообщений

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

Author: Rick Curran, 2015-11-18

2 answers

Я думаю, что вы хотите использовать крючок 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.

Поэтому вам необходимо чтобы подключиться к функции 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 ( до ) и deleted_{$meta_type}_meta ( после ) крючки.

 4
Author: birgire, 2015-11-26 14:48:53

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

// 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);
  } 
}
 1
Author: jgraup, 2017-04-13 12:37:50