WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

So I've read a few tutorials on ajax and the codex documentation on it and I think I understand now how it is supposed to work, however it appears that wp_localize_script is not doing anything at all. According to what I've read in the codex and on various forums, the wp_localize_script should allow me to create a global object that an external javascript file can reference. But when I inspect the DOM in chrome it isn't there. My code is below

class Admin_Page extends Admin_Console {
static $add_script;

public static function init() {
    add_shortcode('CLADMIN', array(__CLASS__, 'handle_shortcode'));

    add_action('init', array(__CLASS__, 'register_script'));
    add_action('wp_footer', array(__CLASS__, 'print_script'));
    // add_action( 'wp_ajax_getData', 'data_response' );

static function data_response() {
//do stuff


public function register_script() {

    wp_enqueue_script('masterJS','/wp-content/plugins/AdminQuizConsole/js/master.js',     array('jquery','jquery-ui-core','jquery-effects-core'), true);
    wp_register_style( 'master', '/wp-content/plugins/AdminQuizConsole/css/master.css'     );

static function print_script() {
    if ( ! self::$add_script )

    wp_localize_script('masterJS', 'AjaxRequest', array( 'ajaxurl' => admin_url('admin-ajax.php') ) );



Now unless I'm mistaken according to what I see here the localize should be being called after the enqueue and therefore should add something like this to the DOM

/* <![CDATA[ */
var MyAjax = {
ajaxRequest: "http://example.com/wordpress/wp-admin/admin-ajax.php"
/* ]]> */ 

But that does not appear to be happening. Can someone please explain to me is there something I'm missing?


Got the above question working but admin-page now returns with a zero

public static function init() {
    add_shortcode('CLADMIN', array(__CLASS__, 'handle_shortcode'));

    add_action('wp_enqueue_scripts', array(__CLASS__, 'register_script'));
    // add_action('wp_footer', array(__CLASS__, 'print_script'));
     add_action( 'wp_ajax_nopriv_get_data', 'data_response' );

public function data_response() {

    global $wpdb;

    $user_id = $user_id = $user_id ? $user_id : get_current_user_id();
    $practiceKey = 'user_practice';

    //Get Practice
    $sql = $wpdb->prepare( "SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s", $user_id, $practiceKey );
    $sql3 = $wpdb->prepare( "SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s", $user_id, 'user_practice_level' );
    $practice = $wpdb->get_var( $sql );
    $usr_level = $wpdb->get_var( $sql3 );
    $db_name = $wpdb->prefix . 'plugin_slickquiz_scores';
    if($usr_level == 0){
        $get_data = $wpdb->prepare( "SELECT quiz_id,score,createdDate FROM $db_name WHERE usr = $user_id" );
        $results = $wpdb->get_results($get_data,ARRAY_A);
        $result_array = array();

        foreach ( $results as $value )
            $result_array[] = $value;
    } elseif ($usr_level == 1) {
        $get_data = $wpdb->prepare( "SELECT * FROM $db_name WHERE usr_practice = %s",$practice );
        $results = $wpdb->get_results($get_data,ARRAY_A);

        foreach ( $results as $value )
            $result_array[] = $value;
    } else {
        $result_array[] = (1);


    $data_encode = json_encode($result_array);

    header( "Content-Type: application/json" );
    echo $data_encode;


    function get_level() {

        $.post(AjaxRequest.ajaxurl, {action : "get_data"})
            .done(function( json ){

            .fail(function( jqxhr, textStatus, error){
                var err = textStatus + ', ' + error;
                console.log( 'Request Failed: ' + err);


The action name and the call back function seem to match up and it's being sent over post in case I wanted/needed to change the no_priv option.

I'm sure it's just something I'm missing but I've tested my output by taking the query out of the callback function and echoing it straight onto the page and it does return valid JSON so I'm not sure what I'm missing now.

share|improve this question
Thanks that really helped but even though now it is sending the ajax request it's always returning with a 0. I'm sorry if these are stupid questions but this is my first time developing for wordpress. EDIT - I updated my code – richbai90 Jun 22 '13 at 6:40
sorry figured that out, moved the add actions to the top of my init function and changed the callback to array(CLASS, 'data_response' Thanks again for your help – richbai90 Jun 22 '13 at 6:53
up vote 3 down vote accepted

Your timing is off. You are enqueueing script to echo in header, but you try to localize it long after the fact in footer.

You should be doing registration and localization in proper wp_enqueue_scripts hook (not init by the way).

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.