我有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
)始终以一致的方式命名。它不会成功。在那里可以将其重命名为无限替代品,例如assets
,wpcontent
,content
,not-wp-content
等等因此,创建的绝对路径不正确并导致致命的PHP错误。
是否可以创建没有一致文件夹名称的必要路径?
注意:虽然代码在WordPress环境中使用,但文档本身(style.php
)虽然最终使用创建的路径调用wp-load.php
,但无法使用WordPress API函数这实际上是一个纯PHP问题。
答案 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的情况下获得您正在寻找的内容。
需要通过以下方式找到WordPress目录的位置,以及wp-load.php的位置:
它也在WordPress数据库中,但由于表格中可以有一个可配置的前缀,因此很难明确地从中获取它。