添加或删除帖子缩略图时是否会触发挂钩/操作?

时间:2015-11-18 作者:Rick Curran

我正在尝试在帖子缩略图(特色图片)添加或删除后更新自定义字段。这样做的目的是跟踪特征图像是否已添加或删除,以便仅同步导出更新的“脏”帖子,以便在外部服务中使用。

我在整个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 并且随后还想检查这些附加帖子缩略图的更新状态。

2 个回复
最合适的回答,由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}_metaupdated_{$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);
  } 
}

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在