web-dev-qa-db-de.com

Laden Sie das Miniaturbild des Beitrags vom Frontend hoch

Wir möchten, dass Benutzer die Beitragsminiatur beim Bearbeiten von Beiträgen hochladen können. Wie würde das gemacht werden? Ich würde mir vorstellen, dass es die Ajax-Funktionen von WordPress nutzen würde.

Irgendwelche Ideen,

Wunderbar

9
Robin I Knight

Das Hochladen von Dateien in Ajax ist etwas schwierig, da das Hochladen von Dateien mit dem XMLHttpRequest-Objekt des Browsers nicht möglich ist. Daher müssen Sie ein Ajax-Upload-Plugin verwenden. Das einfachste ist das JQuery Form Plugin was die Sache viel einfacher macht und in WordPress enthalten ist. Um es zu verwenden, müssen Sie es einreihen:

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 ); 
    }
}

fügen Sie auf dieser Seite Ihr Upload-Formular und die JQuery hinzu, um das JQuery Form-Plugin aufzurufen. Beispiel:

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

sie müssen POSTID mit der tatsächlichen Beitrags-ID aktualisieren. Erstellen Sie dann die Ajax-Funktion, um den Datei-Upload zu akzeptieren und das Post-Thumbnail zu aktualisieren

//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();
} 

hoffe das hilft

25
Bainternet