web-dev-qa-db-fra.com

Comment puis-je passer une variable à l'action wp_ajax?

J'écris un plugin qui extrait les données d'une API externe et les insère dans une rubrique bbPress. Voici un exemple de code:

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

Je n'arrive pas à comprendre comment passer $the_issue_key dans la fonction get_ajax_content. J'ai essayé de le définir en tant que global (frisson) mais il renvoie toujours null.

$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true); exécuté dans la fonction get_ajax_content renvoie null.

Y a-t-il quelque chose de spécifique à une action wp_ajax que je pourrais avoir besoin de savoir - ou est-ce que je manque quelque chose de vraiment évident?

3
Finne

Vous devez définir la valeur de la variable sur la page pour que javascript puisse la renvoyer à PHP à l'aide de ajax. Les fonctions Ajax constituent un "chargement de page" complètement séparé, donc même si vous l'avez rendu global, cela ne fonctionnera pas. La meilleure façon de procéder consiste à utiliser "wp_localize_script" ( https://codex.wordpress.org/Function_Reference/wp_localize_script )

Voici un exemple complet de la façon dont vous pourriez le faire:

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

Et ensuite, dans votre fichier javascript, faites quelque chose comme ça:

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

    });

});
6
Phil Johnston