Gestion des téléchargements de fichiers frontaux, compte tenu de la sécurité et de la facilité d'utilisation

8

Je cherche à adapter un plugin de type forum existant qui n'a pas la possibilité de joindre des médias.

Le plugin fonctionne comme un type de publication personnalisé, il serait donc aussi "simple" que d'attacher une image à une publication.

Je ne souhaite que joindre des images plutôt que n'importe quel type de fichier, mais le plugin utilise wp_editoret en tant que tel, la solution devrait d'une manière ou d'une autre s'intégrer à cela. Je ne suis pas trop inquiet de créer un bouton tinyMCE, tant que la solution est capable d'insérer une miniature de l'image dans la zone de texte tinyMCE.

Veuillez noter que je fais référence à l'interface de mon site Web plutôt qu'à la zone d'administration.

Dans une situation absolument idéale, je voudrais que ce scénario se produise:

  • L'utilisateur clique sur "Poser une question"
  • Utiliser entre les détails de leur publication
  • L'utilisateur clique sur un bouton de l'interface tinyMCE qui, comme StackExchange, demande à l'utilisateur de télécharger un fichier.
  • Le système insère ensuite la miniature correctement dimensionnée dans la zone de texte tinyMCE, après avoir compressé le fichier dans cette taille de miniature
  • Cliquer sur cette image devrait offrir les mêmes fonctionnalités qu'une pièce jointe dans un article
  • L'utilisateur peut ensuite cliquer à nouveau pour insérer une nouvelle image
  • L'utilisateur peut également supprimer l'image de la zone de texte tinyMCE si nécessaire

Cependant, je suis heureux que le bouton tinyMCE soit périphérique - si une boîte de "téléchargement de fichier" est beaucoup plus facile, c'est bien.

Je suis tombé sur ce lien, mais j'ai toujours peur de lire des articles WordPress sur les sites Internet car je ne suis jamais trop sûr de leur sécurité, et je ne suis pas un expert en sécurité php par aucun effort d'imagination.

Merci d'avance,

dunc
la source
Je connais l'auteur de ce tutoriel particulier. Pinging lui afin qu'il puisse répondre à votre question plus précisément ...
EAMann
Question: si vous utilisez déjà la wp_editor()fonction, pourquoi ne pas simplement utiliser la boîte de téléchargement multimédia qui y est incluse? Je n'ai pas utilisé le wp_editorfront-end, mais il y a des gens qui ont réussi à le faire fonctionner avec les téléchargements d'images, voir ici , par exemple ...
goldenapples
Merci EAMann. des pommes dorées qui seraient préférables mais les auteurs du plugin ont dit que permettre l'accès aux wp_editortéléchargements de médias de donnerait aux utilisateurs de tout niveau un accès à ma bibliothèque multimédia entière? Je ne voudrais pas du tout que ce soit le cas - juste pour eux de télécharger le leur.
Dunc
Ah, c'est vrai. Je n'ai pas pensé à ce problème. Je n'ai pas regardé la media-upload.phpsource depuis un moment, mais je suis presque sûr qu'il y a un filtre sur media_upload_tabs où vous pouvez désactiver l'onglet "Médiathèque". Je vais le regarder et voir ...
goldenapples

Réponses:

4

Je pense que la façon la plus simple, puisque vous utilisez déjà la wp_editorfonction, sera simplement d'inclure les boutons multimédias dans l'instance WP_Editor - de cette façon, vous aurez les fonctions natives, y compris le bouton "Insérer dans le message", intégré gratuitement.

La façon dont vous procédez dépend évidemment du plugin avec lequel vous essayez de travailler. Cependant, cela devrait vous aider à démarrer. Incluez du code comme celui-ci dans un modèle de page pour afficher l'éditeur, et vous obtiendrez un éditeur sur votre page. Inclure cela dans un formulaire et traiter les résultats est une autre étape non détaillée ici.

// 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 définition de l'ID de publication est probablement la partie critique, et la façon dont vous procédez dépendra de la logique de votre fonctionnalité. Je voudrais suggerer:

  • Création d'un brouillon automatique lors de la première visite de cette page et enregistrement de l'ID de message renvoyé dans la variable globale $ post_id.
  • Ensuite, enregistrez le message créé avec le même ID lorsque le formulaire est soumis.
pommes dorées
la source
Pas facile à comprendre pour les débutants. Merci quand même
whiteletters dans les journaux blancs
6

Ce n'est peut-être pas votre solution idéale, mais ça vaut le coup. Je l'ai eu sur Google mais malheureusement j'ai oublié l'URL. La pièce jointe est similaire à celle de l'article @goldenapples.

Voici la fonction de 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 fonction 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

}

Le balisage

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

J'espère que cette aide

ifdion
la source
Pouvez-vous résumer ce que fait cette fonction?
Dunc
1
Sûr. La première fonction est celle qui gère les téléchargements de fichiers. Tout d'abord, il réorganise le tableau de fichiers téléchargé, pour le rendre adapté à une boucle «foreach».
ifdion
1
wp_handle_uploadplace le fichier téléchargé dans le répertoire wp-content / uploads. wp_insert_attachmentintercepte les informations sur le fichier et les enregistre en tant que pièce jointe dans la table wp_posts. wp_generate_attachment_metadata et wp_update_attachment_metadata fait ce qui est dit. La deuxième partie est la fonction ajax qui traite le formulaire affiché sur le balisage, en utilisant la attach uploadsfonction.
ifdion
1
Référence supplémentaire pour la fonction de réorganisation [lien] ( php.net/manual/en/features.file-upload.multiple.php )
ifdion