web-dev-qa-db-ja.com

Wp-config.phpのディレクトリパスを取得するための最良の方法は何ですか?

私はまた直接アクセスすることができるいくつかのAPIを提供するプラグインmapsmarker.comの開発者です(例えばwww.mapsmarker.com/wp-content/plugins/leaflet-maps-marker/leaflet-geojson.php?marker=1)これらのAPI私は最初、プラグインのインストール時に以下の関数を使ってファイルへの絶対ディレクトリパスを書きました。

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

APIファイルでは、ファイルleaflet-wp-path.phpが次のコードに含まれています。

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

私はそれからいくつかのホスティングプロバイダーではこの種の操作はサポートされていないため、プラグインのインストールが失敗することに気付きました。そのため、wp-config.phpへのディレクトリパスを決定するための別の方法に切り替えました。

//info: construct path to wp-config.php with fallback for subdirectory installations
$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 __('Error: Could not construct path to wp-config.php - please check <a     href="http://mapsmarker.com/path-error">http://mapsmarker.com/path-error</a> for more details.','lmm') . '<br/>Path on your webhost: ' . $wp_path;
} else {
...

ディレクトリパスはAPI-Fileの現在のdirnameから決定されるので、これは関数file_put_contents()を許可しないホストでもうまく働きました。

今、私はユーザからバグレポートを受け取り、このメソッドは彼のホストでは動作しないことを教えてくれました。彼は書く:


これはアイコンリンクの例です。プラグイン全体のリンクが正しくないようです。現在機能しているのは1つだけです。管理パネルの設定です。また、マーカーを作成していますが、ブラウザには表示されていません。

Windows Webホストの場合 http:// XXXXX/wordpress/wp-content/plugins/D:/ Hosting/5465771/html/wordpress/wp-content/plugins/leaflet-maps-marker/img/logo-mapsmarker。 png

Linux Webホストの場合 http:// XXXXX/wordpress/wp-content/plugins/D:/ inetpub/vhosts/XXXXX/httpdocs/wordpress/wp-content /プラグイン/ leaflet-maps-marker/img/logo- mapsmarker.png


この種のホスティング設定をサポートするためにwp-config.phpへのディレクトリパスを決定するためのより良い方法を誰かが知っていますか?

6
robertharm

私はこの解決策を思いつきました。

この関数はファイル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;
    }
?>

実際にファイルをインクルードするために、これを使うことができます:

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

これもここで見つけることができます: ワードプレスコアがロードされていないときにワードプレスのベースパスを決定する方法

5
xaedes

私はそれが愚かに聞こえると思いますが、あなたはプラグインディレクトリからあなたの道を上向きにしてもらえますか?

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

私は他の誰かがおそらくもっとエレガントな解決策を持つだろうと確信しています。

3
Noel Tock

私のコードではなく、スタックのどこかにありますが、これを試してください。

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