Șterge rând din tabel personalizat în WordPress folosind AJAX
Din tabelul meu personalizat ($table = $wpdb->prefix . 'user_req';
) afișez date cu $wpdb->get_results()
și un loop foreach:
Am reușit să actualizez baza de date cu valorile individuale din formularul unde există un buton "Trimite". Dar, din acest tabel vreau să șterg orice rând prin click pe butonul (x)
din dreapta fiecărui rând. Aș putea folosi $_GET[]
și să șterg rândul ușor, dar în acest caz vreau să folosesc AJAX.
Butonul (x)
din dreapta fiecărui rând este de fapt:
<input type="button" class="delete" title="Exclude acest rând"/>
Nu am experiență în codare, așa că am dificultăți cu asta. Majoritatea soluțiilor găsite sunt pentru PHP-mySQL simplu, dar încerc să rezolv într-un mod specific WordPress. Am pregătit interogarea de ștergere cu $wpdb:
<?php $wpdb->delete( $table, array( 'post_id' => $products->post_id ) ); ?>
Dar nu am reușit să o implementez într-un mod WordPress-AJAX. Așadar, orice ajutor ar fi foarte apreciat.

Nonce
Va trebui să configurați un câmp ascuns nonce
sau să-l adăugați elementului pentru a putea verifica cererea. Consultați codex-ul pentru exemple.
Setarea ID-ului POST și Nonce
Va trebui să adăugați ID-ul postării specifice pe butonul de ștergere sau într-un câmp de input ascuns asociat cu acea intrare. Am configurat exemplul astfel încât va trebui să adăugați post_id
și nonce
în ID-ul elementului într-un format precum #delete_postid_nonce
. ID-ul elementului dvs. ar trebui să arate astfel: #delete_12_94f3a1e666
.
Puteți să-l atribuiți folosind: $element_id = 'delete_' . $products->post_id . '_' . wp_create_nonce('delete_' . $products->post_id );
Adăugarea Acțiunilor
Acestea trebuie plasate în functions.php sau într-un plugin personalizat.
Veți observa că există două apeluri add_action. Unul este pentru utilizatorii privilegiați (adică cei autentificați) și unul pentru utilizatorii neprivilegiați. Eliminați unul sau altul dacă nu aveți nevoie de ambele. Puteți citi mai multe despre aceasta în Codex.
Funcția Delete_Row()
Aceasta trebuie plasată în functions.php sau într-un plugin personalizat.
Aici extrageți id
-ul pe care l-am trimis în obiectul data
al apelului ajax. Acesta este analizat și plasat în tabloul POST
deoarece type
apelului ajax este setat la POST
.
Apoi folosiți explode()
pentru a extrage ID-ul din ID-ul elementului trimis în apelul ajax (ex. '#delete_12_94f3a1e666'), ceea ce vă va lăsa cu $id = array('delete', 12, '94f3a1e666');
. Deci post_id este egal cu indexul [1]
.
Apoi folosiți echo
pentru a returna data
către secțiunea success
a apelului ajax. Și apoi încheiați funcția php prin apelul `die'.
Va trebui să modificați acest cod pentru a funcționa 100%.
JS:
jQuery(document).on('click', '.delete', function () {
var id = this.id;
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {"action": "your_delete_action", "element_id": id},
success: function (data) {
//aici puteți rula acțiuni la succes. Puteți folosi variabila `data` în return, astfel încât să puteți afișa un mesaj.
}
});
});
PHP:
function delete_row() {
$id = explode('_', sanitize_text($_POST['element_id']));
if (wp_verify_nonce($id[2], $id[0] . '_' . $id[1])) {
$table = 'yourtable';
$wpdb->delete( $table, array( 'post_id' => $id[1] ) );
echo 'Postare ștearsă';
die;
} else {
echo 'Nonce neverificat';
die;
}
}
add_action('wp_ajax_your_delete_action', 'delete_row');
add_action( 'wp_ajax_nopriv_your_delete_action', 'delete_row');

Mulțumesc foarte mult pentru răspunsul detaliat. Dar, cred că nu înțeleg partea cu if( wp_verify_nonce( $id[2], $id[0] . '_' . $id[1] ) )
. Nu reușesc să fac legătura cu alte tutoriale (cum ar fi acesta). Și fără nicio modificare la codul tău, dacă rulez pagina, primesc o eroare fatală la al doilea produs - afișând: Nu pot redeclara funcția delete_row()
. Am inserat atât funcția cât și <script>jQuery(document).on...
în interiorul loop-ului.

În acel tutorial se face într-un mod diferit. Un mod perfect valid. Când explodezi stringul delete_12_94f3a1e666
obții delete
la indexul [0] al array-ului, 12
pentru indexul [1], 94f3a1e666
pentru indexul [2]. Dacă te uiți la referința funcției, primul parametru al wp_verify_nonce
este nonce-ul, apoi numele nonce-ului. Eu verific nonce-ul în statement-ul if. delete_row()
: se pare că există deja o altă funcție numită delete_row()
în instalarea ta. Redenumește această funcție. Nu vrei ca funcția să fie în interiorul loop-ului. Pune-o în fișierul functions.php sau într-un plugin custom.

Când schimbi numele funcției, va trebui să îl modifici și în add_actions
. Acest cod nu este copy/paste. Nu cunosc întreaga ta configurare. Trebuie să îl modifici pentru configurația ta specifică. De exemplu: în funcția delete_row()
trebuie să configurezi corect $wpdb->delete()
pentru că nu va funcționa așa cum este.

Poți fi în buclă pentru un chat cu mine?

@Mayeenul Islam: Ce întrebări ai în acest moment? Te pot îndruma către resursele potrivite. Ești foarte aproape să reușești. Asigură-te că ai pluginul debug bar
instalat! Folosește și consola javascript din browser pentru a depana javascript-ul!

Funcția nu trebuie să fie în buclă - aceasta este comanda cheie pentru mine. Am mutat-o în functions.php
. Redenumirea nu este necesară, pentru că se confruntă cu probleme deoarece este apelată dublu când se află într-o buclă. Ok. Acum am deschis Consola, afișează o eroare Uncaught ReferenceError: ajaxurl is not defined când dau click pe buton. Am încărcat biblioteca jQuery la început.

Bună sugestie. Trebuie să specifici calea către ajax.php: încearcă asta chiar sub var id = this.id;
: var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
Unde se află javascript-ul? Pe pagină? Va fi ușor să folosești php acolo. Asigură-te că este în afara buclei, altfel va fi redeclarat.

hai să continuăm această discuție în chat
