Возможно ли использовать wp_localize_script для создания глобальных JS переменных без привязки к конкретному скрипту?
Можно ли как-то использовать wp_localize_script() для создания глобальных javascript переменных без привязки к конкретному идентификатору скрипта, чтобы они были доступны во всех js файлах, даже если скрипты не были корректно подключены через wp_enqueue_script?
Вот код, который я использую, создающий переменную для идентификатора 'ajaxscript', поэтому я не могу получить доступ к объекту 'ajaxobject' в js файле, который подключается напрямую в header.php через <script src="xxx" .... />
wp_register_script( 'ajaxscript', get_bloginfo( 'template_url' ) . '/js/ajaxscript.js', array(), $version );
wp_enqueue_script( 'ajaxscript' );
wp_localize_script( 'ajaxscript', 'ajaxobject',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'itr_ajax_nonce' )
)
);

Вместо использования wp_localize_script в данном случае, вы можете подключить свои JavaScript-переменные через wp_head, таким образом они будут доступны для всех JS-файлов. Например:
function my_js_variables(){ ?>
<script type="text/javascript">
var ajaxurl = '<?php echo admin_url( "admin-ajax.php" ); ?>';
var ajaxnonce = '<?php echo wp_create_nonce( "itr_ajax_nonce" ); ?>';
</script><?php
}
add_action ( 'wp_head', 'my_js_variables' )
Также для повышения надежности рекомендуется использовать wp_json_encode() для данных.
add_action ( 'wp_head', 'my_js_variables' );
function my_js_variables(){ ?>
<script type="text/javascript">
var ajaxurl = <?php echo wp_json_encode( admin_url( "admin-ajax.php" ) ); ?>;
var ajaxnonce = <?php echo wp_json_encode( wp_create_nonce( "itr_ajax_nonce" ) ); ?>;
var myarray = <?php echo wp_json_encode(
array(
'foo' => 'bar',
'available' => TRUE,
'ship' => array( 1, 2, 3, ),
)
); ?>
</script>
<?php
}

Вы можете экспортировать любые данные в хуке wp_head
, как показано в примерах выше. Однако следует использовать json_encode
для подготовки PHP-данных к экспорту в JS, вместо того чтобы пытаться вставлять сырые значения в JS-литералы:
function my_js_variables(){
?>
<script>
var ajaxurl = <?php echo json_encode( admin_url( "admin-ajax.php" ) ) ?>;
var ajaxnonce = <?php echo json_encode( wp_create_nonce( "itr_ajax_nonce" ) ) ?>;
var myarray = <?php echo json_encode( array(
'food' => 'bard',
'bard' => false,
'quux' => array( 1, 2, 3, ),
) ) ?>;
</script>
<?php
}
add_action ( 'wp_head', 'my_js_variables' )
Использование json_encode
упрощает вашу работу и предотвращает случайные синтаксические ошибки, если ваша строка содержит кавычки. Что еще важнее, json_encode
защищает от XSS-атак.

В итоге я сделал так. Теперь это работает !! Спасибо @dot1
function itr_global_js_vars() {
$ajax_url = 'var itrajaxobject = {"itrajaxurl":"'. admin_url( 'admin-ajax.php' ) .'", "itrajaxnonce":"'. wp_create_nonce( 'itr_ajax_nonce' ) .'"};';
echo "<script type='text/javascript'>\n";
echo "/* <![CDATA[ */\n";
echo $ajax_url;
echo "\n/* ]]> */\n";
echo "</script>\n";
}
add_action( 'wp_head', 'itr_global_js_vars' );

Хотя это не самая изящная реализация, вот ещё один простой способ передачи данных в ответ:
<?php
/**
* Добавляет данные в глобальный контекст.
*
* @param string $name
* @param mixed $value
* @return mixed|array
*/
function global_js($name = null, $value = null)
{
static $attached = false;
static $variables = [];
if (! $attached) {
$provide = function () use (&$variables) {
if (! empty($variables)) {
echo("<script type=\"text/javascript\">\n\n");
foreach ($variables as $name => $value) {
echo(" window['$name'] = JSON.parse('".json_encode($value)."');\n");
unset($variables[$name]);
}
echo("\n</script>\n");
}
};
add_action('wp_print_scripts', $provide, 0);
add_action('wp_print_footer_scripts', $provide, 0);
$attached = true;
}
if (is_null($name) && is_null($value)) {
return $variables;
}
return $variables[$name] = $value;
}
Добавление JS данных в контекст window:
<?php
global_js('fruits', ['apple', 'peach']);
// результат: `window['fruits'] = JSON.parse('["apple", "peach"]');`
Это будет работать как для скриптов в шапке, так и в подвале сайта, без дублирования.
