web-dev-qa-db-fra.com

Un crochet/une action est-il déclenché lors de l'ajout ou de la suppression d'une vignette de publication?

J'essaie de mettre à jour un champ personnalisé après l'ajout ou la suppression d'une vignette de publication (Image sélectionnée). L'objectif est de savoir si une image sélectionnée a été ajoutée ou supprimée afin d'exporter de manière synchronisée uniquement les publications "modifiées" mises à jour destinées à être utilisées dans un service externe.

J'ai cherché dans tout le codex un crochet qui serait déclenché après qu'un post_thumbnail ait été défini, mais je n'ai rien trouvé. La solution que j'avais espérée fonctionner était d'utiliser l'action 'updated_post_meta' très documentée (à ne pas confondre avec 'update_post_meta'!), En utilisant le code suivant:

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);
    }
}

Donc, 'updated_post_meta' devrait être déclenché chaque fois que post_meta est mis à jour, mais malheureusement '_thumbnail_id' ne se déclenche jamais et le champ personnalisé 'thumbnails_dirty' que je souhaite définir ensuite ne sera pas mis à jour.

Vous verrez dans ce code que je vérifie également si une méta_key de 'schedule' est déjà mise à jour, puis marque un autre champ personnalisé appelé 'schedule_dirty' (la valeur post_meta de 'schedule' est un champ personnalisé qui est défini dans l'interface de publication standard) Dans le cas de ce champ personnalisé plus standard, l'action 'updated_post_meta' le voit lorsqu'elle est mise à jour et définit le paramètre 'schedule_dirty' comme prévu.

Le problème que j'ai est que je ne vois pas pourquoi le post_meta '_thumbnail_id' ne déclenche pas l'action 'updated_post_meta'.

En aggravant le problème, je ne trouve pas de documentation claire sur le moment où la vignette de publication est définie, puis sur la mise à jour de son champ '_thumbnail_id' lié. Je remarque que, lorsque vous définissez l'image sélectionnée sur un message, celle-ci est définie immédiatement et ne semble donc pas dépendre de l'action 'save_post'. Par conséquent, même si j'ai examiné divers aspects liés à la sauvegarde des publications, je pense que la réponse est ailleurs. .

Quelques autres informations utiles à connaître:

  • Les messages en question ici sont un type de message personnalisé

  • J'utilise également le plug-in Plusieurs publications miniatures et souhaite par la suite vérifier l'état mis à jour de ces miniatures supplémentaires.

3
Rick Curran

Je pense que vous voulez utiliser le hook added_post_meta au lieu de updated_post_meta car vous ne mettez pas à jour la méta ici, vous ne faites que l'ajouter. Au moins dans le cas du _thumbnail_id, où nous devons le supprimer avant de l'ajouter à nouveau (pas de mise à jour) via l'interface utilisateur d'administration.

En examinant plus loin, nous voyons que cette partie de la fonction update_metadata():

if ( empty( $meta_ids ) ) {
    return add_metadata($meta_type, $object_id, $meta_key, $passed_value);
}

vous cause le problème, car il appelle add_metadata() et le renvoie, avant que les hooks update_{$meta_type}_meta et updated_{$meta_type}_meta ne soient déclenchés.

Vous devez donc vous connecter à la fonction add_metadata(), au lieu de la fonction update_metadata(), par exemple. les crochets add_{$meta_type}_meta ( before ) ou added_{$meta_type}_meta ( after ).

Si nous vérifions la fonction wp_ajax_set_post_thumbnail(), si cela est demandé par l’interface utilisateur administrative lors de l’ajout/la suppression de l’image sélectionnée, nous voyons qu’elle utilise les fonctions set_post_thumbnail() et delete_post_thumbnail().

Ce dernier est un wrapper pour delete_metadata(), qui déclenche les hooks delete_{$meta_type}_meta ( before ) et deleted_{$meta_type}_meta ( after ).

4
birgire

Il s'agit d'un exemple de travail lié aux événements d'ajout/suppression d'une vignette de publication. Il inclut également la clé méta requise pour la miniature secondaire créée par MultiPostThumbnail. L'aide pour cette solution est venue de ici et de la documentation MultiPostThumbnail. birgire donne une bonne explication sur ces points dans la réponse acceptée.

// 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