web-dev-qa-db-ja.com

投稿のサムネイルを追加または削除したときにトリガーされるフック/アクションはありますか。

投稿のサムネイル(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'アクションには依存しないように思われるので、投稿の保存に関連するさまざまな側面を調べながら、答えは他にあると思います。 。

知っておくと関連があるかもしれない他のいくつかの情報:

3
Rick Curran

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 )フックを起動します。

4
birgire

これは投稿サムネイルの追加/削除イベントにフックする実用的な例です。 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);
  } 
}
1
jgraup