web-dev-qa-db-fra.com

Post taxonomie à partir de données exif

Chaque fois que je poste un article avec une image sélectionnée, je souhaite extraire les données exif de cette image et les attacher en tant que terme pour taxonomie. J'ai déjà un plugin qui peut extraire les informations pertinentes, mais je ne sais pas où et quand appeler wp_set_object_terms

Est-ce que quelqu'un peut-il me montrer la bonne direction?

2
Andreas Poulsen

Récupération de données EXIF ​​d'image de pièce jointe

Comme "un plugin" ne va pas aider les visiteurs ultérieurs, commençons par récupérer comment:

# Get the post ID: Use one of the following. Preferred is the API function get_the_ID()
# $GLOBALS['post']->ID;
# global $post; $post->ID;
# get_the_ID();
$meta = wp_get_attachment_metadata( get_the_ID(), false );
# Fetch the EXIF data part 
$exif = $meta['image_meta'];

Maintenant, nous avons les données EXIF ​​enregistrées dans $exif - pour vous assurer que nous ne sommes pas piratés avec une image, n'oubliez pas d'échapper/de désinfecter les données avant de les afficher (ou mieux: de les enregistrer).

# List of EXIF data entries:
$created   = date_i18n( 
    get_option( 'date_format' ), 
    strtotime( $meta['created_timestamp'] ) 
);
$copyright = filter_var( $meta['copyright'] );
$credit    = filter_var( $meta['credit'] );
$title     = filter_var( $meta['title'] );
$camera    = filter_var( $meta['camera'] );
$shutter   = number_format_i18n( filter_var( 
    $meta['shutter_speed'],
    FILTER_SANITIZE_NUMBER_FLOAT
), 2 );
$iso       = number_format_i18n( filter_var( 
    $meta['iso'], 
    FILTER_SANITIZE_NUMBER_FLOAT 
) );
$focal     = number_format_i18n( filter_var( 
    $meta['focal_length'],
    FILTER_SANITIZE_NUMBER_FLOAT
), 2 );
$aperture  = filter_var( $meta['aperture'] );

Enregistrement de méta EXIF ​​d’image en tant que terme

Ceci peut arriver (ou dans presque tous les cas) dans l’administrateur, nous devrons utiliser les hooks présents:

  • add_attachment (arg: $att_id)
  • edit_attachment (arg: $att_id)

où les deux sont déclenchés après (quoi d'autre) une image a été téléchargée ou modifiée.

Ensuite il y a

  • media_send_to_editor (args: $html, $send_id, $attachment)
  • attachment_fields_to_save (args: $post, $attachment)

(plus d'infos dans cette réponse )

Donc, la seule chose à faire est de

  1. choisir le bon crochet pour votre cas
  2. extraire les données EXIF ​​que vous souhaitez ajouter en tant que terme
  3. ajoutez le terme utilisant wp_set_object_terms() à la taxonomie de votre choix et publiez un rappel attaché au filtre ou au hook que vous avez choisi ci-dessus:

    $terms = wp_set_object_terms( 
        get_the_ID(),
        array( $meta['copyright'] ),
        'your-taxonomy',
        # Do *append* the new term and not replace all others with it!
        TRUE
    );
    # DEBUG:
    if ( is_wp_error( $terms ) )
        exit( $terms->get_error_message() );
    
    var_dump( $terms ); // should be an array of terms
    

Vous devriez toujours vérifier la valeur de retour (comme je l'ai fait avec is_wp_error()) lors du traitement de quelque chose. Si vous voulez être Nice et que des erreurs puissent survenir en raison de données EXIF ​​manquantes, vous devez également intervenir et fournir quelques informations aux utilisateurs, par exemple une notification de l'administrateur.

1
kaiser