获取wp-config.php目录路径的最佳方式是什么?

时间:2012-01-11 作者:robertharm

我是插件mapsmarker的开发人员。com还提供了几个可以直接访问的API(例如www.mapsmarker.com/wp-content/plugins/fluel-maps-marker/fluel-geojson.php?marker=1)对于这些API,我最初编写了一个文件的绝对目录路径,该文件在插件安装时具有以下功能:

file_put_contents(dirname(__FILE__).\'/leaflet-wp-path.php\', \'<?php define(\\\'WP_PATH\\\',\\\'\'.ABSPATH.\'\\\'); ?>\');
在API文件中,文件传单wp路径。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 {
...
即使在不允许函数file\\u put\\u contents()的主机上,这也很好,因为目录路径是根据API文件的当前目录名确定的。

现在我从一个用户那里得到了一个bug报告,告诉我这个方法在他的主机上不起作用。他写道:

这是图标链接之一的示例。看起来整个插件链接都不正确。现在只有一件事在起作用,那就是管理面板配置。它也在做标记,但不在浏览器中显示。

在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/plugins/leaflet-maps-marker/img/logo-mapsmarker.png

有谁知道更好的方法来确定wp config的目录路径吗。php是否支持这种托管配置?

5 个回复
SO网友:xaedes

我想出了这个解决方案。

此函数从当前文件的目录开始检查每个目录级别中的文件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\' );
}
也可以在此处找到:How to determine wordpress base path when wordpress core is not loaded

SO网友:Noel Tock

我想这听起来很傻,但是你能从插件目录中找到你的方法吗?

if ( file_exists(\'../../../wp-config.php\') ) :
    include_once \'../../../wp-config.php\';
;
我相信其他人可能会有一个更优雅的解决方案。

SO网友:Mark Kaplun

有鉴于此,问题是如何做错事,即使在被问及你不应该直接访问任何插件文件的时候,也可能使用了优衣库特制的URL参数,如my_plugin_param 它的使用将表明插件应该做任何需要的事情。要检测它,插件应该钩住init 操作并检查URL是否包含my_plugin_param. 一旦这样做了,您就不需要像以前那样引导WordPress了。

虽然wp-config.php 插件应该位于WordPress根目录或其上方的一个目录中,插件可能安装在WordPress目录之外。虽然不是特别流行的设置,但它可以完成。

SO网友:rzepak

这不是我的代码,在堆栈的某个地方找到,但请尝试以下操作:

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

SO网友:alev

下面的内容并没有准确回答问题上下文中的问题,但它确实准确回答了问题标题中的内容。

对于那些正在寻找获得wp config路径的人。从WordPress中的php,下面的工作很好。

WP CLI就是这样做的:

Source

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

结束