我正在尝试在帖子缩略图(特色图片)添加或删除后更新自定义字段。这样做的目的是跟踪特征图像是否已添加或删除,以便仅同步导出更新的“脏”帖子,以便在外部服务中使用。
我在整个codex中查找了一个在设置post\\u缩略图后会触发的挂钩,但我没有找到任何东西。我希望的解决方案是使用精简的“updated\\u post\\u meta”操作(不要与“update\\u post\\u 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);
}
}
因此,无论何时更新post\\u meta,都应触发“updated\\u post\\u meta”,但遗憾的是,从未触发“\\u thumbnail\\u id”,因此我随后要设置的“thumbnails\\u dirty”自定义字段不会更新。
您将从代码中看到,我也在检查“schedule”的meta\\u键是否曾经更新过,然后标记另一个名为“schedule\\u dirty”的自定义字段(“schedule”post\\u meta值是在标准post UI中设置的自定义字段)。在这个更标准的自定义字段中,“updated\\u post\\u meta”操作在更新时会看到它,并将“schedule\\u dirty”设置为预定的
我的问题是,我不明白为什么“\\u thumbnail\\u id”post\\u meta没有触发“updated\\u post\\u meta”操作。
使问题更加复杂的是,我找不到任何关于何时设置post缩略图以及随后更新其相关“\\u thumbnail\\u id”post\\u meta字段的清晰文档。我注意到,当在帖子上设置特色图像时,这是直接设置的,因此似乎不依赖于“save\\u post”操作,因此,虽然我已经查看了与保存帖子相关的各个方面,但我认为答案在别处。
其他一些可能与了解相关的信息:
这里讨论的帖子是一种自定义的帖子类型
我也在使用Multiple Post Thumbnails plugin 并且随后还想检查这些附加帖子缩略图的更新状态。
最合适的回答,由SO网友:birgire 整理而成
我想你想用added_post_meta
钩子代替updated_post_meta
因为你没有在这里更新meta,只是添加了它。至少在_thumbnail_id
, 我们必须先删除它,然后再通过管理UI再次添加它(无更新)。
进一步调查,我们发现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()
函数,这是在添加/删除特色图像时从管理UI请求的ajax,我们看到它使用了这些函数set_post_thumbnail()
和delete_post_thumbnail()
.
后者是delete_metadata()
, 点燃了delete_{$meta_type}_meta
(之前)和deleted_{$meta_type}_meta
(之后)挂钩。
SO网友:jgraup
这是一个挂接帖子缩略图的添加/删除事件的工作示例。它还包括由MultiPostThumbnail创建的次缩略图所需的元键。此解决方案的帮助来自here 以及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);
}
}