2012-03-14 44 views
6

我面臨一個我無法理解的問題。JS文件裏面的PHP常量

在插件開發過程中,我包含一個file.js.php(register/enqueue)。

<? 
/* 
File.js.php 
*/ 
Header("content-type: application/javascript"); 
$path = constant('WP_PLUGIN_DIR'); //test with function 
$path_2 = WP_PLUGIN_DIR; // test directly 
//can cause a problem with older browsers?? use text/javascript 
?> 
//////////////////// Begin Tests //////////// 
var templateDir = "<?php echo WP_PLUGIN_URL ?>" ; 
var templateDir2 = "<?php echo $path ?>" ; 
var templateDir3 = "<?php echo $path_2 ?>" ; 
var templateDir4 = "<?php echo constant("WP_PLUGIN_URL") ?>"; 
var templateDir5 = "<?php echo __FILE__ ?>"; 
var templateDir6 = "<?php echo plugins_url('somedir/somefile.png' , dirname(__FILE__)) ?>"; 

結果:

var templateDir = "WP_PLUGIN_URL" ; // simply outputs a string of the constant name 
var templateDir2 = "" ; // null or empty 
var templateDir3 = "WP_PLUGIN_DIR" ;// simply outputs a string of the constant name 
var templateDir4 = "//Warning: constant() Couldn't find constant WP_PLUGIN_URL in .." 
var templateDir5 = "path.to.js.php" // only one that works ; 
var templateDir6 = "Call to undefined function plugins_url() in.. " 

所以我的測試表明我說,魔術常量工作,但任何WP常數將不可用。

這包括在plugin.php(實際上這就是爲什麼我甚至開始測試WP常數的原因)

足夠有趣的是宣稱我自己的常量 - 不僅常量是不可用的 - 但任何WP功能正在返回「不可用」。

PHP常量是通過應用程序在任何時候都可用。 這是一個WP特定的問題?那是故意的嗎?還是我做錯了什麼?

注:我知道有其他的方法來做到這一點(如使用localize_script將變量傳遞給JS - 或者只是用一個函數來輸出頭中的路徑) - 但首先 - 這些方法都不理想對我來說 - 更重要的是,我想知道爲什麼這種方法失敗...

編輯我:

Althouh @馬特貝克曼在正確的方向指出了具體的方法沒有奏效。 確實必須包含來自WP的文件。 對我來說,這兩個以下工作:

include("../../../../wp-load.php"); 
require_once (dirname(dirname(dirname(dirname(dirname (__FILE__))))).'/wp-load.php'); 

兩個,你可以想像是相等的 - 但問題仍然存在:這些都有點硬編碼(如@Salman A)建議 - 什麼如果plugin's目錄的變化?這種情況下的解決方案是什麼?

請注意,wp-load.phpwp-config.php都適合我。我不知道什麼更好,哪些可能會帶來一些安全問題。

,但我想這是另外一個問題..

底線:這個解決方案是,直到我會找到正確的答案只有TEMP。我的插件通過WORDPRESS插件mechanisem(enqueue_script()/ register_script()/ init()等)加載 - 因此我無法理解它爲什麼這樣做。現在它工作如上所述。

+1

難道你需要'包括'或'需要'一些文件,然後才能在你的應用中引用wordpress函數/常量? – 2012-03-14 06:42:17

+0

好問題..正是我想知道的。如果是的話 - 哪些? – 2012-03-14 06:44:32

+0

這會幫助你。 - http://codeblow.com/questions/php-within-js-file-wordpress/ - http://stackoverflow.com/questions/6260902/how-to-pass-variable-from-php-template-to- javascript - http://stackoverflow.com/questions/6401297/php-constants-in-a-javascript-file - http://stackoverflow.com/questions/6808221/php-within-js-file-wordpress – Milap 2012-03-14 06:34:13

回答

4

由於這是包含像JavaScript一樣,您的file.js.php需要引用Wordpress庫來訪問這些常量。目前,正如你的代碼所代表的那樣,它沒有任何對這些常量的引用。

__FILE__不需要訪問Wordpress中的任何內容,這就是爲什麼它按預期工作。

您將需要包含一些requireinclude語句引用您需要在file.js.php頂部的特定Wordpress PHP文件。

編輯

使用你的file.js.php文件的頂部下面去這些常量訪問:

$home_dir = preg_replace('^wp-content/plugins/[a-z0-9\-/]+^', '', getcwd()); 
include($home_dir . 'wp-load.php'); 

Source

+0

這是從問題本身理解:-)。真正的問題是爲什麼,以及如何使其工作。我看不出引用任何特定事物的真正原因 - 是JS稱爲BY wp - 並且來自wp函數。你能詳細說明究竟是什麼問題以及如何解決它? – 2012-03-14 06:43:40

+1

您正在調用由PHP構建的JavaScript文件。然而,這個調用是從你的瀏覽器直接傳到那個文件,它不是來自Wordpress PHP管道。當使用這些類型的PHP構建的JavaScript文件時,您需要引用PHP文件本身中的所有必需文件。 – 2012-03-14 06:46:13

+0

例如:如果您在瀏覽器中瀏覽到http://www.example.com/file.js.php,除非*明確*告訴它(使用'include'或'require'),否則這將永遠不會觸及Wordpress。 。其他的WordPress插件通過'index.php'包含在內,因此已經有了所有必需的引用。 – 2012-03-14 06:49:35