Cuando desarrollo complementos, los pruebo en varias versiones de WordPress al vincular mi directorio de complementos en los diferentes wp-content
directorios. Esto es genial ya que solo tengo que editar los archivos una vez, pero rompe una construcción importante para generar referencias a los recursos en mi complemento: se __FILE__
refiere a la ubicación física del complemento, no a la que está dentro wp-content
. ¿Cómo debería resolver esto?
La estructura de mi directorio se ve así:
/path/to/wordpress/development/dir/
plugin-development/
monkeyman-rewrite-analyzer/
monkeyman-rewrite-analyzer.php
js/
monkeyman-rewrite-analyzer.js
versions/
3.1/
wp-content/
plugins/
monkeyman-rewrite-analyzer
como un enlace simbólico al complemento anterior
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
como un enlace simbólico al complemento anterior
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
como un enlace simbólico al complemento anterior
Si quiero poner en cola el archivo Javascript, debería usarlo plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, pero usarlo __FILE__
aquí no funcionará, porque la ruta real del archivo será /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, no /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, por lo que WordPress no puede quitar la primera parte y generar una URL relativa a la instalación de WordPress.
fuente
WP_PLUGIN_URL
no se recomienda el uso porque los administradores deberían poder cambiar el nombre del directorio de este complemento específico, pero ¿hay alguna otra razón para evitarlo? Y, de hecho, su boleto sería una solución simple./external/folder/banana-plugin/
pero el administrador se vincula a ese directorio como/httpd-root/wp-content/plugins/apple-plugin/
? Entonces intentará ir a/wp-content/plugins/banana-plugin/
, ¿no? ¿Y creo que el administrador debería ser libre de elegir los nombres de directorio de complementos individuales?Actualmente utilizo un truco para obtener la ubicación del archivo relativo a WordPress:
wp_get_active_and_valid_plugins()
devuelve las rutas de los archivos, laswp_settings.php
recorre e incluye los archivos . Entonces, la$plugin
variable global se referirá a su complemento actual (por supuesto, solo cuando se carga el complemento, así que lo guardo en una variable global prefijada):Debido a que los complementos también se pueden cargar como complementos obligatorios o de red y estos bucles usan otros nombres de variables , el código completo se ve así:
El respaldo sigue siendo
__FILE__
, por lo que si alguien cambia el nombre de la variable de bucle en el futuro, mi código aún debería funcionar para el 99% de todas las instalaciones, solo mi configuración de desarrollo fallará y puedo lanzar una nueva versión con facilidad.fuente
global
. Gracias a tu publicación aquí, me di cuenta de que podría hacerlo mucho más simple. Por cierto, también estoy probandofalse === strpos( __FILE__, WP_CONTENT_DIR )
antes de ejecutar sus sentencias if porque supongo que si el complemento está en elWP_CONTENT_DIR
enlace simbólico; Espero que sea una lógica válida.Un comentario en el error 46260 sugiere usar en
$_SERVER["SCRIPT_FILENAME"]
lugar de__FILE__
. ¿Esto funciona?fuente
index.php
incluyelibrary.php
,$_SERVER['SCRIPT_FILENAME']
enlibrary.php
seguirá siendoindex.php
. Pero gracias por la referencia al error, ¡lo seguiré de cerca!$_SERVER["SCRIPT_FILENAME"]
funciona si lo usas bien. Solo tiene que usarlo para establecer una ruta base, y luego incluir sus archivos usando una ruta relativa a esa ruta base.Algo como:
Tenga en cuenta que esto es más útil cuando todavía no tiene acceso a wp-blog-header.php (es decir, al procesar una solicitud de formulario basada en ajax)
fuente