【问题标题】:PHP constant inside JS fileJS文件中的PHP常量
【发布时间】:2012-03-30 14:50:06
【问题描述】:

我遇到了一个我无法理解的问题。

在插件开发过程中,我包含了一个 file.js.php(注册/入队)。

<?
/* 
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 CONSTANTS 可以工作,但是任何 WP CONSTANT 都将不可用。

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

很有趣 - 不仅 CONSTANTS 不可用 - 而且任何 wp 函数都返回“不可用”。

PHP 常量旨在始终通过应用程序可用。 这是 WP 特有的问题吗?这是故意的吗?还是我做错了什么?

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

编辑我:

尽管@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() / init() etc..) - 因此我无法理解它为什么这样做.. 但现在它的工作原理如上所述。

【问题讨论】:

标签: php javascript constants wordpress


【解决方案1】:

因为它像 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');

Source

【讨论】:

  • 这是从问题本身理解的:-)。真正的问题是为什么,以及如何让它发挥作用。我看不出引用任何特定事物的真正原因 - 即 tha JS 是由 wp 调用的 - 并且来自 wp 函数。您能否详细说明问题到底是什么以及如何解决?
  • 您正在调用由 PHP 构建的 JavaScript 文件。但是,调用是从您的浏览器直接发送到该文件的,它不是来自 Wordpress PHP 管道。在使用这些类型的 PHP 构建的 JavaScript 文件时,您需要在 PHP 文件本身中引用所有必需的文件。
  • 示例:如果您在浏览器中浏览到 example.com/file.js.php,除非您明确告诉它(使用 includerequire),否则它甚至不会触及 Wordpress .其他 Wordpress 插件通过 index.php 包含在内,因此已经包含所有必需的参考。
  • 好吧 - 我认为从 "enqueue_script" 和 "register_script" 调用确实使它成为 wp pipline 的一部分。它是使用 init() 函数包含的。但无论如何 - 如果确实如此 - 我需要包含哪些文件??
  • 尝试像这样对wp-load.php文件的路径进行硬编码:include('/var/www/whatever/somedomain.com/wordpress/wp-load.php');
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2019-08-14
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多