Tengo un proyecto Laravel en mi carpeta public_html . El dominio es, por ejemplo, dominio.com. Mi archivo .htaccess (en la carpeta public_html) es así:
RewriteEngine On RewriteRule ^(.*)$ public/$1 [L]
Hay las siguientes rutas:
Entonces, un ejemplo de una URL es http://domain.com/appointment .
Ahora me gustaría tener un sitio web de wordpress en domain.com. Entonces, cuando vayas a domain.com, verás el sitio web de wordpress. Pero también quiero tener las URL como / cita de mi proyecto laravel.
¿Cuál es la forma más fácil y limpia de hacer esto?
Puede crear un enlace simbólico al directorio público de WordPress en la carpeta Laravel. Por ejemplo, wp
:
/var /www /laravel /public /wp #(symlink to -> /var/www/wordpress/public_html) index.php .htaccess /wordpress /public_html index.php .htaccess
Y describe las rutas de Laravel en .htaccess. Ejemplo de código de /var/www/laravel/public/.htaccess
:
Options -MultiViews RewriteEngine On RewriteCond %{ENV:REDIRECT_FINISH} . RewriteRule ^ - [L] # Laravel RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME} !.*\.php$ RewriteRule ^(.*)$ $1 [E=FINISH:1,L] RewriteCond %{REQUEST_URI} ^/(api/licenseplate)(\?.*|$) [OR] RewriteCond %{REQUEST_URI} ^/(api/calendar)(\?.*|$) [OR] RewriteCond %{REQUEST_URI} ^/(admin/settings)(\?.*|$) [OR] RewriteCond %{REQUEST_URI} ^/(admin/appointments)(\?.*|$) [OR] RewriteCond %{REQUEST_URI} ^/(appointment)(\?.*|$) [OR] RewriteCond %{REQUEST_URI} ^/(auth/login)(\?.*|$) RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [E=FINISH:1,L] # WordPress RewriteCond %{REQUEST_URI} !^/wp RewriteRule ^(.*)$ /wp/$1 [E=FINISH:1,L]
Código de /var/www/wordpress/public_html/.htaccess
(solo copia de tu wordpress .htaccess):
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
.htaccess
archivos .htaccess
proporcionan una forma de realizar cambios de configuración por directorio. Esto significa que solo necesita dirigir la solicitud al directorio que tendrá reglas sobre cómo procesar mejor la solicitud. Por lo tanto, dejará los archivos .htaccess
que vienen con Laravel y WordPress en sus directorios. Simplemente crea otro para el directorio principal que los mantiene a ambos.
A continuación se supone que la ruta completa de public_html
es /var/www/public_html
.
/var/www/public_html/laravel /var/www/public_html/wp
# Limit Access To Laravel Public Folder Order Deny,allow Deny from all Allow from all # Rewrite Requests RewriteEngine On # Do Not Rewrite Directory And File Requests RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.*)$ $1 [L] # Rewrite Laravel Routes RewriteCond %{REQUEST_URI} api/licenseplate [OR] RewriteCond %{REQUEST_URI} api/calendar [OR] RewriteCond %{REQUEST_URI} admin/settings [OR] RewriteCond %{REQUEST_URI} admin/appointments [OR] RewriteCond %{REQUEST_URI} appointment [OR] RewriteCond %{REQUEST_URI} auth/login RewriteRule ^(.*)$ laravel/public/$1 [L] # Rewrite To WordPress For Everything Else RewriteRule ^(.*)$ wp/$1 [L]
Tanto Laravel como WordPress tienen formas de generar enlaces a sus activos (imágenes, CSS, JavaScript).
WordPress está diseñado para permitir fácilmente la instalación en un subdirectorio, por lo que solo necesita cambiar la dirección de WordPress y la dirección del sitio en la pantalla de configuración general .
Laravel supone que está instalado en el directorio superior. El helper asset()
se usa para generar rutas a archivos de activos. Por lo tanto, deberá anular la función predeterminada con una propia. Aquí es cómo:
app/helpers.php
con estos contenidos /** * Generate an asset path for the application * with the installation sub-directory * prepended to the path. * * @param string $path * @param bool $secure * @return string */ function asset($path, $secure = null) { $path = ltrim($path, '/'); $dir = basename(dirname(__DIR__)) . '/public'; $url = app('url')->asset($path, $secure); return str_replace($path, $dir . '/' . $path, $url); }
app/helpers.php
al proceso de autocarga editando composer.json
"autoload": { //... "files": [ "app/helpers.php" ] },
composer dump-autoload
Este es un enfoque que tomé cuando encontré una situación similar. Instale su wordpress
en el directorio public_html
y preferiblemente coloque su laravel application
en el directorio de WP:
wp-admin/ wp-content/ wp-includes/ ... other wordpress files ... app/ <-- laravel application |-> app/ |-> bootstrap/ |-> config/ |-> public/ |-> ... other laravel files and directories ...
Ahora, para tener las
WordPress functions
disponibles en suLaravel application
, incluyawp-load.php
en su instalación deLaravel
y luego puede usar lasenqueueing functions
deWordPress
para cargar los recursos que necesita.
El mejor enfoque es seguir la architecture del proveedor de servicios Laravel. Escriba un proveedor de servicios para incluir wp-load.php
y use la boot function
para cargar activos:
// app/Providers/WordPressServiceProvider.php class WordPressServiceProvider extends ServiceProvider { protected $bootstrapFilePath = '../../wp-load.php'; // Adjust ur path public function boot() { // Load assets wp_enqueue_style('app', '/app/public/app.css'); // Adjust ur path } public function register() { // Load wordpress bootstrap file if(File::exists($this->bootstrapFilePath)) { require_once $this->bootstrapFilePath; } else throw new \RuntimeException('WordPress Bootstrap file not found!'); } }
Y agregue el proveedor de servicios a su configuración de aplicación laravel, config/app.php:
/* ... */ 'providers' => [ // ... /* * Application Service Providers... */ // ... App\Providers\WordPressServiceProvider::class,
Ahora tenemos acceso a nuestras funciones de WordPress dentro de Laravel y podemos alterar las views
laravel a algo como:
{!! get_header() !!} Laravel 5 {{ Inspiring::quote() }} {!! get_footer() !!}
Su sitio de wordpress debe estar accesible en www.urdomain.com
y en la aplicación laravel en url www.urdomain.com/app/appointment
o ajuste su .htaccess
si desea un patrón de URL diferente. Espero que esto ayude.