Come ottenere il contenuto del post chiamando ajax?
Sto lavorando su un plugin. Ho un custom post type team
. Il custom post ha quattro articoli di diverse categorie. Ho usato questo codice per inviare l'ID del post di ciascuno usando ajax.
$(document).ready(function () {
$(".post_thumbnail").click(function () {
var id_post = $(this).attr('post_id');
$.ajax({
type: 'POST',
url: "<?php echo plugin_dir_url(__FILE__).'post-content.php';?>",
data: {
'post_id': id_post
}, success: function (result) {
alert(result);
},
error: function () {
alert("errore");
}
});
});
});
Sto inviando con successo l'ID e lo sto anche ricevendo. Per ottenere l'ID il mio codice è:
if(isset($_POST['post_id'])) {
echo $id=$_POST['post_id'];
}
ma non riesco a visualizzare il contenuto di ogni post. Come posso visualizzare il contenuto di ciascun post? Ho provato del mio meglio ma non ci riesco. Qualsiasi aiuto sarà molto apprezzato.
Innanzitutto, dovresti sempre utilizzare i metodi AJAX di WordPress, non una funzione personalizzata per questo. Consulta AJAX nei Plugin nel Codex.
Con questa pratica in mente, puoi configurare la tua richiesta in questo modo. Cambia l'URL AJAX in
<?php echo admin_url('admin-ajax.php'); ?>
e aggiungi la chiave 'action':
con il valore del nome della specifica funzione WordPress che vuoi venga eseguita nel passaggio successivo, quando il server riceve i tuoi dati.
$(".post_thumbnail").click(function () {
var id_post = $(this).attr('post_id');
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php'); ?>',
data: {
'post_id': id_post,
'action': 'f711_get_post_content' //questo è il nome del metodo AJAX chiamato in WordPress
}, success: function (result) {
alert(result);
},
error: function () {
alert("error");
}
});
});
Ora dobbiamo dire a WordPress cosa fare quando qualcuno chiama f711_get_post_content
.
Registra l'Azione in WordPress AJAX. Questo viene fatto nelle funzioni del tuo Plugin. La prima parte ('wp_ajax_') serve per dire a WordPress che questa è un'azione AJAX, e la parte dopo è il nome dell'azione ('f711_get_post_content'). Il secondo argomento è la funzione che WordPress esegue quando questa azione viene chiamata.
add_action( 'wp_ajax_f711_get_post_content', 'f711_get_post_content_callback' );
// Se vuoi che anche gli utenti non loggati possano utilizzare questa funzione, registrala anche con questa funzione:
add_action( 'wp_ajax_nopriv_f711_get_post_content', 'f711_get_post_content_callback' );
Dopodiché crei la tua funzione di callback. Ricorda di SEMPRE terminare (die()) le tue funzioni AJAX. Se la tua funzione restituisce JSON, cosa che consiglio, puoi terminare la funzione utilizzando wp_send_json( $array );
, che include già die()
.
function f711_get_post_content_callback() {
// recupera post_id e sanificalo per aumentare la sicurezza
$post_id = intval($_POST['post_id'] );
// Controlla se l'input era un intero valido
if ( $post_id == 0 ) {
echo "Input non valido";
die();
}
// ottieni il post
$thispost = get_post( $post_id );
// controlla se il post esiste
if ( !is_object( $thispost ) ) {
echo 'Non esiste alcun post con l\'ID ' . $post_id;
die();
}
echo $thispost->post_content; //Forse vorresti fare echo di wpautop( $thispost->post_content );
die();
}
Questa sarebbe la versione consigliata con JSON. Ti permette di passare multiple variabili al client.
function f711_get_post_content_callback() {
// recupera post_id e sanificalo per aumentare la sicurezza
$post_id = intval($_POST['post_id'] );
// Controlla se l'input era un intero valido
if ( $post_id == 0 ) {
$response['error'] = 'true';
$response['result'] = 'Input non valido';
} else {
// ottieni il post
$thispost = get_post( $post_id );
// controlla se il post esiste
if ( !is_object( $thispost ) {
$response['error'] = 'true';
$response['result'] = 'Non esiste alcun post con l\'ID ' . $post_id;
} else {
$response['error'] = 'false';
$response['result'] = wpautop( $thispost->post_content );
}
}
wp_send_json( $response );
}

Per tutti coloro che trovano questa risposta: date un'occhiata all'API REST di WordPress che è molto più semplice da usare. Non avete bisogno di tutta la parte PHP menzionata in questa risposta.
