Încarcă imaginea reprezentativă a articolului din frontend

7 mar. 2011, 22:33:26
Vizualizări: 23.2K
Voturi: 9

Ne dorim ca utilizatorii să poată încărca imaginea reprezentativă atunci când editează articolele. Cum ar putea fi implementat acest lucru. Îmi imaginez că ar trebui să folosim funcțiile AJAX din WordPress.

Aveți idei,

Marvellous

0
Toate răspunsurile la întrebare 1
8
25

Încărcarea fișierelor prin ajax poate fi un pic mai complicată, deoarece nu este posibil să încarci fișiere folosind obiectul XMLHttpRequest al browser-ului. Prin urmare, trebuie să folosești un plugin pentru încărcare prin Ajax, iar cel mai simplu ar fi JQuery Form Plugin, care simplifică procesul și este inclus în WordPress. Pentru a-l folosi, trebuie să îl încarci astfel:

add_action('wp_print_scripts','include_jquery_form_plugin');
function include_jquery_form_plugin(){
    if (is_page('12')){ // adaugă scriptul doar pe pagina care permite încărcarea
        wp_enqueue_script( 'jquery' );
        wp_enqueue_script( 'jquery-form',array('jquery'),false,true ); 
    }
}

Pe acea pagină, adaugă formularul de încărcare și codul JQuery pentru a apela plugin-ul JQuery Form, de exemplu:

<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="Încarcă">
</form>
<div id="output1"></div>
<script>
$(document).ready(function() { 
    var options = { 
        target:        '#output1',      // elementul țintă care va fi actualizat cu răspunsul serverului 
        beforeSubmit:  showRequest,     // funcția apelată înainte de trimitere 
        success:       showResponse,    // funcția apelată după trimitere 
        url:    ajaxurl                 // începând cu versiunea 2.8, ajaxurl este definit în antetul admin și trimite către admin-ajax.php     
    }; 

    // atașează formularul folosind 'ajaxForm' 
    $('#thumbnail_upload').ajaxForm(options); 
});
function showRequest(formData, jqForm, options) {
// poți face operații suplimentare înainte de trimitere, cum ar fi dezactivarea butonului
$('#output1').html('Se trimite...');
$('#submit-ajax').attr("disabled", "disabled");
}
function showResponse(responseText, statusText, xhr, $form)  {
// poți face operații suplimentare după trimitere
}
</script>

Trebuie să înlocuiești POSTID cu ID-ul real al postării. Apoi, creează funcția Ajax pentru a accepta încărcarea fișierului și a actualiza miniatura postării:

// conectează apelul Ajax
// pentru utilizatorii autentificați
add_action('wp_ajax_my_upload_action', 'my_ajax_upload');
// pentru utilizatorii neautentificați
add_action('wp_ajax_nopriv_my_upload_action', 'my_ajax_upload');

function my_ajax_upload(){
// verificare de securitate simplă
    check_ajax_referer('upload_thumb');

// preia datele POST
    $post_id = $_POST['post_id'];

// încarcă fișierele necesare
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
// parcurge fișierele trimise și le stochează folosind media_handle_upload();
    if ($_FILES) {
        foreach ($_FILES as $file => $array) {
            if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
                echo "eroare la încărcare: " . $_FILES[$file]['error'];
                die();
            }
            $attach_id = media_handle_upload( $file, $post_id );
        }   
    }
// dacă dorești să setezi acea imagine ca imagine reprezentativă a postării, folosește:
  update_post_meta($post_id,'_thumbnail_id',$attach_id);
  echo "Miniatura nouă a fost încărcată";
  die();
} 

Sper că acest lucru te ajută!

7 mar. 2011 23:25:57
Comentarii

Este genial. Doar câteva întrebări. Adică, unde trebuie plasat totul. Evident, formularul merge pe pagina respectivă și acesta va fi ID-ul postării de utilizat. Prima acțiune add_action este pentru zona HEAD sau pentru functions.php. Iar blocul final ajax care începe cu //hook the ajax call. Unde merge această parte? Mulțumesc mult.

Robin I Knight Robin I Knight
9 mar. 2011 13:50:25

primele și ultimele fragmente de cod pot fi plasate oriunde în functions.php, iar al doilea fragment trebuie plasat pe pagina pe care doriți să afișați formularul de încărcare. De asemenea, puteți transforma al doilea fragment într-un shortcode pentru a ușura lucrurile.

Bainternet Bainternet
9 mar. 2011 13:58:23

Ceea ce nu înțeleg este cum știe formularul să folosească my_ajax_upload()? Nu ar trebui să fie inclus în apelul ajax? Pun această întrebare pentru că am o buclă de postări pe care le permit să fie editate și au nevoie de funcții diferite pentru procesarea anumitor postări.

Pollux Khafra Pollux Khafra
29 nov. 2012 15:31:39

Formularul știe să folosească my_ajax_upload deoarece valoarea sa de acțiune este conectată (add_action(...) la funcția my_ajax_upload.

Bainternet Bainternet
29 nov. 2012 20:05:44

S-a schimbat ceva recent în WP care ar afecta această funcționalitate? Din nu știu ce motiv, nu am date $_POST până când ajung la my_ajax_upload, chiar dacă în callback-ul JS showRequest parametrul formData conține tot ce mă aștept.

drzaus drzaus
4 ian. 2013 11:23:01

Ciudat, dacă schimb metoda formularului în "GET", tot face un post dar cu detaliile formularului în URL și abia atunci datele formularului sunt disponibile pe server (deși ca parametri URL). Actualizare: Cu excepția fișierelor :)

drzaus drzaus
4 ian. 2013 11:48:50

@Bainternet, Soluție minunată. Funcția de callback pentru post (showResponse) nu funcționează. Ai vreo sugestie pentru asta?

Rocker Maruf Rocker Maruf
27 ian. 2015 18:09:01

nu funcționează? sunt erori?

Bainternet Bainternet
28 ian. 2015 10:40:40
Arată celelalte 3 comentarii