Qual è il modo migliore per ottenere il percorso della directory per wp-config.php?
Sono lo sviluppatore del plugin mapsmarker.com che offre anche diverse API accessibili direttamente (es. www.mapsmarker.com/wp-content/plugins/leaflet-maps-marker/leaflet-geojson.php?marker=1) Per queste API inizialmente ho scritto il percorso assoluto del file con la seguente funzione durante l'installazione del plugin:
file_put_contents(dirname(__FILE__).'/leaflet-wp-path.php', '<?php define(\'WP_PATH\',\''.ABSPATH.'\'); ?>');
Nei file API, il file leaflet-wp-path.php veniva incluso con il seguente codice:
include_once(dirname($_SERVER['SCRIPT_FILENAME']).'/leaflet-wp-path.php');
include_once(WP_PATH.'wp-config.php');
include_once(WP_PATH.'wp-includes/wp-db.php');
global $wpdb;
...
Ho poi notato che su alcuni provider di hosting questo tipo di operazione non è supportato, causando il fallimento dell'installazione del plugin. Di conseguenza, sono passato a un altro metodo per determinare il percorso della directory di wp-config.php:
//info: costruisce il percorso a wp-config.php con fallback per installazioni in sottodirectory
$wp_path = $_SERVER["DOCUMENT_ROOT"];
if ( file_exists($wp_path . '/wp-config.php') ) {
include_once($wp_path.'/wp-config.php');
include_once($wp_path.'/wp-includes/wp-db.php');
} else {
$wp_plugin_path_modified = explode(DIRECTORY_SEPARATOR, dirname(__FILE__),-3);
$wp_path = implode(DIRECTORY_SEPARATOR, $wp_plugin_path_modified);
include_once($wp_path.'/wp-config.php');
include_once($wp_path.'/wp-includes/wp-db.php');
}
if ( !file_exists($wp_path . '/wp-config.php') ) {
echo __('Errore: Impossibile costruire il percorso a wp-config.php - consulta <a href="http://mapsmarker.com/path-error">http://mapsmarker.com/path-error</a> per maggiori dettagli.','lmm') . '<br/>Percorso sul tuo webhost: ' . $wp_path;
} else {
...
Questo metodo ha funzionato bene anche su host che non permettono la funzione file_put_contents() perché il percorso della directory viene determinato dal dirname corrente del file API.
Ora ho ricevuto un report di bug da un utente che mi dice che questo metodo non funziona sul suo host. Scrive:
Questo è un esempio di uno dei link delle icone. Sembra che tutti i link del plugin non siano corretti. L'unica cosa che funziona ora è il pannello di amministrazione. Inoltre, crea i marker ma non li mostra nei browser.
Su Windows Web Host http://XXXXX/wordpress/wp-content/plugins/D:/Hosting/5465771/html/wordpress/wp-content/plugins/leaflet-maps-marker/img/logo-mapsmarker.png
Su Linux Web Host http://XXXXX/wordpress/wp-content/plugins/D:/inetpub/vhosts/XXXXX/httpdocs/wordpress/wp-content/plugins/leaflet-maps-marker/img/logo-mapsmarker.png
Qualcuno conosce un metodo migliore per determinare il percorso della directory di wp-config.php che supporti questo tipo di configurazione di hosting?
Ho ideato questa soluzione.
Questa funzione controlla in ogni livello di directory a partire dalla directory del file corrente la presenza del file wp-config.php.
<?php
function find_wp_config_path() {
$dir = dirname(__FILE__);
do {
if( file_exists($dir."/wp-config.php") ) {
return $dir;
}
} while( $dir = realpath("$dir/..") );
return null;
}
?>
Per includere effettivamente il file puoi utilizzare questo codice:
if ( ! function_exists('add_action') ) {
include_once( find_wp_config_path() . '/wp-load.php' );
}
Questa soluzione è disponibile anche qui: Come determinare il percorso base di WordPress quando il core non è caricato

Utilizzo questo approccio molto spesso. Rende tutto più pulito, non mi piace l'idea di dipendere da funzioni esterne per ottenere i percorsi per includere i file. Ti do un voto positivo.

Per la cronaca, la domanda chiede come fare la cosa sbagliata, anche nel periodo in cui è stata posta non avresti dovuto utilizzare l'accesso diretto a nessuno dei file del plugin, ma probabilmente un parametro URL creato in modo univoco come my_plugin_param
il cui utilizzo indicherà che il plugin dovrebbe fare ciò che è necessario. Per rilevarlo, il plugin dovrebbe agganciarsi all'azione init
e verificare se l'URL contiene my_plugin_param
. Una volta fatto in questo modo, non è necessario avviare WordPress perché è già stato fatto.
Sebbene wp-config.php
dovrebbe trovarsi nella root di WordPress o in una directory sopra di essa, i plugin potrebbero essere installati al di fuori delle directory di WordPress. Anche se non è una configurazione particolarmente popolare, può essere fatta.

non è il mio codice, l'ho trovato su stack, ma prova questo:
function FindWPConfig($directory){
global $confroot;
foreach(glob($directory."/*") as $f){
if (basename($f) == 'wp-config.php' ){
$confroot = str_replace("\\", "/", dirname($f));
return true;
}
if (is_dir($f)){
$newdir = dirname(dirname($f));
}
}
if (isset($newdir) && $newdir != $directory){
if (FindWPConfig($newdir)){
return false;
}
}
return false; }
if (!isset($table_prefix)){
global $confroot;
FindWPConfig(dirname(dirname(__FILE__)));
include_once $confroot."/wp-load.php";
}

Poiché questa è la stessa soluzione proposta da bueltge, posso solo ripetermi: Si tratta di un approccio molto sgradevole. L'output viene gestito con una variabile globale, cosa non molto elegante. Il codice è davvero confuso e inefficiente. Lo stesso risultato può essere ottenuto in modo molto migliore con la soluzione che ho pubblicato.

Quanto segue non risponde esattamente a ciò che viene chiesto nel contesto della domanda, ma risponde esattamente a quanto indicato nel titolo della domanda.
Per coloro che stanno cercando un modo per ottenere il percorso a wp-config.php all'interno di WordPress, il seguente codice funziona correttamente.
Ecco come WP CLI lo fa:
function locate_wp_config() {
static $path;
if ( null === $path ) {
$path = false;
if ( getenv( 'WP_CONFIG_PATH' ) && file_exists( getenv( 'WP_CONFIG_PATH' ) ) ) {
$path = getenv( 'WP_CONFIG_PATH' );
} elseif ( file_exists( ABSPATH . 'wp-config.php' ) ) {
$path = ABSPATH . 'wp-config.php';
} elseif ( file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
$path = dirname( ABSPATH ) . '/wp-config.php';
}
if ( $path ) {
$path = realpath( $path );
}
}
return $path;
}

Ma questo in realtà non cerca il file, quindi non sarebbe molto utile per il caso della domanda. Si presuppone che tu abbia impostato una variabile d'ambiente o che stia eseguendo dall'interno di WordPress o che ti trovi già nella cartella corretta.

Beh, allora il titolo della domanda non è corretto. Perché in wordpress.stackexchange.com, come qualcuno che cerca risposte come me, ci si aspetterebbe che stiamo eseguendo dall'interno di WP. Ho modificato la mia risposta per coloro che leggono solo il titolo e si aspettano una risposta a quello.
