Încarcă imaginea reprezentativă a articolului din frontend
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

Î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ă!

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.

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.

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.

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

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.

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

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