Cosa usare al posto di WP_CONTENT_DIR e WP_PLUGIN_DIR?
La documentazione di WordPress per Determinare le directory dei plugin e dei contenuti afferma che:
WordPress utilizza le seguenti costanti per determinare il percorso delle directory dei contenuti e dei plugin. Queste non dovrebbero essere utilizzate direttamente da plugin o temi, ma sono elencate qui per completezza.
Prosegue elencando WP_CONTENT_DIR
e WP_PLUGIN_DIR
tra le costanti che gli sviluppatori di temi e plugin non dovrebbero usare, presumibilmente per questo motivo:
WordPress consente agli utenti di posizionare la loro directory wp-content dove preferiscono, quindi non devi mai presupporre che i plugin siano in wp-content/plugins, che i caricamenti siano in wp-content/uploads o che i temi siano in wp-content/themes.
Mark Jaquith commenta anche qui che quelle costanti non dovrebbero essere utilizzate:
Non usare WP_PLUGIN_URL o WP_PLUGIN_DIR — i plugin potrebbero non essere nella directory dei plugin.
Quindi, qual è il modo accettato per riferirsi al percorso completo delle cartelle dei plugin, wp-content e temi senza usare queste costanti?
Come esempio semplice, per mostrare il percorso completo di tutti i plugin installati, posso fare questo:
<?php
$plugins = get_plugins();
foreach ($plugins as $file => $details) {
echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}
Che produce una lista come questa:
/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
(Potrei voler fare questo se stessi scrivendo un plugin per permettere all'utente di archiviare selettivamente i plugin come parte di un backup del sito, ad esempio.)
Se usare WP_PLUGIN_DIR
è sbagliato, qual è l'alternativa suggerita? Non c'è un equivalente a wp_upload_dir()
per le cartelle dei plugin, dei temi e di wp-content che io abbia trovato, il che rende problematico riferirsi alle directory radice potenzialmente variabili dei temi e dei plugin.

Riferimento a file nel percorso corrente o annidato più in profondità
Per riferirsi al percorso corrente
plugin_dir_path( __FILE__ )."ulteriore/annidamento/qui.css";
che funziona in Plugin e Temi.
Riferimento a URL/URI in un plugin
Per puntare a un file di un plugin o tema, usa
plugins_url( "percorso/al/file", __FILE__ );
che funziona solo nei plugin
Riferimento a URL/URI nella cartella wp-admin
Puntali sempre a admin_url( 'qualche/percorso' );
. Esiste anche get_admin_url()
.
Riferimento a URL/URI nella cartella wp-includes
Puntali a includes_url( 'qualche/percorso' );
Un URL/URI relativo alla home del sito
Per questo c'è home_url( 'ecc' );
o get_home_url()
. Simili sono get_site_url()
e site_url()
. Poi c'è anche network_home_url()
. E hai network_admin_url()
wp-content
o la directory rinominata
Puoi ridefinire il nome della cartella wp-content
. Per questo usi content_url()
.
Come ottenere l'URL della cartella dei plugin?
Se usare WP_PLUGIN_DIR è sbagliato, qual è l'alternativa suggerita?
Basta usare plugins_url()
senza alcun parametro.
Se lo usi per un plugin, funziona anche per i plugin MU.
MODIFICA #1 Se sei interessato al percorso del plugin corrente, usa plugin_basename();
.
MODIFICA #2 Se sei interessato a tutti i plugin attivi a livello di sito, usa wp_get_active_network_plugins();
.
Se non sei in multisite, usa wp_get_active_and_valid_plugins();
. Questo terrà conto di multisite/rete. Tieni presente che questo li prenderà in considerazione se non sei in multisite, ma hai un dropin sunrise.php
.
Potresti anche recuperarli tramite get_option( 'active_plugins' );
, che non è raccomandato in quanto non tiene conto dei filtri e della validazione del plugin, che avviene in diverse occasioni.
Ulteriori letture
Questa lista continua all'infinito. Dai un'occhiata ai risultati di ricerca su QueryPosts.com per maggiori informazioni.
Questo articolo entra in profondità assoluta su tutti i percorsi.

Grazie per la risposta, ma sembra che tu abbia parlato di URL piuttosto che di percorsi assoluti sul server, che è ciò che mi interessava. Ad esempio, plugins_url()
restituisce l'URL della cartella dei plugin, non il percorso completo della directory sul server. Esistono funzioni simili per gestire le directory che non conosco? O il consiglio di non usare la costante WP_PLUGIN_DIR
è semplicemente sbagliato?

(Sono particolarmente interessato a trovare il percorso completo dei plugin installati diversi dal plugin che contiene il mio codice, nel caso questo aiuti a spiegare meglio.)

Questo restituisce il percorso del server della directory del plugin corrente:
plugin_dir_path(__FILE__) // esempio: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
Rif: https://codex.wordpress.org/Function_Reference/plugin_dir_path
Da non confondere con:
plugins_dir_path(__FILE__)
(Notare il plurale "plugins" in questo caso.)
Poiché non vogliamo che venga restituito il nome della directory del plugin, dobbiamo rimuoverlo. Ecco una funzione che restituisce la directory del plugin e il nome del file:
plugin_basename(__FILE__) // esempio: exampleplugin/exampleplugin.php
Ma naturalmente non vogliamo nemmeno il nome del file del plugin, quindi dovremo prima rimuoverlo da
plugin_basename(__FILE__)
. Per restituire il nome del file del plugin:basename(__FILE__) // esempio: exampleplugin.php
Quindi, per utilizzare queste funzioni per costruire un percorso alla directory dei plugin, possiamo usare la funzione
str_replace()
in questo modo:$myBnm = basename(__FILE__); // valore: exampleplugin.php $myDir = plugin_basename(__FILE__); // valore: exampleplugin/exampleplugin.php $myStr = str_replace($myBnm,"",$myDir); // valore: exampleplugin/ $myPth = plugin_dir_path(__FILE__); // valore: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/ return str_replace($myStr,"",$myPth); // restituisce: /home/myserver/public_html/wordpress_install/wp-content/plugins/
E se necessario, l'ultima riga può ovviamente essere assegnata a una variabile, per un uso ripetuto.
Invece di:
return str_replace($myStr,"",$myPth); // restituisce: /home/myserver/public_html/wordpress_install/wp-content/plugins/
Usare qualcosa come:
$thePlgDir = str_replace($myStr,"",$myPth); // restituisce: /home/myserver/public_html/wordpress_install/wp-content/plugins/
E successivamente, quando necessario:
return $thePlgDir;
