Skip to content

WP Packages is our new WPackagist replacement that's 17x faster and updates every 5 minutes

Acorn

Roots is an independent open source org, supported only by developers like you. We’ve been improving the WordPress developer experience since 2011, and your support keeps it independent.

Laravel Routing in WordPress

View as Markdown:

See Laravel's routing documentation to better understand how routing works in Acorn

Acorn allows you to use Laravel's routing functionality on your WordPress sites, and will automatically handle Laravel routes defined in the routes/web.php file if it exists.

Routes are an easier way to implement virtual pages in WordPress.

Basic routing example

Create the route file

Create routes/web.php with the following:

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application.
|
*/

Route::view('/welcome/', 'welcome')->name('welcome');

Create the view file

Create resources/views/welcome.blade.php with the following:

@extends('layouts.app')

@section('content')
  <h1>Welcome</h1>
@endsection

Update Acorn's configuration

Find where Application::configure is used in your setup. On a Sage theme, this would be functions.php.

Add ->withRouting(web: base_path('routes/web.php')):

 Application::configure()
     ->withProviders([
         App\Providers\ThemeServiceProvider::class,
     ])
+    ->withRouting(web: base_path('routes/web.php'))
     ->boot();

See Advanced booting for more examples.

Configuring SEO elements

Since registered routes are dynamic, WordPress is not aware of how to handle some SEO elements and functionality:

  • Setting the canonical URL
  • Setting the <title>
  • Adding SEO-related meta data
  • Adding pages to the sitemap

Laravel's Route facade allows you to access information about the route, which can be used with hooks to populate this data:

/**
 * Set the page <title> for the welcome route
 */
add_filter('pre_get_document_title', function ($title) {
    $name = Route::currentRouteName();
    if ($name === 'welcome') {
        return 'Welcome Page';
    }

    return $name;
});

Advanced routing features

For more complex applications, you can use:

Using controllers

Instead of defining route logic directly in your routes file, you can organize it into controller classes:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

Route::get('/api/posts', [PostController::class, 'index']);
Route::get('/api/posts/{id}', [PostController::class, 'show']);

Applying middleware

Protect routes with middleware for authentication, rate limiting, and more:

Route::middleware('auth')->group(function () {
    Route::post('/api/posts', [PostController::class, 'store']);
    Route::put('/api/posts/{id}', [PostController::class, 'update']);
});

Route caching

If you're using routes then you should enable Laravel's route cache during your deployment process:

$ wp acorn route:cache

Last updated