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.

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.

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

Puoi essere in the loop per una chat con me?

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

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.

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.

continuiamo questa discussione nella chat
