Come ottenere il contenuto del post chiamando ajax?

4 feb 2016, 12:33:49
Visualizzazioni: 45K
Voti: 12

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.

4
Commenti

Possibile duplicato di Usare the_content al di fuori del loop

Stephen Harris Stephen Harris
4 feb 2016 13:06:31

@StephenHarris Penso che vada oltre - ho pubblicato una risposta sull'uso corretto di AJAX nei plugin. La parte relativa all'ottenimento del contenuto non è così importante quanto l'implementazione in WordPress stesso.

fischi fischi
4 feb 2016 13:19:44

@fischi Mi era sfuggito il fatto che avessero creato un endpoint personalizzato e avevo interpretato la domanda nel senso che avessero implementato con successo la parte ajax (usando la soluzione che hai postato) e avessero semplicemente bisogno di recuperare il contenuto del post da un ID.

Stephen Harris Stephen Harris
4 feb 2016 13:54:02

Dovresti dare un'occhiata alla WordPress REST API. Puoi ottenere facilmente il contenuto senza tutto il codice php nella risposta qui sotto.

maysi maysi
10 gen 2019 13:34:05
Tutte le risposte alla domanda 1
2
17

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 );

}
4 feb 2016 13:18:20
Commenti

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.

maysi maysi
10 gen 2019 13:36:11

Ciao, ho usato admin-ajax.php ma a causa delle impostazioni di sicurezza del firewall sto ricevendo errore 403 poiché sta chiamando wp-admin nel frontend.

David Coder David Coder
3 mar 2021 07:32:58