JS文件中的PHP常量


PHP constant inside JS file

我面临一个我无法理解的问题。

在插件开发过程中,我包含了一个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.. "

所以我的测试表明MAGIC常量有效,但任何WP常量都不可用。

这包括在plugin.php中声明的MYOWN常量(实际上这就是我开始测试WP常量的原因)

有趣的是,不仅常量不可用,而且任何wp函数都返回"不可用"

PHP常量意味着可以通过应用程序随时使用。。这是WP特有的问题吗?这是故意的吗?还是我做错了什么?

注意:我知道还有其他方法可以做到这一点(比如使用localize_script将变量传递给JS,或者只使用一个函数输出头中的路径)-但首先,这些方法对我来说并不理想-更重要的是,我想了解这个方法为什么失败。。。

编辑I:

Althouh@Matt Beckman指出了正确的方向,他的具体方法没有奏效。的确,必须包含WP的文件。对我来说,以下两项工作:

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

正如你所能想象的,两者都是相等的,但问题仍然存在:这些都有点硬编码(比如@Salman A)的建议——如果插件的目录发生了变化怎么办??在这种情况下,解决方案是什么?

请注意,wp-load.phpwp-config.php对我都有效。我不知道什么更好,或者哪一种会带来一些安全问题。

但我想这是另一个问题。。

一句话:在我找到正确答案之前,这个解决方案只是TEMP。我的插件是通过WORDPRESS插件机制加载的(enqueue_script()/register_script。

由于这是像JavaScript一样包含的,您的file.js.php需要引用Wordpress库才能访问这些常量。目前,就您的代码而言,它没有任何对这些常量的引用。

__FILE__不需要访问Wordpress的任何内容,这就是它按预期工作的原因。

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

编辑

使用file.js.php文件顶部的以下内容可以访问这些常量:

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