Care este cea mai bună metodă de a obține calea directorului pentru wp-config.php?

11 ian. 2012, 08:12:02
Vizualizări: 15.2K
Voturi: 7

Sunt dezvoltatorul plugin-ului mapsmarker.com care oferă și mai multe API-uri accesibile direct (de ex. www.mapsmarker.com/wp-content/plugins/leaflet-maps-marker/leaflet-geojson.php?marker=1) Pentru aceste API-uri am scris inițial calea absolută către un fișier cu următoarea funcție la instalarea plugin-ului:

file_put_contents(dirname(__FILE__).'/leaflet-wp-path.php', '<?php define(\'WP_PATH\',\''.ABSPATH.'\'); ?>');

În fișierele API, fișierul leaflet-wp-path.php era inclus prin următorul cod:

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;
...

Apoi am observat că pe unele furnizori de hosting acest tip de operație nu este suportat, cauzând eșecul instalării plugin-ului. Prin urmare, am trecut la o altă metodă pentru determinarea căii directorului către wp-config.php:

//info: construiește calea către wp-config.php cu rezervă pentru instalările în subdirectoare
$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 __('Eroare: Nu s-a putut construi calea către wp-config.php - verificați <a href="http://mapsmarker.com/path-error">http://mapsmarker.com/path-error</a> pentru mai multe detalii.','lmm') . '<br/>Calea pe hostingul dumneavoastră: ' . $wp_path;
} else {
...

Această metodă a funcționat bine chiar și pe host-urile care nu permit funcția file_put_contents() deoarece calea directorului este determinată din dirname-ul curent al fișierului API.

Acum am primit un raport de eroare de la un utilizator, care mi-a spus că această metodă nu funcționează pe hosting-ul său. El scrie:


Acesta este un exemplu al unui link de iconiță. Se pare că toate link-urile plugin-ului nu sunt corecte. Singurul lucru care funcționează acum este panoul de configurare admin. De asemenea, creează markere, dar nu le afișează în browsere.

Pe Windows Web Host http://XXXXX/wordpress/wp-content/plugins/D:/Hosting/5465771/html/wordpress/wp-content/plugins/leaflet-maps-marker/img/logo-mapsmarker.png

Pe 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


Știe cineva o metodă mai bună de a determina calea directorului către wp-config.php pentru a suporta acest tip de configurație de hosting?

0
Toate răspunsurile la întrebare 5
2

Am venit cu această soluție.

Această funcție verifică în fiecare nivel de director, începând de la directorul fișierului curent, pentru fișierul 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;
    }
?>

Pentru a include efectiv fișierul, puteți folosi acest cod:

if ( ! function_exists('add_action') ) {
    include_once( find_wp_config_path()  . '/wp-load.php' );
}

Acest lucru poate fi găsit și aici: Cum să determini calea de bază a WordPress când nucleul WordPress nu este încărcat

18 dec. 2012 21:38:54
Comentarii

+1 : Mulțumesc, funcționează perfect pentru cazul meu: un plugin care are nevoie de acces la funcțiile WordPress.

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

Cred că $dir = trim(ABSPATH,"/"); ar fi mai rapid.

Miguel Miguel
30 mai 2014 21:10:50
3

Probabil sună ridicol, dar ai putea să urci din directorul plugin-ului?

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

Sunt sigur că altcineva va avea probabil o soluție mai elegantă.

11 ian. 2012 09:50:16
Comentarii

Folosesc această abordare mereu. Face lucrurile mai clare, nu-mi place ideea de a mă baza pe funcții externe pentru a obține căi pentru includerea fișierelor. Ai un vot în sus.

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

Am o versiune mai elegantă postată, verifică-o.

xaedes xaedes
20 dec. 2012 18:24:50

Nu este o soluție grozavă, rulez o instalare personalizată de WP cu o cale diferită pentru pluginuri și pentru tema, iar aceasta nu ar funcționa pentru mine.

Maarten00 Maarten00
19 nov. 2015 11:55:13
0

Pentru clarificare, întrebarea se referă la cum să faci un lucru greșit, chiar și în perioada în care a fost pusă, nu ar fi trebuit să folosești acces direct la niciunul dintre fișierele plugin-ului, ci probabil un parametru URL unic creat precum my_plugin_param a cărui utilizare ar indica că plugin-ul ar trebui să facă ceea ce este necesar. Pentru a-l detecta, plugin-ul ar trebui să se conecteze la acțiunea init și să verifice dacă URL-ul conține my_plugin_param. Odată implementat în acest fel, nu mai este nevoie să inițializezi WordPress, deoarece acest lucru a fost deja făcut.

Deși wp-config.php ar trebui să fie fie în directorul rădăcină al WordPress, sau într-un director deasupra acestuia, plugin-urile pot fi instalate în afara directoarelor WordPress. Deși nu este o configurație foarte populară, acest lucru poate fi realizat.

5 iul. 2021 08:56:52
2

nu este codul meu, l-am găsit pe undeva pe stack, dar încearcă asta:

function FindWPConfig($dirrectory){
global $confroot;
foreach(glob($dirrectory."/*") 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 != $dirrectory){
    if (FindWPConfig($newdir)){
        return false;
    }
}
return false; }
    if (!isset($table_prefix)){
        global $confroot;
        FindWPConfig(dirname(dirname(__FILE__)));
        include_once $confroot."/wp-load.php";
}
11 ian. 2012 10:05:25
Comentarii

Deoarece aceasta este aceeași soluție ca cea de la bueltge, nu pot decât să mă repet: Aceasta este o abordare foarte neplăcută. Ieșirea se face cu o variabilă globală, ceea ce nu este deloc elegant. Codul este foarte confuz și ineficient. Același lucru poate fi realizat într-un mod mult mai bun cu soluția pe care am postat-o eu.

xaedes xaedes
20 dec. 2012 18:55:22

Întreaga platformă WordPress funcționează pe variabile globale. Da, nu este cea mai bună practică, dar se potrivește foarte bine cu modul în care este construit sistemul.

chrisguitarguy chrisguitarguy
20 dec. 2012 19:05:55
2

Următoarele informații nu răspund exact la ceea ce se întreabă în contextul întrebării, dar răspund exact la ceea ce este menționat în titlul întrebării.

Pentru cei care caută o modalitate de a obține calea către wp-config.php din interiorul WordPress, următoarea soluție funcționează corect.

Așa face WP CLI acest lucru:

Sursă

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 iul. 2021 15:04:41
Comentarii

Dar asta nu caută efectiv fișierul, deci nu ar fi foarte util pentru cazul din întrebare. Se presupune că ai setat deja o variabilă de mediu sau rulezi din interiorul WordPress sau deja te afli în folderul corect.

Rup Rup
4 iul. 2021 17:12:17

Atunci titlul întrebării nu este corect. Pentru că pe wordpress.stackexchange.com, ca cineva care caută răspunsuri ca mine, s-ar aștepta că rulăm din interiorul WP. Am editat răspunsul meu pentru cei care citesc doar titlul și se așteaptă la un răspuns la acesta.

Aleksandar Aleksandar
5 iul. 2021 08:25:19