8

In a .js-file, I need to get the template-directory of a Wordpress theme, i.e. I need to get the return-value of <?php bloginfo('template_directory');?> within the js-file.

The idea is something like:

var blogTemplateDir = "<?php bloginfo('template_directory');?>";

How can this be achieved? What is the standard (Wordpress) way of doing this?

Ben
  • 15,938
  • 19
  • 92
  • 138

4 Answers4

15

Wordpress offers a wp_localize_script() function that allows you to pass a PHP array to a .js file when you register it with Wordpress.

It works like this

1) Register your script with Wordpress using wp_register_script(); Build an array of your parameters that you want to send to the script.

wp_enqueue_script('my-script','/path/to/script.js');

2) Build an array of your parameters that you want to send to the script.

$params = array('foo' => 'bar','setting' => 123);

3) Call wp_localize_script() and give your parameters a unique name.

wp_localize_script( 'my-script', 'MyScriptParams', $params );

4) You can access the variables in JavaScript as follows:

<script>
alert(object_name.some_string);
</script>

Note: you need to use wp_enqueue_script() when you want Wordpress to incluse the JavaScript file in the header.

Pulling it all together

<?php
$myPlugin = new MyPlugin();

//Add some JS to the admin section
add_action('admin_enqueue_scripts', array($myPlugin, 'adminJavaScript'));

class MyPlugin{

        public function adminJavaScript() {

        $settings = array(
            'foo' => 'bar',
            'setting' => 123
        );

        wp_register_script('myJavaScriptName', plugins_url('/myJavaScript.min.js', __FILE__));
        wp_localize_script('myJavaScriptName', 'settings', $settings); //pass any php settings to javascript
        wp_enqueue_script('myJavaScriptName'); //load the JavaScript file
    }
}
?>

<script>
    alert(settings.foo);
</script>
Levi Putna
  • 2,863
  • 6
  • 30
  • 47
  • Excellent answer. I've been working with Wordpress for like 5 years and I didn't know about `wp_localize_script()`. I just used this technique in my current project and it worked flawlessly. This clearly seems to me to be the most correct way to do this. Thanks! – Chris Allen Lane Feb 06 '13 at 16:35
4

As Erik earlier posted, the file extension for the JavaScript-file is meaningless, as it in the end all comes down to the content. Upon encountering this situation during development, I found that I needed to add the following to the top of the so called JavaScript-file:

<?php

   //Let's set the header straight
   header('Content-type: text/javascript');

   //Get the WP-specifics, so that we can use constants and what not
   $home_dir = preg_replace('^wp-content/plugins/[a-z0-9\-/]+^', '', getcwd());
   include($home_dir . 'wp-load.php');
?>

This ensures that you get the definitions into your JavaScript-file, and you can use the example above with themes too (just make sure you change the /plugins into /themes instead).

karllindmark
  • 6,031
  • 1
  • 26
  • 41
  • Thank you, I was thinking if I do `` within header.php, why can't I access the value of `templateDir` within my .js-file. Is there a way to get this to work, caus then I could keep my js-files? – Ben Jul 24 '11 at 17:26
  • 1
    Well, are you setting `templateDir` before loading the other JavaScript-files? If so, it should be possible to use the variables in your js-files. `File 1 (index.php): http://pastebin.com/sQGnmM9S` `File 2 (javascript.js): http://pastebin.com/cnUv5inD` – karllindmark Jul 24 '11 at 18:07
  • Thank you, I had gotten the order wrong earlier. Now it works! :) – Ben Jul 24 '11 at 18:45
  • Thanks was sure how to import all the variables in JS. NB: For anyone else doing this in a theme, swap /plugins/ for /themes/ in the above code – Stephen Simpson Feb 07 '13 at 18:34
3

The file extension for a javascript file is meaningless. You can use PHP to output your javascript file just like you do HTML pages. Include the JS file as:

<script src="my_javascript_file.php"></script>

And then you can use the line from your question in your javascript file:

var blogTemplateDir = "<?php bloginfo('template_directory');?>";
Erik
  • 20,526
  • 8
  • 45
  • 76
  • Using `` leads to weird errors in other files. Don't ask me, it just kills my page. If I do `` instead, then it works. Also, if I follow this solution, I have to wrap all my js-code into ` – Ben Jul 24 '11 at 18:50
1

Wrap the .js in a .php file and just include it in your context.

Quasdunk
  • 14,944
  • 3
  • 36
  • 45