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

15

La documentación de WordPress para la determinación de plugins y directorios de contenido establece que:

WordPress hace uso de las siguientes constantes al determinar la ruta al contenido y a los directorios de complementos. Estos no deben ser utilizados directamente por complementos o temas , pero se enumeran aquí para completar.

Continúa enumerando WP_CONTENT_DIRy WP_PLUGIN_DIRentre las constantes que los desarrolladores de temas y complementos no deberían usar, presumiblemente debido a esto:

WordPress permite a los usuarios colocar su directorio de contenido de wp donde quieran, por lo que nunca debe suponer que los complementos estarán en wp-content / plugins, o que las cargas estarán en wp-content / uploads, o que los temas estarán en wp- contenido / temas.

Mark Jaquith también comenta aquí que esas constantes no deben usarse:

No use WP_PLUGIN_URL o WP_PLUGIN_DIR; es posible que los complementos no estén en el directorio de complementos.

Entonces, ¿cuál es la forma aceptada de hacer referencia a la ruta completa a los complementos, wp-content y carpetas de temas sin usar estas constantes?

Como un simple ejemplo, para generar la ruta completa de todos los complementos instalados, puedo 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

(Es posible que desee hacer esto si estaba escribiendo un complemento para permitir al usuario archivar selectivamente complementos como parte de una copia de seguridad del sitio, por ejemplo).

Si el uso WP_PLUGIN_DIRes incorrecto, ¿cuál es la alternativa sugerida? No hay un equivalente wp_upload_dir()para los complementos, los temas y la carpeta wp-content que puedo encontrar, lo que hace que la referencia a los directorios raíz de plugins y temas potencialmente errantes sea problemática.

Mella
fuente
Eche un vistazo al artículo del Codex Determinación de plugins y directorios de contenido .
Charles Clarkson
2
@CharlesClarkson Hago referencia a esa página en la primera oración de mi pregunta. Dice no usar las constantes anteriores, pero no sugiere una alternativa a cosas como WP_PLUGIN_DIR, de ahí mi pregunta aquí.
Nick

Respuestas:

17

Archivo de referencia en ruta actual o anidada más profunda

Para hacer referencia a la ruta actual

plugin_dir_path( __FILE__ )."further/nesting/here.css";

que funciona en complementos y temas .

Referencia URl / URi en un complemento

Para apuntar a un complemento o archivo de tema, use

plugins_url( "path/to/file", __FILE__ );

que funciona solo en complementos

Referencia URl / URi en la wp-admincarpeta

Siempre apúntelos admin_url( 'some/path' );. Hay get_admin_url()también

Referencia URl / Uri en la wp-includescarpeta

Señalarlos a includes_url( 'some/path' );

Un URl / URi relativo a los sitios de origen

Hay home_url( 'etc' );o get_home_url()para eso. Similar es get_site_url()y site_url(). Entonces allí también está network_home_url(). Y tienesnetwork_admin_url()

wp-content o el directorio renombrado

Puede redefinir el wp-contentnombre de la carpeta. Por eso lo usas content_url()allí.

¿Cómo obtener la URL de la carpeta de complementos?

Si usar WP_PLUGIN_DIR está mal, ¿cuál es la alternativa sugerida?

Simplemente use plugins_url()sin ningún parámetro.

Si lo usa para un complemento, también funciona para complementos MU.

EDITAR # 1 Si está interesado en la ruta al complemento actual, use plugin_basename();.

EDITAR # 2 Si está interesado en todos los complementos activos laterales, use wp_get_active_network_plugins();.

Si no estás en un sitio múltiple, ve con wp_get_active_and_valid_plugins();. Esto tendrá en cuenta multisitio / red. Tenga en cuenta que esto los tendrá en cuenta si no está en un sitio sunrise.phpmúltiple , pero tiene un dropin.

También podría recuperarlos a través de get_option( 'active_plugins' );, lo que no se recomienda ya que no tiene en cuenta los filtros y la validación de complementos, lo que sucede en varias ocasiones.


Otras lecturas

Esta lista sigue y sigue. Eche un vistazo a los resultados de búsqueda en QueryPosts.com para obtener más información.

Este artículo va en profundidad absoluta sobre todos los caminos.

emperador
fuente
3
Gracias por esto, pero su respuesta parece tratar con las URL en lugar de las rutas absolutas del servidor, que es lo que me interesaba. Por ejemplo, plugins_url()devuelve la URL a la carpeta de complementos, no la ruta completa al directorio en el servidor. ¿Existen funciones similares para el manejo de directorios que desconozco? ¿O es el consejo de no usar la WP_PLUGIN_DIRconstante simplemente mal?
Nick
(Estoy específicamente interesado en encontrar la ruta completa a los complementos instalados que no sean el complemento que contiene mi propio código, en caso de que eso ayude a explicar).
Nick
@ Nick Ver actualización.
kaiser
El artículo que "profundiza en absoluto sobre todos los complementos" ya no está disponible. Y todavía no puedo entender cómo obtener la ruta absoluta al directorio de complementos sin usar WP_PLUGIN_DIR.
Xedin Desconocido
4
  1. Esto devuelve la ruta del servidor del directorio del complemento actual:

    plugin_dir_path(__FILE__)
    
    // example: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/

    Ref: https://codex.wordpress.org/Function_Reference/plugin_dir_path

    No debe confundirse con:

    plugins_dir_path(__FILE__)

    (Observe el plural "plugin s " en eso).

  2. Como no desea que se devuelva el nombre del directorio de complementos, tenemos que eliminarlo. Aquí hay una función que devuelve el directorio del complemento y el nombre del archivo:

    plugin_basename(__FILE__)
    
    // example: exampleplugin/exampleplugin.php
  3. Pero, por supuesto, tampoco queremos el nombre de archivo del complemento, por lo que tendremos que eliminarlo plugin_basename(__FILE__)primero. Para devolver el nombre del archivo del complemento:

    basename(__FILE__)
    
    // example: exampleplugin.php
  4. Entonces, para usarlos para construir una ruta al directorio de complementos , podemos usar la str_replace()función de la siguiente manera:

    $myBnm = basename(__FILE__); // value: exampleplugin.php
    $myDir = plugin_basename(__FILE__); // value: exampleplugin/exampleplugin.php
    $myStr = str_replace($myBnm,"",$myDir); // value: exampleplugin/
    $myPth = plugin_dir_path(__FILE__); // value: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
  5. Y si es necesario, esa línea final, por supuesto, se puede asignar a una variable, para su uso repetido.

    En lugar de:

    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    Use algo como:

    $thePlgDir = str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    Y luego, cuando sea necesario:

    return $thePlgDir;
Joe Rhoney
fuente