Cum pot transmite o variabilă la acțiunea wp_ajax?

14 apr. 2015, 21:54:46
Vizualizări: 15.7K
Voturi: 3

Scriu un plugin care preia date dintr-un API extern și le inserează într-un subiect bbPress. Iată un exemplu de cod:

function bbp_ajax() {
    $topic_id = bbp_get_topic_id();
    $the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true);
    $nonce = wp_create_nonce( 'theNonce' );

    // Cod jQuery AJAX, acțiuni bbpAjax...
}
add_action ( 'bbp_template_before_replies_loop', 'bbp_ajax');

function get_ajax_content() {
    check_ajax_referer( "theNonce" );
    $api_url = get_option( 'jifbs_url' );
    $fullurl = $api_url.$the_issue_key;

    $username = get_option( 'jifbs_username' );

    // Apoi preiau datele cu cURL și le afișez. Dar am nevoie de $the_issue_key pentru autentificarea API
}

add_action( 'wp_ajax_bbpAjax', 'get_ajax_content' );
add_action( 'wp_ajax_nopriv_bbpAjax', 'get_ajax_content' );

Nu reușesc să transmit $the_issue_key în funcția get_ajax_content. Am încercat să o seteaz ca global (îngrozitor) dar întotdeauna returnează null.

$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true); rulat în funcția get_ajax_content returnează null.

Există ceva specific la o acțiune wp_ajax pe care ar trebui să știu - sau uit ceva evident?

0
Toate răspunsurile la întrebare 1
2

Va trebui să plasați valoarea variabilei pe pagină astfel încât JavaScript să o poată transmite înapoi către PHP folosind ajax. Funcțiile ajax sunt o "încărcare de pagină" complet separată, așa că chiar dacă ați făcut variabila globală, nu va funcționa. Cel mai bun mod de a face acest lucru este folosind "wp_localize_script" (https://codex.wordpress.org/Function_Reference/wp_localize_script)

Iată un exemplu complet despre cum ați putea face acest lucru:

// Mai întâi încărcați JavaScript-ul în WordPress
    function your_prefix_enqueue_scripts(){

        // Încărcați JavaScript-ul (acest cod presupune că fișierul JavaScript este în directorul "includes/js" al plugin-ului)
        wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );

        // SAU (mai simplu dar nu recomandat)  
        wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );

        // Aici creăm o variabilă obiect JavaScript numită "youruniquejs_vars". Putem accesa orice variabilă din array folosind youruniquejs_vars.nume_sub_variabilă
        wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', 
            array(
                // Pentru a folosi această variabilă în JavaScript folosiți "youruniquejs_vars.ajaxurl"
                'ajaxurl' => admin_url( 'admin-ajax.php' ),
                // Pentru a folosi această variabilă în JavaScript folosiți "youruniquejs_vars.the_issue_key"
                'the_issue_key' => $the_issue_key,

            ) 
        );  

    }
    add_action( 'wp_enqueue_scripts', 'your_prefix_enqueue_scripts' );

    // Aceasta este funcția dvs. de callback pentru Ajax
    function your_ajax_callback_function_name(){

        // Preluați datele postate 
        $the_issue_key = $_POST["the_issue_key"];

        // Faceți ce aveți nevoie aici

        // Creați array-ul pe care îl trimitem înapoi către JavaScript
        $array_we_send_back = array( 'test' => "Test" );

        // Asigurați-vă că codificați ieșirea în json pentru că acesta este ceea ce se așteaptă
        echo json_encode( $array_we_send_back );

        // Asigurați-vă că încheiați execuția după ce terminați cu ieșirea ajax.
        die(); 

    }
    add_action( 'wp_ajax_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
    add_action( 'wp_ajax_nopriv_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );

Și apoi în fișierul dvs. JavaScript faceți ceva de genul acesta:

jQuery(document).ready(function($){

    /**
     * Când este apăsat trigger-ul pentru ajax
     *
     */
    $( document ).on( 'click', '.my-button', function(event){

        event.preventDefault();

        // Folosiți ajax pentru a face ceva...
        var postData = {
            action: 'your_ajax_callback_function_name',
            the_issue_key: youruniquejs_vars.the_issue_ke,
        }

        // Încărcați mai multe postări prin Ajax
        $.ajax({
            type: "POST",
            data: postData,
            dataType:"json",
            url: youruniquejs_vars.ajaxurl,
            // Acest cod se execută când ajax-ul 'revine' și este json valid
            success: function (response) {

                alert( response.test );

            }
            // Acest cod se execută când ajax-ul 'revine' dar nu este json valid
        }).fail(function (data) {
            console.log(data);
        }); 

    });

});
14 apr. 2015 22:23:16
Comentarii

Aproape am terminat, mulțumesc foarte mult :) Poți să îmi clarifici un lucru, te rog? În funcția de callback, să zicem $the_issue_key = "12345" - am dificultăți în a transmite această valoare către array-ul youruniquejs_vars și întotdeauna returnează null.

Finne Finne
15 apr. 2015 17:50:28

Trebuie să aplici valoarea "12345" când facem "wp_localize_script"

    `wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', array('ajaxurl' => admin_url( 'admin-ajax.php' ),'the_issue_key' => "12345",) );`

(Scuze pentru formatare aici... nu reușesc să o fac să "arate bine")

Phil Johnston Phil Johnston
15 apr. 2015 17:56:07