Подстрока абсолютного пути на основе непоследовательно названной папки

У меня есть путь для 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.

0

Решение

Если вам просто нужно перейти на три папки вверх, то с помощью ../ три раза сделаю.


Я бы обычно воздерживался от добавления чего-то такого короткого (и довольно тривиального) в качестве ответа — но поскольку ответ ClarusDignus на мой предыдущий комментарий предполагает, что это звучит так, как будто это может быть подходящим и простым решением его проблемы, почему бы не сделать это ответом: -) Иногда люди просто упускают из виду наиболее очевидное решение — и, может быть, это было именно таким случаем с тем, кто написал код, с которым он сейчас имеет дело.

Пока структура самого проекта является «статической», этот метод должен работать независимо от того, на каком уровне каталога находится проект.

(Единственное обстоятельство, где я мог возможно видеть это не работает, если PHP include_path был настроен нестандартным способом — но это должно быть довольно редко.)

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

Поскольку это, как вы говорите, сайт WordPress, вы не можете получить то, что ищете, не используя WordPress.

  • Как вы говорите, каталог содержимого может называться как угодно. Но он также может быть расположен где угодно. Все, что вам нужно сделать, это определить местоположение WP_CONTENT_DIR в wp-config.php.
  • wp-load.php также может находиться где угодно, и его местоположение не обязательно связано с расположением каталога содержимого. Расположение каталога WordPress, который содержит wp-load.php, определяется в переменной ABSPATH в wp-config.php.

Расположение каталога WordPress и, следовательно, местоположение wp-load.php, должно быть найдено:

  • Конфигурация для вашей программы (не знаю, практично ли это для вас)
  • В index.php корня WordPress. Индекс должен загрузить оттуда wp-blog-header.php.

Он также находится в базе данных WordPress, но, поскольку таблицы могут иметь настраиваемый префикс, трудно получить его оттуда.

0