¿Cómo puedo pasar una variable a la acción wp_ajax?

2

Estoy escribiendo un complemento que extrae datos de una API externa y los inserta en un tema de bbPress. Aquí hay un código de ejemplo:

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

    // jQuery AJAX Code, actions 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' );

    // Then I pull in the data with cURL and echo it. But I need $the_issue_key to complete the API auth
}

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

No puedo averiguar cómo pasar $the_issue_key a la función get_ajax_content . He intentado configurarlo como global (estremecimiento) pero siempre devuelve nulo.

$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true); se ejecuta en la función get_ajax_content devuelve nulo.

¿Hay algo específico a una acción wp_ajax que pueda necesitar saber o me falta algo realmente obvio?

    
pregunta Finne 14.04.2015 - 20:54

1 respuesta

5

Necesitaría poner el valor de la variable en la página para que javascript pueda volver a PHP usando ajax. Las funciones Ajax son una "carga de página" completamente separada, por lo que incluso si lo hace global, no funcionará. La mejor manera de hacerlo es usar "wp_localize_script" ( enlace )

Aquí hay un ejemplo completo de cómo podría hacerlo:

//First enqueue your javascript in WordPress
    function your_prefix_enqueue_scripts(){

        //Enqueue your Javascript (this assumes your javascript file is located in your plugin in an "includes/js" directory)
        wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );

        //OR (simpler but not recommended)  
        wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );

        //Here we create a javascript object variable called "youruniquejs_vars". We can access any variable in the array using youruniquejs_vars.name_of_sub_variable
        wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', 
            array(
                //To use this variable in javascript use "youruniquejs_vars.ajaxurl"
                'ajaxurl' => admin_url( 'admin-ajax.php' ),
                //To use this variable in javascript use "youruniquejs_vars.the_issue_key"
                'the_issue_key' => $the_issue_key,

            ) 
        );  

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

    //This is your Ajax callback function
    function your_ajax_callback_function_name(){

        //Get the post data 
        $the_issue_key = $_POST["the_issue_key"];

        //Do your stuff here

        //Create the array we send back to javascript here
        $array_we_send_back = array( 'test' => "Test" );

        //Make sure to json encode the output because that's what it is expecting
        echo json_encode( $array_we_send_back );

        //Make sure you die when finished doing ajax output.
        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' );

Y luego, en tu archivo javascript, haz algo como esto:

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

    /**
     * When your ajax trigger is clicked
     *
     */
    $( document ).on( 'click', '.my-button', function(event){

        event.preventDefault();

        // Use ajax to do something...
        var postData = {
            action: 'your_ajax_callback_function_name',
            the_issue_key: youruniquejs_vars.the_issue_ke,
        }

        //Ajax load more posts
        $.ajax({
            type: "POST",
            data: postData,
            dataType:"json",
            url: youruniquejs_vars.ajaxurl,
            //This fires when the ajax 'comes back' and it is valid json
            success: function (response) {

                alert( response.test );

            }
            //This fires when the ajax 'comes back' and it isn't valid json
        }).fail(function (data) {
            console.log(data);
        }); 

    });

});
    
respondido por el Phil Johnston 14.04.2015 - 21:23

Lea otras preguntas en las etiquetas