¿Qué debo usar en lugar de WP_CONTENT_DIR y WP_PLUGIN_DIR en WordPress?

16 oct 2013, 15:10:44
Vistas: 19K
Votos: 23

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.

3
Comentarios

Echa un vistazo al artículo del Codex Determinando Directorios de Plugins y Contenido.

Charles Clarkson Charles Clarkson
16 oct 2013 21:10:05

@CharlesClarkson Hago referencia a esa página en la primera frase de mi pregunta. Dice que no se usen las constantes mencionadas, pero no sugiere una alternativa a cosas como WP_PLUGIN_DIR, de ahí mi pregunta aquí.

Nick Nick
16 oct 2013 22:58:27
Todas las respuestas a la pregunta 2
4
23

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.

16 oct 2013 17:49:14
Comentarios

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?

Nick Nick
16 oct 2013 17:58:15

(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.)

Nick Nick
16 oct 2013 18:00:13

@Nick Ver actualización.

kaiser kaiser
16 oct 2013 18:09:06

El artículo que "entra en profundidad absoluta sobre todos los plugins" ya no está disponible. Y todavía no logro entender cómo obtener la ruta absoluta al directorio de plugins sin usar WP_PLUGIN_DIR.

XedinUnknown XedinUnknown
18 abr 2019 14:34:01
0
  1. 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).

  2. 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
    
  3. 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
    
  4. 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/
    
  5. 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;
    
24 jun 2015 06:20:30