web-dev-qa-db-fra.com

Enregistrement de supports - Quel crochet est activé?

Howdi,

J'essaie de déclencher du code qui se produira lorsque je sauvegarde une image dans la médiathèque. Comme d'habitude, je sélectionne le fichier, je télécharge, saisis les métadonnées, puis cliquez sur Enregistrer. À ce stade, je souhaite utiliser WordPress et rediriger WordPress vers une autre URL. Ainsi, plutôt que d'emmener l'utilisateur à une liste de fichiers multimédias téléchargés, je peux ensuite les amener à un outil de manipulation d'images.

J'ai trouvé un filtre qui se déclenche juste avant la création des métadonnées, mais rien pour le moment où le fichier est enregistré?

Merci,

7
Richard Bagshaw

En fait, aucun crochet ne se déclenche après le téléchargement du ou des fichiers multimédias, du moins autant que je sache. Le problème avec les points d'ancrage disponibles tout au long du processus de téléchargement et d'enregistrement des fichiers multimédias et des données est qu'ils sont limités à une partie du processus. Par conséquent, leur utilisation n'est pas fiable. Par exemple, add_attachment est déclenché lorsqu'un nouveau fichier a terminé le processus de téléchargement avant de modifier les métadonnées du fichier. Si vous envisagez de rediriger l'utilisateur à ce stade, le processus de téléchargement des fichiers suivants sera interrompu si plusieurs téléchargements sont effectués, cela pourrait convenir pour d'autres types d'actions.

Toutefois, dans votre cas particulier, vous pouvez vous connecter à admin_init action et vérifier si nous sommes sur l’écran de la médiathèque après avoir chargé ou modifié un fichier. Nous savons qu’en enregistrant le nombre de pièces jointes avant de le télécharger et le comparant au nombre de pièces jointes après. le téléchargement:

add_action('admin_init', 'redirect_after_media_save');
function redirect_after_media_save() {

    global $pagenow;

    // when visiting the upload screen, we save the number of attachments
    if ( $pagenow == 'media-new.php' ) {
        $attachments_before = array_sum((array)wp_count_attachments());
        update_option('count_attach_before', $attachments_before);
    }

    if ( $pagenow == 'upload.php' ) { // we are on media library page

        // get attachments count before and after upload
        $attachments_before = get_option('count_attach_before');
        $attachments_after = array_sum((array)wp_count_attachments());

        if ( 
            // there are new files uploaded
            ( wp_get_referer() == admin_url('media-new.php') && $attachments_after > $attachments_before )
            ||
            // or we have just edited media file
            isset($_GET['posted'])
        ) {
                // redirect to desired location
                wp_redirect(admin_url());
                exit;
        }
    }
}

Ce code redirige l'utilisateur vers le tableau de bord après le téléchargement ou la modification d'un fichier multimédia. Vous pouvez l'ajuster en fonction de vos besoins. Vous pouvez également choisir un raccord administrateur autre que admin_init si vous souhaitez effectuer des tâches autres que la redirection.

4
Ahmad M

On dirait qu'il n'y a pas d'action sur la sauvegarde de média, mais il y a un filtre. Malheureusement, cela signifie que vous pouvez faire certaines choses, vous ne pouvez pas réellement faire écho à quoi que ce soit ou vous allez casser le filtre.

add_filter('attachment_fields_to_save', 'attachment_stuff');
function attachment_stuff($stuff){

    //Do stuff here, but don't echo anything or you'll break the filter.

    return $stuff;
}

$ stuff est en réalité un tableau de champs utilisés par la page d'élément multimédia. Vous pouvez essayer d’autres choses, comme l’accrochage à un crochet plus générique du panneau d’administration et la recherche de la valeur $ _GET ['action'] de 'editattachment'.

3
eddiemoya

Peut-être une réponse un peu tardive, mais j'avais un scénario similaire et je voulais partager la solution.

Dans functions.php du thème (la création d'un plug-in fonctionnerait également), j'ai utilisé le hook 'add_attachment' pour créer un nouveau message (type de message personnalisé 'talk') basé sur chaque nouveau fichier téléchargé. Bien sûr, l'exemple pourrait être un peu fastidieux, mais cela a fonctionné pour analyser chaque pièce jointe multimédia téléchargée.

<?php
function cpt_from_attachment($attachment_ID)
{          
    global $current_user;
    get_currentuserinfo();

    $attachment_post = get_post( $attachment_ID );

    $type = get_post_mime_type($attachment_ID);
    if(strpos($type, 'audio') === 0)
    {
        // Create new custom post object only for audio files
        $my_post = array(
          'post_title'    => $attachment_post->post_title,
          'post_content'  => $attachment_post->post_content,
          'post_type'   => 'talk',
          'post_author'   => $current_user->ID
        );

        // Insert the custom post into the database
        $post_id = wp_insert_post( $my_post );
        wp_update_post( array(
                'ID' => $attachment_ID ,
                'post_parent' => $post_id
            )
        );
        wp_set_post_terms( $post_id, get_post_meta($attachment_ID, "artist", true), 'speaker' );
    }
}

add_action("add_attachment", 'cpt_from_attachment');
2
Calle