Gestire i caricamenti di file front-end, considerando la sicurezza e la facilità d'uso


8

Sto cercando di adattare un plug-in simile a un forum esistente che non ha possibilità di allegare file multimediali.

Il plug-in funziona come un tipo di post personalizzato, quindi sarebbe "semplice" come allegare un'immagine a un post.

Mi preoccupo solo di allegare immagini piuttosto che qualsiasi tipo di file, ma il plugin lo usa wp_editore come tale la soluzione dovrebbe in qualche modo integrarsi con quella. Non mi preoccupo troppo della creazione di un pulsante tinyMCE, purché la soluzione sia in grado di inserire una miniatura dell'immagine nell'area di testo tinyMCE.

Nota che mi riferisco al front-end del mio sito Web piuttosto che all'area di amministrazione.

In una situazione assolutamente ideale, vorrei che si verificasse questo scenario:

  • L'utente fa clic su "Poni una domanda"
  • Usa inserisce i dettagli dei loro post
  • L'utente fa clic su un pulsante nell'interfaccia tinyMCE che, simile a StackExchange, chiede all'utente di caricare un file.
  • Il sistema quindi inserisce la miniatura della dimensione corretta nell'area di testo tinyMCE, dopo aver ridotto il file in questa dimensione della miniatura
  • Facendo clic su questa immagine dovrebbe offrire la stessa funzionalità di un allegato di immagine in un post
  • L'utente può quindi fare di nuovo clic per inserire una nuova immagine
  • L'utente può anche eliminare l'immagine dalla textarea tinyMCE, se necessario

Tuttavia, sono felice che il pulsante tinyMCE sia periferico: se una casella di "caricamento file" è significativamente più semplice, va bene.

Mi sono imbattuto in questo link, ma sono sempre preoccupato di leggere gli articoli di WordPress su t'interwebs poiché non sono mai troppo sicuro di quanto siano sicuri, né sono un esperto di sicurezza php da qualsiasi tratto dell'immaginazione.

Grazie in anticipo,


Conosco l'autore di quel particolare tutorial. Fai un rumore metallico per consentirgli di rispondere in modo più specifico alla tua domanda ...
EAMann

Domanda: se stai già utilizzando la wp_editor()funzione, perché non utilizzare semplicemente lo thickbox di caricamento multimediale incluso in essa? Non ho usato il wp_editorfront-end, ma ci sono alcune persone che lo hanno fatto funzionare con successo con i caricamenti di immagini, vedi qui , per esempio ...
Goldenapples,

Grazie EAMann. goldenapples sarebbe preferibile, ma gli autori del plug-in hanno affermato che consentire l'accesso ai wp_editorcaricamenti multimediali dei media consentirebbe agli utenti di qualsiasi livello di accesso a tutta la mia libreria multimediale? Non vorrei che fosse così, solo per loro di caricare il proprio.
Dunc

Ah, è vero. Non ho pensato a quel problema. Non guardo la media-upload.phpfonte da un po ', ma sono abbastanza sicuro che ci sia un filtro su media_upload_tabs in cui è possibile disabilitare la scheda "Libreria multimediale". Lo guarderò e vedrò ...
Goldenapples,

Risposte:


4

Penso che il modo più semplice, dal momento che stai già utilizzando la wp_editorfunzione, sarà solo quello di includere i pulsanti multimediali nell'istanza WP_Editor - in questo modo avrai le funzioni native, incluso il pulsante "Inserisci nel post", incorporato gratuito.

Il modo in cui lo fai dipende ovviamente dal plugin con cui stai cercando di lavorare. Tuttavia, questo dovrebbe iniziare. Includi codice come questo in un modello di pagina per visualizzare l'editor e otterrai un editor sulla tua pagina. Includere questo in una forma ed elaborare i risultati è un altro passo non dettagliato qui.

// Define the global variable $post_id - this is used by the media uploader
// to attach uploads to a specific post (so that the uploader can see uploads
// attached to this post and not others)
global $post_id;
$post_id = $post->ID; // should be the ID of the new post created

// Now filter the list of tabs available in the media editor.
// Remove everything but the "From Computer" option.

add_filter( 'media_upload_tabs', 'wpse42068_remove_additional_tabs' );

function wpse42068_remove_additional_tabs( $_default_tabs ) {
    return array( 'type' => __('From Computer') );
}

// Now just include the WP_Editor. See
// http://codex.wordpress.org/Function_Reference/wp_editor
// for settings available
wp_editor( '', 'posteditor', array( 'media_buttons' => true ) );

La definizione dell'ID post è probabilmente la parte critica e il modo in cui lo fai dipenderà dalla logica della tua funzionalità. Suggerirei:

  • Creare una bozza automatica alla prima visita di questa pagina e salvare l'ID post restituito nella variabile $ post_id globale.
  • Quindi salvando il post creato con lo stesso ID quando viene inviato il modulo.

Non facile da capire per i principianti. Grazie comunque
whiteletters in bianco

6

Forse questa non è la soluzione ideale, ma vale la pena provare. Capito da Google, ma purtroppo ho dimenticato l'URL. La parte allegata è simile a quella nell'articolo di @goldenapples.

Ecco la funzione di base.

function attach_uploads($uploads,$post_id = 0){
    $files = rearrange($uploads);
    if($files[0]['name']==''){
        return false;   
    }
    foreach($files as $file){
        $upload_file = wp_handle_upload( $file, array('test_form' => false) );
        $attachment = array(
        'post_mime_type' => $upload_file['type'],
        'post_title' => preg_replace('/\.[^.]+$/', '', basename($upload_file['file'])),
        'post_content' => '',
        'post_status' => 'inherit'
    );
        $attach_id = wp_insert_attachment( $attachment, $upload_file['file'], $post_id );
        $attach_array[] = $attach_id;
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata( $attach_id, $upload_file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_data );
    }
    return $attach_array;
}

La funzione Ajax

add_action('wp_ajax_attach_file', 'process_attach_file');
function process_attach_file() {

    // add some filter and validation on the id and the files here
    $post_id = $_POST['post_id'];
    $files = $_FILES['profile-picture'];

    // insert attachment
    $attached_files = attach_uploads($files,$post_id);

    // set the first file as post thumbnail
    if($attached_files){
        set_post_thumbnail( $post_id, $attached_files[0] ); 
    }

    // now all you have to do is set the response data

}

Il markup

<form id="upload-form" action="<?php echo admin_url('admin-ajax.php'); ?>" method="post" class="form" enctype="multipart/form-data" >
    <label for="profile-picture">Foto Profil</label>
    <input type="file" id="profile-picture" name="profile-picture[]" size="40" multiple />
    <?php wp_nonce_field( // intention nonce); ?>
    <input name="action" value="attach_file" type="hidden">
    <input name="post_id" value="12" type="hidden">
</form>

Spero che questo aiuto


Puoi riassumere cosa fa questa funzione?
martedì

1
Sicuro. La prima funzione è quella che gestisce i caricamenti di file. Innanzitutto riorganizza l'array di file caricato, per renderlo adatto a un ciclo "foreach".
ifdion,

1
wp_handle_uploadmette il file caricato nella directory wp-content / uploads. wp_insert_attachmentcattura le informazioni sul file e le salva come allegato nella tabella wp_posts. wp_generate_attachment_metadata e wp_update_attachment_metadata fa quello che dice. La seconda parte è la funzione ajax che elabora il modulo mostrato nel markup, usando la attach uploadsfunzione.
ifdion,

1
Di riferimento aggiuntivo per la funzione rearrange [link] ( php.net/manual/en/features.file-upload.multiple.php )
ifdion
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.