JS文件中的PHP常量

Obm*_*nen 6 javascript php wordpress constants

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

在插件开发期间,我包含了一个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__)) ?>";
Run Code Online (Sandbox Code Playgroud)

结果:

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.. "
Run Code Online (Sandbox Code Playgroud)

所以我的测试向我展示了MAGIC CONSTANTS的工作原理,但任何WP常数都不可用.

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

有趣的是 - 不仅CONSTANTS不可用 - 但 任何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');
Run Code Online (Sandbox Code Playgroud)

你可以想象两者都是平等的 - 但问题仍然存在:那些有点硬编码(如@Salman A)建议 - 如果插件的目录发生变化怎么办?在那种情况下解决方案是什么?

请注意,既wp-load.phpwp-config.php我的工作.我不知道什么是更好或哪些可以提出一些安全问题.

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

一句话:这个解决方案只是TEMP,直到我找到正确的答案.我的插件是通过WORDPRESS插件mechanisem(enqueue_script()/ register_script()/ init()等来加载的.) - 因此我无法理解它为什么这样做.现在它的工作方式如上所述.

Mat*_*man 4

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

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

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

编辑

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

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

来源

  • 尝试对“wp-load.php”文件的路径进行硬编码,如下所示:“include('/var/www/whatever/somedomain.com/wordpress/wp-load.php');” (2认同)

归档时间:

查看次数:

1527 次

最近记录:

13 年,8 月 前