PHP константа внутри файла JS - PullRequest
6 голосов
/ 14 марта 2012

Я столкнулся с проблемой, которую не могу понять.

Во время разработки плагина я включаю файл .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 (фактически, это причина, почему я даже начал тестировать константы 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');

Оба, как вы можете себе представить, одинаковы - но проблема остается: они несколько жестко запрограммированы (как @Salman A) - что, если dir плагина изменится ?? какое решение в этом случае?

Обратите внимание, что оба wp-load.php и wp-config.php работали для меня. Я не знаю, что лучше или что может представлять некоторые проблемы безопасности.

но я думаю, что это для другого вопроса ..

Итог: это решение - только ТЕМП, пока я не найду правильный ответ. Мой плагин загружается с помощью механизма плагинов WORDPRESS (enqueue_script () / register_script () / init () и т. Д.), И поэтому я не могу понять, почему это так. Но пока он работает, как описано выше.

1 Ответ

4 голосов
/ 14 марта 2012

Поскольку он включен как JavaScript, ваш file.js.php должен ссылаться на библиотеку Wordpress для доступа к этим константам.В настоящее время ваш код не имеет ссылок на эти константы.

__FILE__ не требует доступа к чему-либо из Wordpress, поэтому он работает как положено.

Выпотребуется добавить несколько require или include операторов, ссылающихся на конкретные файлы Wordpress PHP, которые вам нужны, в верхней части file.js.php.

Edit

Использоватьследующий в верхней части вашего файла file.js.php, чтобы получить доступ к этим константам:

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

Источник

...