How do you get PHP, Symlinks and __FILE__ to work together nicely?
The problem that I see with your code is that __FILE__
resolves symlinks automatically.
From the PHP Manual on Magic Constants
... Since PHP 4.0.2,
__FILE__
always contains an absolute path with symlinks resolved ...
You can try using $_SERVER["SCRIPT_FILENAME"]
instead.
$root = realpath(dirname(dirname(dirname(dirname($_SERVER["SCRIPT_FILENAME"]))))); if (file_exists($root.'/wp-load.php')) { // WP 2.6 require_once($root.'/wp-load.php'); }
Note that I added the realpath()
function to the root directory. Depending on your setup, you may or may not need it.
EDIT: Use $_SERVER["SCRIPT_FILENAME"]
instead of $_SERVER["PHP_SELF"]
for the file system path.
Here is the solution to that issue: https://github.com/logical-and/symlink-detective
$root = dirname(dirname(dirname(dirname(__FILE__)))); if (file_exists(SymlinkDetective::detectPath($root.'/wp-load.php'))) { // WP 2.6 require_once(SymlinkDetective::detectPath($root.'/wp-load.php')); }
or you can try that
try { $root = dirname(dirname(dirname(dirname(__FILE__)))); require_once SymlinkDetective::detectPath($root.'/wp-load.php', '', false /* this would throw an exception if file doesn't exists */);}catch (Exception $e) { // nothing to do if file doesn't exists}
You can use this code snippet to get a path where symlinks are not resolved.If you don't have bash available, there's probably a different command you can use, but it works on linux enviroments.
I do think it's a malpractice that php resolves symlinks in FILE, since there's no way to get the path with symlinks. Otherwise we could easily get it using realpath.
Oh well.
<?php$output = array();exec('pwd', &$output);define('__LINK__', $output[0].substr(__FILE__, strpos(__FILE__, DIRECTORY_SEPARATOR)));?>