2012-03-14 19 views
6

Me enfrenta a un problema que no puedo entender.Constante de PHP dentro del archivo JS

Durante el desarrollo de un plugin estoy incluyendo 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__)) ?>"; 

Resultados:

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.. " 

así que mis pruebas me mostraron que las constantes MAGIC funcionan, pero cualquier constante WP no estarán disponibles.

que incluye MIS PROPIOS constantes que fueron declarados en el plugin.php (de hecho esta es la razón por la que incluso comenzó a probar las constantes WP)

lo suficientemente interesante - no únicas constantes no están disponibles - pero cualquier función wp está regresando "no disponible".

PHP constante están destinados a estar disponibles en todo momento a través de la aplicación .. ¿Es eso un problema específico de WP? Es eso intencional? o estoy haciendo algo mal?

NOTA: Sé que hay otras maneras de hacerlo (como el uso de localize_script para pasar variables a JS - o simplemente utilizar una función de salida de la ruta en la cabeza) - pero primero - esos métodos no va a ser ideal para mí - y lo más importante es el hecho de que yo quiero entender por qué este método es no ...

EDIT:

althouh @ Matt Beckman señaló en la dirección correcta su método específico no funcionó . Es cierto que se debe incluir un archivo de WP. para mí, tanto los siguientes trabajos:

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

Tanto como se puede imaginar son iguales - pero el problema sigue siendo: los que están codificados en cierta medida (como @Salman A) sugirió - ¿Y si los cambios plugin's dir ?? ¿Cuál es la solución en ese caso?

Tenga en cuenta que tanto el wp-load.php como el wp-config.php funcionaron para mí. No sé qué es mejor o cuáles pueden presentar algunos problemas de seguridad.

pero supongo que es para otra pregunta ..

En pocas palabras: esta solución sólo es TEMP hasta que voy a encontrar la respuesta correcta. Mi complemento se carga a través del complemento WORDPRESS mechanisem (enqueue_script()/register_script()/init() etc.) - y por eso no puedo comprender por qué lo hace ... Bu, por ahora funciona como se describe arriba.

+1

¿Usted no necesita a ' include' o 'require' algunos archivos antes de que pueda hacer referencia a las funciones/constantes de wordpress en su aplicación? –

+0

buena pregunta ... exactamente lo que me gustaría saber. Y si es así, cuáles ?? –

+0

esto te ayudará. - 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

Respuesta

4

Siendo que esto se está incluyendo como JavaScript, su file.js.php necesita hacer referencia a la biblioteca de Wordpress para acceder a esas constantes. Actualmente, a medida que su código permanece, no tiene ninguna referencia a esas constantes.

__FILE__ no necesita acceder a nada desde Wordpress, por lo que funciona como se esperaba.

Necesitará incluir algunas declaraciones require o include que hacen referencia a los archivos específicos de WordPress PHP que necesita en la parte superior de file.js.php.

Editar

Usar la siguiente en la parte superior de su archivo file.js.php para obtener acceso a esas constantes:

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

Source

+0

esto es Entendido a partir de la pregunta en sí :-). la verdadera pregunta es POR QUÉ, y CÓMO hacer que funcione. No puedo ver una razón real para hacer referencia a una cosa en particular, ya que se llama JS BY wp y desde dentro de las funciones de wp. ¿Puede explicar en qué consiste exactamente el problema y cómo resolverlo? –

+1

Está llamando a un archivo JavaScript creado por PHP. Sin embargo, la llamada proviene de su navegador directamente a ese archivo, y * no * proviene de la canalización PHP de Wordpress. Al usar este tipo de archivos JavaScript creados por PHP, necesita hacer referencia a todos los archivos necesarios en el archivo PHP. –

+0

Ejemplo: si navega a http://www.example.com/file.js.php en su navegador, esto nunca tocará Wordpress a menos que * explícitamente * lo indique (usando 'include' o' require') . Otros plugins de Wordpress se incluyen a través de 'index.php', y como tal ya tienen todas las referencias requeridas. –

Cuestiones relacionadas