Есть ли крючок/действие, которое запускается при добавлении или удалении миниатюры публикации?
Я пытаюсь обновить настраиваемое поле после добавления или удаления миниатюры публикации (рекомендуемого изображения) из публикации. Цель этого состоит в том, чтобы отслеживать, было ли добавлено или удалено показанное изображение, чтобы синхронизировать экспорт только обновленных "грязных" сообщений для использования во внешней службе.
Я просмотрел весь кодекс в поисках крючка, который будет срабатывать после установки 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". Я отмечаю, что при установке отображаемого изображения в сообщении это устанавливается сразу и, следовательно, не зависит от действия "сохранить сообщение", поэтому, хотя я просмотрел различные аспекты, связанные с сохранением сообщений, я думаю, что ответ лежит в другом месте.
Несколько других битов информации, которые могут иметь отношение к знать:
Сообщения, о которых здесь идет речь, являются пользовательским типом сообщений
Я также использую плагин Для нескольких миниатюр сообщений и впоследствии хочу также проверить обновленное состояние этих дополнительных миниатюр сообщений.
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
( после ) крючки.
Это рабочий пример, который подключается к событиям добавления/удаления для миниатюры публикации. Он также включает в себя мета-ключ, необходимый для дополнительного эскиза, созданного 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);
}
}