Qual è il modo migliore per ottenere il percorso della directory per wp-config.php?

11 gen 2012, 08:12:02
Visualizzazioni: 15.2K
Voti: 7

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?

0
Tutte le risposte alla domanda 5
2

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

18 dic 2012 21:38:54
Commenti

+1 : Grazie, funziona perfettamente per il mio caso: un plugin che necessita di accedere alle funzioni di Wordpress.

Mike Castro Demaria Mike Castro Demaria
24 mar 2014 09:59:12

Penso che $dir = trim(ABSPATH,"/"); sarebbe più veloce.

Miguel Miguel
30 mag 2014 21:10:50
3

So che può sembrare sciocco, ma potresti partire dalla directory del plugin?

if ( file_exists('../../../wp-config.php') ) :
    include_once '../../../wp-config.php';
;

Sono sicuro che qualcun altro avrà probabilmente una soluzione più elegante.

11 gen 2012 09:50:16
Commenti

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.

Dwayne Charrington Dwayne Charrington
5 mar 2012 00:13:44

Ho pubblicato una versione più elegante, dai un'occhiata.

xaedes xaedes
20 dic 2012 18:24:50

Non è una grande soluzione, ho un'installazione personalizzata di WP con un percorso diverso per i plugin e il tema, e questo non funzionerebbe per me.

Maarten00 Maarten00
19 nov 2015 11:55:13
0

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.

5 lug 2021 08:56:52
2

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";
}
11 gen 2012 10:05:25
Commenti

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.

xaedes xaedes
20 dic 2012 18:55:22

L'intera piattaforma WordPress funziona su variabili globali. Sì, non è la migliore pratica, ma si adatta perfettamente a come è costruito il sistema.

chrisguitarguy chrisguitarguy
20 dic 2012 19:05:55
2

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:

Fonte

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;
}
4 lug 2021 15:04:41
Commenti

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.

Rup Rup
4 lug 2021 17:12:17

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.

Aleksandar Aleksandar
5 lug 2021 08:25:19