根据命名不一致的文件夹子串绝对路径

Substring an absolute path based on inconsistently named folder

我有:

我有一个 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 使用创建的路径,所以这实际上是一个纯粹的 PHP 问题。

根据您提供的信息,我了解到路径的结尾总是像 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];

因为根据您的说法,这是一个 WordPress 网站,如果不涉及 WordPress,您将无法获得所需的内容。

  • 如您所说,内容目录可以任意命名。但它也可以位于任何地方。您需要做的就是定义位置 WP_CONTENT_DIR in wp-config.php.
  • wp-load.php也可以在任何地方,它的位置不一定与内容目录的位置有关。包含 wp-load.php 的 WordPress 目录的位置在 wp-config.php.
  • 中的变量 ABSPATH 中定义

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

  • 你程序的配置(不知道这对你是否实用)
  • 在 WordPress 根目录的 index.php 中。索引需要从那里加载 wp-blog-header.php。

它也在 WordPress 数据库中,但由于那里的表可以有一个可配置的前缀,所以很难从那里明确地得到它。

如果只需要向上移动三个文件夹,那么使用 ../ 三次即可。


我通常会避免添加这么短(而且相当琐碎)的内容作为答案——但由于 ClarusDignus 对我之前的评论的回复表明这听起来可能是解决他的问题的合适且简单的解决方案,为什么不呢让它成为一个答案 :-) 有时人们只是忽略了最明显的解决方案——也许这就是写他现在正在处理的代码的人的情况。

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

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