-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
WordPressMultisiteSubdirectoryValetDriver.php
99 lines (83 loc) · 3.43 KB
/
WordPressMultisiteSubdirectoryValetDriver.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
namespace Valet\Drivers\Custom;
use Valet\Drivers\BasicValetDriver;
class WordPressMultisiteSubdirectoryValetDriver extends BasicValetDriver
{
public $wp_root = false; // "wp"
/**
* Determine if the driver serves the request.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves(string $sitePath, string $siteName, string $uri): bool
{
// Look for MULTISITE in wp-config.php. It should be there for multisite installs.
return file_exists($sitePath . '/wp-config.php') && strpos( file_get_contents($sitePath . '/wp-config.php'), 'MULTISITE') !== false;
}
/**
* Get the fully resolved path to the application's front controller.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath(string $sitePath, string $siteName, string $uri): ? string
{
$_SERVER['PHP_SELF'] = $uri;
$_SERVER['SERVER_ADDR'] = '127.0.0.1';
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
// If URI contains one of the main WordPress directories, and it's not a request for the Network Admin,
// drop the subdirectory segment before routing the request
if ( ( stripos($uri, 'wp-admin') !== false || stripos($uri, 'wp-content') !== false || stripos($uri, 'wp-includes') !== false ) ) {
if ( stripos($uri, 'wp-admin/network') === false ) {
$uri = substr($uri, stripos($uri, '/wp-') );
}
if ( $this->wp_root !== false && file_exists($sitePath . "/{$this->wp_root}/wp-admin") ) {
$uri = "/{$this->wp_root}" . $uri;
}
}
// Handle wp-cron.php properly
if ( stripos($uri, 'wp-cron.php') !== false ) {
$new_uri = substr($uri, stripos($uri, '/wp-') );
if ( file_exists( $sitePath . $new_uri ) ) {
return $sitePath . $new_uri;
}
}
return parent::frontControllerPath(
$sitePath, $siteName, $this->forceTrailingSlash($uri)
);
}
public function isStaticFile(string $sitePath, string $siteName, string $uri)
{
// If the URI contains one of the main WordPress directories and it doesn't end with a slash,
// drop the subdirectory from the URI and check if the file exists. If it does, return the new uri.
if ( stripos($uri, 'wp-admin') !== false || stripos($uri, 'wp-content') !== false || stripos($uri, 'wp-includes') !== false ) {
if ( substr($uri, -1, 1) == "/" ) return false;
$new_uri = substr($uri, stripos($uri, '/wp-') );
if ( $this->wp_root !== false && file_exists($sitePath . "/{$this->wp_root}/wp-admin") ) {
$new_uri = "/{$this->wp_root}" . $new_uri;
}
if ( file_exists( $sitePath . $new_uri ) ) {
return $sitePath . $new_uri;
}
}
return parent::isStaticFile( $sitePath, $siteName, $uri );
}
/**
* Redirect to uri with trailing slash.
*
* @param string $uri
* @return string
*/
private function forceTrailingSlash($uri): ? string
{
if (substr($uri, -1 * strlen('/wp-admin')) == '/wp-admin') {
header('Location: '.$uri.'/'); die;
}
return $uri;
}
}