Salvataggio Media - Quale Hook Viene Attivato?
Ciao,
Sto cercando di eseguire del codice che verrà attivato quando salvo un'immagine nella libreria media. Come di consueto, seleziono il file, lo carico, inserisco i metadati e poi clicco su salva. A questo punto vorrei agganciarmi a WordPress e reindirizzare l'utente a un altro URL. In questo modo, invece di mostrare all'utente la lista dei media caricati, posso portarlo direttamente a uno strumento di manipolazione delle immagini.
Ho trovato un filtro che si attiva appena prima della creazione dei metadati, ma nulla per quando il file viene salvato?
Grazie,

Attualmente non ci sono hook attivati dopo il caricamento di file multimediali, almeno per quanto ne so. Il problema con gli hook disponibili durante il processo di caricamento e salvataggio di file e dati multimediali è che sono limitati a una sola parte del processo, quindi utilizzarne uno non è affidabile. Ad esempio, add_attachment
viene attivato dopo che un nuovo file ha completato il processo di caricamento prima di modificare i metadati del file, e se intendi reindirizzare l'utente a questo punto, interromperà il processo di caricamento per i file successivi se abbiamo più di un file da caricare. Tuttavia, potrebbe essere adatto per altri tipi di azioni.
Per il tuo caso specifico, puoi agganciarti all'hook di azione admin_init
e verificare se ci troviamo nella schermata della libreria multimediale dopo aver caricato o modificato un file. Lo sappiamo salvando il numero di allegati prima del caricamento e confrontandolo con il numero di allegati dopo il caricamento:
add_action('admin_init', 'redirect_after_media_save');
function redirect_after_media_save() {
global $pagenow;
// quando visitiamo la schermata di caricamento, salviamo il numero di allegati
if ( $pagenow == 'media-new.php' ) {
$attachments_before = array_sum((array)wp_count_attachments());
update_option('count_attach_before', $attachments_before);
}
if ( $pagenow == 'upload.php' ) { // siamo nella pagina della libreria multimediale
// otteniamo il conteggio degli allegati prima e dopo il caricamento
$attachments_before = get_option('count_attach_before');
$attachments_after = array_sum((array)wp_count_attachments());
if (
// ci sono nuovi file caricati
( wp_get_referer() == admin_url('media-new.php') && $attachments_after > $attachments_before )
||
// o abbiamo appena modificato un file multimediale
isset($_GET['posted'])
) {
// reindirizziamo alla posizione desiderata
wp_redirect(admin_url());
exit;
}
}
}
Questo codice reindirizzerà l'utente alla dashboard dopo il caricamento o la modifica riusciti di un file multimediale. Puoi modificarlo per adattarlo alle tue esigenze. Potresti anche voler scegliere un hook di amministrazione diverso da admin_init
se desideri eseguire attività diverse dal reindirizzamento.

Forse una risposta un po' tardiva, ma ho avuto uno scenario simile e volevo condividere la soluzione.
Nel file functions.php
del tema (creare un plugin avrebbe funzionato altrettanto bene), ho usato l'hook 'add_attachment'
per creare un nuovo post (custom post type 'talk') basato su ogni nuovo file caricato. Certo, l'esempio potrebbe essere migliorato, ma questo ha funzionato per analizzare ogni allegato multimediale che veniva caricato.
<?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)
{
// Crea un nuovo custom post object solo per file audio
$my_post = array(
'post_title' => $attachment_post->post_title,
'post_content' => $attachment_post->post_content,
'post_type' => 'talk',
'post_author' => $current_user->ID
);
// Inserisce il custom post nel 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');

Sembra che non ci sia un'azione al salvataggio dei media, ma c'è un filtro. Sfortunatamente, ciò significa che puoi fare alcune cose, ma non puoi effettivamente visualizzare alcun output altrimenti interromperai il filtro.
add_filter('attachment_fields_to_save', 'attachment_stuff');
function attachment_stuff($stuff){
//Fai qualcosa qui, ma non visualizzare alcun output altrimenti interromperai il filtro.
return $stuff;
}
$stuff è in realtà un array di campi utilizzati dalla pagina degli elementi multimediali. Potresti provare altre soluzioni come agganciarti a un hook più generico del pannello di amministrazione e controllare il valore $_GET['action'] di 'editattachment'.
