Eliminare una riga da una tabella personalizzata in WordPress utilizzando AJAX
Dalla mia tabella personalizzata ($table = $wpdb->prefix . 'user_req';) sto visualizzando i dati con $wpdb->get_results() e un ciclo foreach:

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.
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');
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
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
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
Puoi essere in the loop per una chat con me?
Mayeenul Islam
@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
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
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
continuiamo questa discussione nella chat
Mayeenul Islam