У меня есть путь для 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
) не использует функции WordPress API, хотя в конечном итоге вызывает wp-load.php
используя созданный путь, так что это действительно вопрос PHP.
Если вам просто нужно перейти на три папки вверх, то с помощью ../
три раза сделаю.
Я бы обычно воздерживался от добавления чего-то такого короткого (и довольно тривиального) в качестве ответа — но поскольку ответ ClarusDignus на мой предыдущий комментарий предполагает, что это звучит так, как будто это может быть подходящим и простым решением его проблемы, почему бы не сделать это ответом: -) Иногда люди просто упускают из виду наиболее очевидное решение — и, может быть, это было именно таким случаем с тем, кто написал код, с которым он сейчас имеет дело.
Пока структура самого проекта является «статической», этот метод должен работать независимо от того, на каком уровне каталога находится проект.
(Единственное обстоятельство, где я мог возможно видеть это не работает, если PHP include_path
был настроен нестандартным способом — но это должно быть довольно редко.)
Учитывая предоставленную вами информацию, я понимаю, что путь всегда будет заканчиваться как 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.
Расположение каталога WordPress и, следовательно, местоположение wp-load.php, должно быть найдено:
Он также находится в базе данных WordPress, но, поскольку таблицы могут иметь настраиваемый префикс, трудно получить его оттуда.