Eliminare una riga da una tabella personalizzata in WordPress utilizzando AJAX

22 feb 2014, 18:02:40
Visualizzazioni: 18.7K
Voti: 3

Dalla mia tabella personalizzata ($table = $wpdb->prefix . 'user_req';) sto visualizzando i dati con $wpdb->get_results() e un ciclo foreach:

mia tabella

Sono riuscito ad aggiornare il database con i valori individuali del form dove c'è un pulsante "Invia". Ma, da questa tabella voglio eliminare qualsiasi riga cliccando sul pulsante (x) a destra di ogni riga. Potrei usare $_GET[] e eliminare facilmente la riga, ma in questo caso voglio usare AJAX.

Il pulsante (x) a destra di ogni riga è in realtà:

<input type="button" class="delete" title="Escludi questo elemento"/>

Non ho un background di programmazione, quindi sto avendo difficoltà. La maggior parte delle soluzioni che trovo cercando sono per PHP-mySQL base, ma sto cercando di risolverlo in modo WordPress. Potrei preparare la mia query di eliminazione con $wpdb:

<?php $wpdb->delete( $table, array( 'post_id' => $products->post_id ) ); ?>

Ma non sono riuscito a implementarla in modo WordPress-AJAX. Pertanto, qualsiasi aiuto sarebbe molto apprezzato.

0
Tutte le risposte alla domanda 1
8

Nonce

Dovrai impostare un campo nascosto nonce o aggiungerlo all'elemento per verificare la richiesta. Dai un'occhiata al codex per degli esempi.

Impostazione dell'ID POST e del Nonce

Dovrai aggiungere l'ID del post specifico al pulsante di eliminazione o a un campo di input nascosto associato a quella voce. L'esempio è configurato in modo che dovrai aggiungere il post_id e il nonce all'ID dell'elemento in un formato come #delete_postid_nonce. L'ID del tuo elemento dovrebbe risultare così: #delete_12_94f3a1e666.

Puoi assegnarlo usando: $element_id = 'delete_' . $products->post_id . '_' . wp_create_nonce('delete_' . $products->post_id );

Aggiunta di Azioni

Questi devono essere posizionati in functions.php o in un plugin personalizzato.

Noterai che ci sono due chiamate add_action. Una è per gli utenti privilegiati (cioè quelli loggati) e una per gli utenti non privilegiati. Rimuovine una se non ti servono entrambe. Puoi leggere di più su questo nel Codex.

Funzione Delete_Row()

Questa deve essere posizionata in functions.php o in un plugin personalizzato.

Qui stai recuperando l'id che abbiamo inviato nell'oggetto data della chiamata ajax. Questo viene analizzato e inserito nell'array POST poiché il type della chiamata ajax è impostato su POST.

Poi fai explode() dell'ID dall'ID dell'elemento inviato nella chiamata ajax (es. '#delete_12_94f3a1e666') che ti lascerebbe con $id = array('delete', 12, '94f3a1e666');. Quindi il post_id è uguale all'indice [1].

Poi fai echo per restituire data alla parte success della chiamata ajax. E poi termini la funzione php chiamando `die'.


Dovrai modificare questo codice per farlo funzionare al 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) {
            //esegui operazioni in caso di successo qui. Puoi usare la variabile `data` 
           //nel ritorno così puoi mostrare un messaggio.  
        }
    });
});

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 'Post eliminato';
        die;
    } else {
        echo 'Nonce non verificato';
        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
Commenti

Grazie mille per la risposta dettagliata. Ma, temo di non riuscire a capire la parte if( wp_verify_nonce( $id[2], $id[0] . '_' . $id[1] ) ). Non riesco a far combaciare questa parte con altri tutorial (come questo). E senza modificare il tuo codice, se eseguo la mia pagina genera un errore fatale sul secondo prodotto - mostrando: Non posso ridefinire la funzione delete_row(). Ho incollato sia la funzione che <script>jQuery(document).on... all'interno del loop.

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

In quel tutorial lo fanno in modo diverso. Un modo perfettamente valido. Quando esplodi la stringa delete_12_94f3a1e666 ottieni delete all'indice [0] dell'array, 12 all'indice [1], 94f3a1e666 all'indice [2]. Se guardi la reference della funzione, il primo parametro di wp_verify_nonce è il nonce e poi il nonce_name. Sto verificando il nonce nell'istruzione if. delete_row(): sembra che ci sia un'altra funzione chiamata delete_row() nella tua installazione. Rinomina questa. Non vuoi la funzione dentro il loop. Nel tuo file functions.php o in un plugin personalizzato.

CommandZ CommandZ
24 feb 2014 18:46:04

Quando cambi il nome della funzione dovrai rinominarla anche negli add_actions. Questo codice non è copia/incollabile. Non conosco il tuo setup completo. Devi modificarlo per il tuo setup specifico. Per esempio: nella funzione delete_row() devi configurare correttamente $wpdb->delete() perché così com'è non funzionerà.

CommandZ CommandZ
24 feb 2014 18:52:07

Puoi essere in the loop per una chat con me?

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

@Mayeenul Islam: Quali domande hai a questo punto? Posso indicarti le risorse appropriate. Sei molto vicino a far funzionare tutto. Assicurati di avere il plugin debug bar installato! Usa anche la console javascript del tuo browser per debugare il javascript!

CommandZ CommandZ
24 feb 2014 19:00:22

La funzione non deve essere nel loop - questo è il comando chiave per me. L'ho spostata nel functions.php. Rinominare non è necessario, perché entra in conflitto in quanto viene chiamata due volte quando è dentro un loop. Ok. Ora ho aperto la Console, mostra un Uncaught ReferenceError: ajaxurl is not defined quando clicco sul pulsante. Ho caricato la libreria jQuery all'inizio.

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

Ottimo. Devi specificare il percorso verso ajax.php: prova questo appena sotto var id = this.id;: var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>'; Dove si trova il javascript? Nella pagina? Sarà facile usare php lì. Assicurati che sia fuori dal loop altrimenti verrà ridefinito.

CommandZ CommandZ
24 feb 2014 19:04:55

continuiamo questa discussione nella chat

Mayeenul Islam Mayeenul Islam
24 feb 2014 19:25:03
Mostra i restanti 3 commenti