子字符串基于不一致命名的文件夹的绝对路径

时间:2015-02-05 22:54:07

标签: php wordpress require absolute-path

我拥有的:

我有require_once函数的路径,该功能由 1)创建,找到特定文件夹名称的字符串位置, 2)通过将所述字符串位置用于substring文件路径。

$url    = dirname( __FILE__ ); 
//e.g. /home/somesite/public_html/wp-content/themes/some-theme

$strpos = strpos( $url, 'wp-content' ); 
//e.g. 27

$base   = substr( $url, 0, $strpos );
//e.g. /home/somesite/public_html/

require_once( $base .'wp-load.php' );

我的问题:

虽然上面的代码有效,但它假设文件夹(wp-content)始终以一致的方式命名。它不会成功。在那里可以将其重命名为无限替代品,例如assetswpcontentcontentnot-wp-content等等因此,创建的绝对路径不正确并导致致命的PHP错误。

我的问题:

是否可以创建没有一致文件夹名称的必要路径?

注意:虽然代码在WordPress环境中使用,但文档本身(style.php)虽然最终使用创建的路径调用wp-load.php,但无法使用WordPress API函数这实际上是一个纯PHP问题。

3 个答案:

答案 0 :(得分:1)

根据您提供的信息,我了解路径将始终像someFolder/themes/someTheme那样结束。 您可以从字符串的末尾开始查找并找到第三个或第四个/,具体取决于具有尾随/的路径。

$path = "/home/somesite/public_html/wp-content/themes/some-theme";
echo getBase($path); /* /home/somesite/public_html/ */

function getBase($path) {
    $i = substr($path,-1) == '/' ? 4 : 3;
    $end = strlen($path);
    $offset = 0;
    while($i > 0) {
        $end = strrpos($path, '/', -$offset);
        $offset = strlen($path) - $end+1;
        $i--;
    }
    return substr($path, 0, $end+1);
}

您也可以使用正则表达式。我几乎不知道任何正则表达式,所以它可能是一个糟糕的,但你会得到一个想法:

preg_match("/(.*)\/(.*)\/themes/", $path, $matches);
return $matches[1];

答案 1 :(得分:1)

如果您只需要三个文件夹,那么使用../三次就可以了。


我通常不会添加这么简短(而且相当简单)作为答案的东西 - 但是因为ClarusDignus回复我之前的评论表明这听起来像是一个适合他的问题的简单解决方案,为什么不做它一个答案:-)有时人们只是忽略了最明显的解决方案 - 也许这就是这里的情况,无论是谁编写了他现在处理的代码。

只要项目本身的结构是“静态的”,无论项目放在哪个目录级别,此方法都应该有效。

(唯一可以可能看到工作的情况是,如果PHP的include_path是以非标准方式配置的 - 但这应该是非常罕见。)

答案 2 :(得分:0)

由于这就是您所说的WordPress网站,因此您无法在不涉及WordPress的情况下获得您正在寻找的内容。

  • 正如您所说,内容目录可以被调用。但它也可以位于任何地方。您只需要在wp-config.php中定义位置为WP_CONTENT_DIR。
  • wp-load.php也可以在任何地方,并且它的位置不一定与内容目录的位置有关。包含wp-load.php的WordPress目录的位置在wp-config.php中的变量ABSPATH中定义。

需要通过以下方式找到WordPress目录的位置,以及wp-load.php的位置:

  • 为您的计划配置(不知道这是否适合您)
  • 在WordPress根目录的index.php中。索引需要从那里加载wp-blog-header.php。

它也在WordPress数据库中,但由于表格中可以有一个可配置的前缀,因此很难明确地从中获取它。