Care este cea mai bună metodă de a obține calea directorului pentru wp-config.php?
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?
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

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.

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.

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";
}

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.

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:
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;
}

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.

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.
