Skip to content

Instantly share code, notes, and snippets.

@QWp6t
Last active March 6, 2024 11:28
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save QWp6t/1e055482d722e2b02dfff1bb21698194 to your computer and use it in GitHub Desktop.
Save QWp6t/1e055482d722e2b02dfff1bb21698194 to your computer and use it in GitHub Desktop.
Fix Laravel Valet when using WordPress subdirectory multisite + Bedrock
<?php
namespace Valet\Drivers\Custom;
class BedrockMultisiteValetDriver extends \Valet\Drivers\Specific\BedrockValetDriver
{
/**
* Determine if the incoming request is for a static file.
*
* @return string|false
*/
public function isStaticFile(string $sitePath, string $siteName, string $uri)
{
$uri = $this->rewriteMultisite($sitePath, $uri);
return parent::isStaticFile($sitePath, $siteName, $uri);
}
/**
* Get the fully resolved path to the application's front controller.
*/
public function frontControllerPath(string $sitePath, string $siteName, string $uri): ?string
{
$uri = $this->rewriteMultisite($sitePath, $uri);
return parent::frontControllerPath($sitePath, $siteName, $uri);
}
/**
* Imitate the rewrite rules for a multisite .htaccess
*/
protected function rewriteMultisite(string $sitePath, string $uri): string
{
if (!$this->isMultisite($sitePath)) {
return $uri;
}
if (preg_match('#^(/[^/]+)?(?!/wp-json)(/wp-.*)#', $uri, $matches) || preg_match('#^(/[^/]+)?(/.*\.php)#', $uri, $matches)) {
return "/wp{$matches[2]}";
}
return $uri;
}
/**
* Determine if Bedrock installer is Multisite
*/
protected function isMultisite(string $sitePath): bool
{
$app = file_get_contents($sitePath.'/config/application.php');
/** {@link https://github.com/fewagency/best-practices/blob/893dfef52442eb3c4aafc197926f29dee83f3cd0/Wordpress/WordPressMultisiteValetDriver.php#L37 Regex poached from similar driver} */
return !! preg_match("/define\(\s*('|\")MULTISITE\\1\s*,\s*true\s*\)/mi", $app);
}
}
@QWp6t
Copy link
Author

QWp6t commented Dec 17, 2020

Thanks @mike-sheppard!

I went ahead and renamed it in the gist as well.

@harry-huddle
Copy link

In case anyone else is still trying to use this, it just needs updating with namespaces and type hinting to work with valet 4.

https://github.com/laravel/valet/blob/master/UPGRADE.md

e.g.

namespace Valet\Drivers\Custom;

use Valet\Drivers\Specific\BedrockValetDriver;

and

public function frontControllerPath(string $sitePath, string $siteName, string $uri): ?string

@QWp6t
Copy link
Author

QWp6t commented Jul 27, 2023

Thanks @harry-huddle! 🙏

I updated the gist to reflect the updated API.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment