WordPress.org

Make WordPress Core

Opened 6 months ago

#46334 new defect (bug)

wp_localize_script did not output anything in wp_print_footer_scripts hook although document suggested that it should be working

Reported by: simongcc Owned by:
Milestone: Awaiting Review Priority: normal
Severity: major Version: 4.9.8
Component: Script Loader Keywords:
Focuses: Cc:

Description

Note: it should be WordPress 4.9.9 but the version list did not provide this option

According to this page, there is a statement showing that the "localize" can be achieved at the last chance hook "wp_print_footer_scripts"
https://codex.wordpress.org/Function_Reference/wp_localize_script

The last chance to localize your script would then be on the 'wp_print_footer_scripts' hook.

However, I have tried the following code, it did not showing up. I tried to trace back the original localize() function and even looking into the WP_Dependencies class, I only find that it is added to the queue for localize() but it is gone at print_extra_script() stage. Cannot find out the exact reason, maybe due to the enqueue process and timing is only allowed to be used in the "wp_enqueue_script" hook.

The following is working.

<?php
function theme_enqueue_scripts() {
    wp_enqueue_script( 'handle_name_js', SOMEWHERE . '/js/custom.js', array( 'jquery' ), false, true);
    wp_localize_script( 'handle_name_js', 'memberMeta', array('member' => 'list') );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_scripts', 12 );

Since my page have a variable appear almost end of the page so I need to localize it in later time and considered "wp_print_footer_scripts" hook, so I tried like this:
Adding the handle first and localize it in later time.

<?php
function theme_enqueue_scripts() {
    wp_enqueue_script( 'handle_name_js', SOMEWHERE . '/js/custom.js', array( 'jquery' ), false, true);
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_scripts', 12 );

function set_member_meta() {
    global $team_member_meta;
    // var_dump() something here, proved that this function is called and got the variable
    // where $team_member_meta is as simple as even array('1234') or array('member' => 'list') 

    // tried also putting here but not working as well, the handle is also being queued but gone in output
    // wp_enqueue_script( 'handle_name_js', SOMEWHERE . '/js/custom.js', array( 'jquery' ), false, true);
    // did not output anything
    wp_localize_script( 'handle_name_js', 'memberMeta', $team_member_meta );
}
add_action( 'wp_print_footer_scripts', 'set_member_meta', 20 );

I have traced through core, the handle data is added actually.
But it is out of my ability to trace the exact point of problem because it is pointing from a to b and b to c with many checking or modifiers, I am not familiar enough with the core nor have enough debugging technique in dealing with wordpress hooks.

I run the above code inside functions or functions required php files in theme folder.
Because it is not working as expected nor as suggested in the document and the trace of the code is also showing that the handle is finally gone before using it. So I think it is possibly a bug.

Change History (0)

Note: See TracTickets for help on using tickets.