Cum să obții conținutul unei postări folosind ajax?

4 feb. 2016, 12:33:49
Vizualizări: 45K
Voturi: 12

Lucrez la un plugin. Am un tip de postare personalizată team. Postarea personalizată are patru articole din categorii diferite. Am folosit acest cod pentru a trimite ID-ul fiecărei postări folosind 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("error");
                }
            });

        });
    });

Am reușit cu succes să trimit ID-ul și să îl primesc. Pentru a obține ID-ul, codul meu este:

if(isset($_POST['post_id'])) {
    echo  $id=$_POST['post_id'];

}

dar nu reușesc să afișez conținutul fiecărei postări. Cum pot afișa conținutul fiecărei postări? Am încercat tot ce am putut dar nu am reușit. Orice ajutor ar fi foarte apreciat.

4
Comentarii

Posibil duplicat al Folosirea the_content în afara buclei

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

@StephenHarris Cred că e mai mult de atât - am postat un răspuns despre utilizarea corectă a AJAX în plugin-uri. Partea de obținere a conținutului nu este atât de importantă pe cât implementarea în WordPress în sine.

fischi fischi
4 feb. 2016 13:19:44

@fischi Am ratat faptul că au creat un endpoint personalizat și am interpretat întrebarea ca și cum ar fi implementat cu succes partea de AJAX (folosind soluția pe care ai postat-o) și aveau nevoie doar să obțină conținutul postului dintr-un ID.

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

Ar trebui să arunci o privire la WordPress REST API. Poți obține cu ușurință conținutul fără toate elementele PHP din răspunsul de mai jos.

maysi maysi
10 ian. 2019 13:34:05
Toate răspunsurile la întrebare 1
2
17

În primul rând, ar trebui să folosești întotdeauna metodele AJAX din WordPress, nu o funcție personalizată pentru asta. Vezi AJAX în Plugin-uri în Codex.

Cu această practică în minte, poți configura cererea astfel. Schimbă URL-ul AJAX în

<?php echo admin_url('admin-ajax.php'); ?> 

și adaugă cheia 'action': cu valoarea numelui funcției specifice WordPress pe care vrei să fie executată în pasul următor, când partea de server primește datele tale.

$(".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' //acesta este numele metodei AJAX apelate în WordPress
        }, success: function (result) {

           alert(result);
        },
        error: function () {
            alert("error");
        }
    });

});

Acum trebuie să-i spunem WordPress ce să facă atunci când cineva apelează f711_get_post_content.

Înregistrează Acțiunea în AJAX-ul WordPress. Acest lucru se face în funcțiile Pluginului tău. Prima parte ('wp_ajax_') este pentru a-i spune WordPress că aceasta este o acțiune AJAX, iar partea de după aceea este numele acțiunii ('f711_get_post_content'). Al doilea argument este funcția pe care WordPress o execută când această acțiune este apelată.

add_action( 'wp_ajax_f711_get_post_content', 'f711_get_post_content_callback' );
// Dacă vrei ca și utilizatorii nelogati să poată folosi această funcție, înregistreaz-o din nou cu această funcție:
add_action( 'wp_ajax_nopriv_f711_get_post_content', 'f711_get_post_content_callback' );

După aceea creezi funcția ta de callback. Amintește-ți să ÎNTOTDEAUA die() funcțiile tale AJAX. Dacă funcția ta returnează JSON, ceea ce aș recomanda, poți încheia funcția folosind wp_send_json( $array );, care are integrat die().

function f711_get_post_content_callback() {

    // preia post_id și sanitizează-l pentru a îmbunătăți securitatea
    $post_id = intval($_POST['post_id'] );

    // Verifică dacă input-ul a fost un întreg valid
    if ( $post_id == 0 ) {
        echo "Input Invalid";
        die();
    }

    // obține postarea
    $thispost = get_post( $post_id );

    // verifică dacă postarea există
    if ( !is_object( $thispost ) ) {
        echo 'Nu există nicio postare cu ID-ul ' . $post_id;
        die();
    }

    echo $thispost->post_content; //Poate vrei să folosești wpautop( $thispost->post_content );

    die();

}

Aceasta ar fi versiunea recomandată cu JSON. Îți permite să transmiți mai multe variabile înapoi către client.

function f711_get_post_content_callback() {

    // preia post_id și sanitizează-l pentru a îmbunătăți securitatea
    $post_id = intval($_POST['post_id'] );

    // Verifică dacă input-ul a fost un întreg valid
    if ( $post_id == 0 ) {

        $response['error'] = 'true';
        $response['result'] = 'Input Invalid';

    } else {

        // obține postarea
        $thispost = get_post( $post_id );

        // verifică dacă postarea există
        if ( !is_object( $thispost ) ) {

            $response['error'] = 'true';
            $response['result'] =  'Nu există nicio postare cu ID-ul ' . $post_id;

        } else {

            $response['error'] = 'false';
            $response['result'] = wpautop( $thispost->post_content );

        }

    }

    wp_send_json( $response );

}
4 feb. 2016 13:18:20
Comentarii

Pentru toți cei care găsesc acest răspuns: aruncați o privire la WordPress REST API, care este mult mai ușor de utilizat. Nu aveți nevoie de toate elementele PHP menționate în acest răspuns.

maysi maysi
10 ian. 2019 13:36:11

Bună, am folosit admin-ajax.php dar din cauza securității firewall-ului primesc eroarea 403 deoarece apelează wp-admin în frontend.

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