Importer la vignette du post depuis le frontal

9

Nous aimerions que les utilisateurs puissent télécharger la miniature du message lors de la modification des messages. Comment cela se ferait-il? J'imagine qu'il utiliserait les fonctions ajax de wordpress.

Des idées,

Merveilleux

Robin I Knight
la source

Réponses:

25

Le téléchargement de fichiers dans ajax est un peu délicat car il n'est pas possible de télécharger des fichiers en utilisant l'objet XMLHttpRequest du navigateur, vous devez donc utiliser une sorte de plugin de téléchargement Ajax et le plus simple serait le plugin JQuery Form qui facilite les choses et c'est inclus dans WordPress. Donc, pour l'utiliser, vous devez le mettre en file d'attente:

add_action('wp_print_scripts','include_jquery_form_plugin');
function include_jquery_form_plugin(){
    if (is_page('12')){ // only add this on the page that allows the upload
        wp_enqueue_script( 'jquery' );
        wp_enqueue_script( 'jquery-form',array('jquery'),false,true ); 
    }
}

sur cette page ajoutez votre formulaire de téléchargement et le JQuery pour appeler le plugin JQuery Form par exemple:

<form id="thumbnail_upload" method="post" action="#" enctype="multipart/form-data" >
  <input type="file" name="thumbnail" id="thumbnail">
  <input type='hidden' value='<?php wp_create_nonce( 'upload_thumb' ); ?>' name='_nonce' />
  <input type="hidden" name="post_id" id="post_id" value="POSTID">
  <input type="hidden" name="action" id="action" value="my_upload_action">
  <input id="submit-ajax" name="submit-ajax" type="submit" value="upload">
<form>
<div id="output1"></div>
<script>
$(document).ready(function() { 
    var options = { 
        target:        '#output1',      // target element(s) to be updated with server response 
        beforeSubmit:  showRequest,     // pre-submit callback 
        success:       showResponse,    // post-submit callback 
        url:    ajaxurl                 // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php     
    }; 

    // bind form using 'ajaxForm' 
    $('#thumbnail_upload').ajaxForm(options); 
});
function showRequest(formData, jqForm, options) {
//do extra stuff before submit like disable the submit button
$('#output1').html('Sending...');
$('#submit-ajax').attr("disabled", "disabled");
}
function showResponse(responseText, statusText, xhr, $form)  {
//do extra stuff after submit
}
</script>

vous devez mettre à jour POSTID avec l'ID de publication réel. puis créez la fonction Ajax pour accepter le téléchargement du fichier et mettre à jour la vignette du message

//hook the Ajax call
//for logged-in users
add_action('wp_ajax_my_upload_action', 'my_ajax_upload');
//for none logged-in users
add_action('wp_ajax_nopriv_my_upload_action', 'my_ajax_upload');

function my_ajax_upload(){
//simple Security check
    check_ajax_referer('upload_thumb');

//get POST data
    $post_id = $_POST['post_id'];

//require the needed files
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
//then loop over the files that were sent and store them using  media_handle_upload();
    if ($_FILES) {
        foreach ($_FILES as $file => $array) {
            if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
                echo "upload error : " . $_FILES[$file]['error'];
                die();
            }
            $attach_id = media_handle_upload( $file, $post_id );
        }   
    }
//and if you want to set that image as Post  then use:
  update_post_meta($post_id,'_thumbnail_id',$attach_id);
  echo "uploaded the new Thumbnail";
  die();
} 

J'espère que cela t'aides

Bainternet
la source
C'est génial. Juste quelques requêtes. Autrement dit, où tout doit aller. Évidemment, le formulaire va sur la page en question et ce sera l'identifiant du post avec lequel utiliser. La première action d'ajout est celle de la zone HEAD ou du fichier functions.php. et le dernier bloc ajax commençant par // hook l'appel ajax. Où va ce bit. Merci beaucoup.
Robin I Knight
le premier et le dernier extrait de code peuvent être placés n'importe où dans vos fonctions.php et le deuxième extrait doit être placé sur la page sur laquelle vous souhaitez afficher votre formulaire de téléchargement, vous pouvez également transformer le deuxième extrait en un shortcode pour faciliter les choses .
Bainternet
Ce que je ne comprends pas, c'est comment le formulaire sait-il utiliser my_ajax_upload ()? Cela ne devrait-il pas être inclus dans l'appel ajax? Je pose cette question parce que j'ai une boucle de messages que j'autorise à modifier et ils ont besoin de différentes fonctions pour traiter certains messages.
Pollux Khafra
Le formulaire sait utiliser my_ajax_upload car sa valeur d'action est hooked ( add_action(...) pour my_ajax_uploadfonctionner.
Bainternet
Quelque chose a-t-il changé récemment dans WP qui affecterait cette fonctionnalité? Pour une raison quelconque, je n'ai pas de $_POSTdonnées au moment où j'y arrive my_ajax_upload, même si dans le rappel JS, showRequestle formDataparam contient tout ce que j'attends.
drzaus