Șterge rând din tabel personalizat în WordPress folosind AJAX

22 feb. 2014, 18:02:40
Vizualizări: 18.7K
Voturi: 3

Din tabelul meu personalizat ($table = $wpdb->prefix . 'user_req';) afișez date cu $wpdb->get_results() și un loop foreach:

Tabelul meu

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.

0
Toate răspunsurile la întrebare 1
8

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');
22 feb. 2014 18:29:51
Comentarii

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.

Mayeenul Islam Mayeenul Islam
24 feb. 2014 18:12:08

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

CommandZ CommandZ
24 feb. 2014 18:46:04

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.

CommandZ CommandZ
24 feb. 2014 18:52:07

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

Mayeenul Islam Mayeenul Islam
24 feb. 2014 18:56:05

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

CommandZ CommandZ
24 feb. 2014 19:00:22

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.

Mayeenul Islam Mayeenul Islam
24 feb. 2014 19:02:26

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.

CommandZ CommandZ
24 feb. 2014 19:04:55

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

Mayeenul Islam Mayeenul Islam
24 feb. 2014 19:25:03
Arată celelalte 3 comentarii