¿Qué debo usar en lugar de WP_CONTENT_DIR y WP_PLUGIN_DIR en WordPress?
La documentación de WordPress sobre Determinar Directorios de Plugins y Contenido establece que:
WordPress utiliza las siguientes constantes para determinar las rutas a los directorios de contenido y plugins. Estas no deberían ser usadas directamente por plugins o temas, pero se listan aquí para completitud.
Luego menciona WP_CONTENT_DIR
y WP_PLUGIN_DIR
entre las constantes que los desarrolladores de temas y plugins no deberían usar, probablemente debido a esto:
WordPress permite a los usuarios colocar su directorio wp-content donde deseen, por lo que nunca debes asumir que los plugins estarán en wp-content/plugins, o que las subidas estarán en wp-content/uploads, o que los temas estarán en wp-content/themes.
Mark Jaquith también comenta aquí que esas constantes no deberían usarse:
No uses WP_PLUGIN_URL o WP_PLUGIN_DIR — los plugins podrían no estar en el directorio de plugins.
Entonces, ¿cuál es la forma aceptada de referenciar la ruta completa a las carpetas de plugins, wp-content y temas sin usar estas constantes?
Como ejemplo simple, para mostrar la ruta completa de todos los plugins instalados, podría hacer esto:
<?php
$plugins = get_plugins();
foreach ($plugins as $file => $details) {
echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}
Lo que produce una lista como esta:
/var/www/wp-content/plugins/akismet/akismet.php
/var/www/wp-content/plugins/debug-bar/debug-bar.php
/var/www/wp-content/plugins/hello.php
(Podría querer hacer esto si estuviera escribiendo un plugin para permitir al usuario archivar selectivamente plugins como parte de un respaldo del sitio, por ejemplo.)
Si usar WP_PLUGIN_DIR
es incorrecto, ¿cuál es la alternativa sugerida? No hay un equivalente a wp_upload_dir()
para las carpetas de plugins, temas y wp-content que pueda encontrar, lo que hace problemático referenciar los directorios raíz de temas y plugins que podrían estar en ubicaciones variables.

Referenciar archivo en la ruta actual o en subdirectorios anidados
Para referenciar la ruta actual
plugin_dir_path( __FILE__ )."further/nesting/here.css";
que funciona en Plugins y Temas.
Referenciar URL/URI en un plugin
Para apuntar a un archivo de plugin o tema, usa
plugins_url( "path/to/file", __FILE__ );
que solo funciona en plugins
Referenciar URL/URI en la carpeta wp-admin
Siempre apúntalos a admin_url( 'some/path' );
. También existe get_admin_url()
.
Referenciar URL/URI en la carpeta wp-includes
Apúntalos a includes_url( 'some/path' );
Una URL/URI relativa al inicio del sitio
Existen home_url( 'etc' );
o get_home_url()
para eso. Similar son get_site_url()
y site_url()
. También está network_home_url()
. Y tienes network_admin_url()
wp-content
o el directorio renombrado
Puedes redefinir el nombre de la carpeta wp-content
. Por lo tanto, usa content_url()
ahí.
¿Cómo obtener la URL de la carpeta de plugins?
Si usar WP_PLUGIN_DIR es incorrecto, ¿cuál es la alternativa sugerida?
Simplemente usa plugins_url()
sin parámetros.
Si lo usas para un plugin, también funciona para plugins MU.
EDIT #1 Si estás interesado en la ruta al plugin actual, usa plugin_basename();
.
EDIT #2 Si estás interesado en todos los plugins activos en el sitio, usa wp_get_active_network_plugins();
.
Si no estás en multisitio, usa wp_get_active_and_valid_plugins();
. Esto tendrá en cuenta multisitio/red. Ten en cuenta que los considerará incluso si no estás en multisitio pero tienes un dropin sunrise.php
.
También podrías recuperarlos mediante get_option( 'active_plugins' );
, lo cual no se recomienda ya que no tiene en cuenta los filtros ni la validación de plugins, que ocurre en varias ocasiones.
Lectura adicional
Esta lista continúa. Echa un vistazo a los resultados de búsqueda en QueryPosts.com para más información.
Este artículo profundiza absolutamente sobre todas las rutas.

Gracias por esto, pero tu respuesta parece tratar con URLs en lugar de rutas absolutas del servidor, que es lo que me interesaba. Por ejemplo, plugins_url()
devuelve la URL a la carpeta de plugins, no la ruta completa al directorio en el servidor. ¿Existen funciones similares para manejar directorios que no conozca? ¿O es que el consejo de no usar la constante WP_PLUGIN_DIR
simplemente es incorrecto?

(Estoy específicamente interesado en encontrar la ruta completa a plugins instalados distintos al plugin que contiene mi propio código, por si eso ayuda a explicarlo.)

Esto devuelve la ruta del servidor del directorio actual del plugin:
plugin_dir_path(__FILE__) // ejemplo: /home/miservidor/public_html/instalacion_wordpress/wp-content/plugins/plugindeejemplo/
Ref: https://codex.wordpress.org/Function_Reference/plugin_dir_path
No confundir con:
plugins_dir_path(__FILE__)
(Nótese el plural "plugins" en este caso).
Como no queremos que se devuelva el nombre del directorio del plugin, tenemos que eliminarlo. Aquí hay una función que devuelve el directorio del plugin y el nombre del archivo:
plugin_basename(__FILE__) // ejemplo: plugindeejemplo/plugindeejemplo.php
Pero por supuesto tampoco queremos el nombre del archivo del plugin, así que primero tendremos que eliminarlo de
plugin_basename(__FILE__)
. Para devolver el nombre del archivo del plugin:basename(__FILE__) // ejemplo: plugindeejemplo.php
Para usar estos elementos y construir una ruta al directorio de plugins, podemos usar la función
str_replace()
de la siguiente manera:$myBnm = basename(__FILE__); // valor: plugindeejemplo.php $myDir = plugin_basename(__FILE__); // valor: plugindeejemplo/plugindeejemplo.php $myStr = str_replace($myBnm,"",$myDir); // valor: plugindeejemplo/ $myPth = plugin_dir_path(__FILE__); // valor: /home/miservidor/public_html/instalacion_wordpress/wp-content/plugins/plugindeejemplo/ return str_replace($myStr,"",$myPth); // devuelve: /home/miservidor/public_html/instalacion_wordpress/wp-content/plugins/
Y si es necesario, esa última línea puede asignarse a una variable para usos repetidos.
En lugar de:
return str_replace($myStr,"",$myPth); // devuelve: /home/miservidor/public_html/instalacion_wordpress/wp-content/plugins/
Usar algo como:
$thePlgDir = str_replace($myStr,"",$myPth); // devuelve: /home/miservidor/public_html/instalacion_wordpress/wp-content/plugins/
Y luego, cuando sea necesario:
return $thePlgDir;
