投稿のサムネイル(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);
}
}
そのため、post_metaが更新されるたびに 'updated_post_meta'をトリガーする必要がありますが、残念ながら '_thumbnail_id'はトリガーされないため、後で設定する 'thumbnails_dirty'カスタムフィールドは更新されません。
そのコードから、 'schedule'のmeta_keyが更新されたかどうかを確認し、 'schedule_dirty'という別のカスタムフィールドをマークすることも確認できます( 'schedule' post_meta値は、その中に設定されるカスタムフィールドです)。この標準的なカスタムフィールドの場合、「updated_post_meta」アクションは更新時にそれを認識し、意図したとおりに「schedule_dirty」を設定します。
私が抱えている問題は、 '_ thumbnail_id' post_metaが 'updated_post_meta'アクションを引き起こさない理由が分からないことです。
問題をさらに複雑にしているのですが、投稿のサムネイルがいつ設定され、それに関連する '_thumbnail_id'のpost_metaフィールドが更新されるのかについて、明確な文書が見つかりません。注目の画像を投稿に設定すると、これはすぐに設定されるので 'save_post'アクションには依存しないように思われるので、投稿の保存に関連するさまざまな側面を調べながら、答えは他にあると思います。 。
知っておくと関連があるかもしれない他のいくつかの情報:
ここで問題となっている投稿はカスタム投稿タイプです
また、 Multiple Post Thumbnailsプラグインを使用しています その後、これらの追加の投稿サムネイルの更新された状態も確認したいと思います。
added_post_meta
の代わりにupdated_post_meta
フックを使用したいと思います。ここでメタを更新するのではなく、追加するだけです。少なくとも_thumbnail_id
の場合は、管理UIを介して再度追加する前に削除する必要があります(更新なし)。
これをさらに調べると、update_metadata()
関数のこの部分がわかります。
if ( empty( $meta_ids ) ) {
return add_metadata($meta_type, $object_id, $meta_key, $passed_value);
}
update_{$meta_type}_meta
フックとupdated_{$meta_type}_meta
フックが起動される前に、add_metadata()
を呼び出してそれを返すため、問題を引き起こしています。
したがって、add_metadata()
関数ではなくupdate_metadata()
関数にフックする必要があります。 add_{$meta_type}_meta
( before )またはadded_{$meta_type}_meta
( after )フック。
注目の画像を追加/削除するときに管理UIからajaxで要求されるwp_ajax_set_post_thumbnail()
関数をチェックアウトすると、関数set_post_thumbnail()
とdelete_post_thumbnail()
が使用されていることがわかります。
後者はdelete_metadata()
のラッパーで、delete_{$meta_type}_meta
( before )とdeleted_{$meta_type}_meta
( after )フックを起動します。
これは投稿サムネイルの追加/削除イベントにフックする実用的な例です。 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);
}
}