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.

Rendering Blade Views in WordPress

View as Markdown:

You can use the view() helper function from Acorn to render Blade templates anywhere in your WordPress site.

Rendering blocks with Blade templates

First-party blocks

In the following example we'll render a vendor/example block with resources/views/blocks/example.blade.php:

register_block_type('vendor/example', [
    'render_callback' => function ($attributes, $content) {
        return view('blocks/example', compact('attributes', 'content'));
    },
]);

In the following example register an ACF block named example and render it with resources/views/blocks/example.blade.php:

ACF blocks with Blade templates

acf_register_block_type([
    'example',
    'render_callback' => function ($block) {
        echo view('blocks/example', ['block' => $block]);
    },
]);

Existing blocks with Blade templates

In the following example we'll render the core/buttons block with resources/views/blocks/button.blade.php:

add_filter('register_block_type_args', function ($args, $name) {
    if ($name === 'core/buttons') {
        $args['render_callback'] = function ($attributes, $content) {
            return view('blocks/buttons', compact('attributes', 'content'));
        };
    }

    return $args;
}, 10, 2);

block.json render field with Blade templates

If you're registering blocks using block.json with a render field pointing to a Blade template (e.g. "render": "file:./render.blade.php"), you can automatically handle the rendering with a single filter:

add_filter('register_block_type_args', function (array $args, string $name): array {
    if (empty($args['render_callback']) || ! ($args['render_callback'] instanceof \Closure)) {
        return $args;
    }

    $reflector = new \ReflectionFunction($args['render_callback']);
    $renderCallbackVariables = $reflector->getStaticVariables();
    
    if (array_key_exists('template_path', $renderCallbackVariables) && str_ends_with($renderCallbackVariables['template_path'], '.blade.php')) {
        $args['render_callback'] = function ($attributes, $content, $block) use ($renderCallbackVariables) {
            return view()
                ->file($renderCallbackVariables['template_path'], compact('attributes', 'content', 'block'))
                ->render();
        };
    }

    return $args;
}, 1, 2);

Rendering emails with Blade templates

The following example uses the resources/views/emails/welcome.blade.php template file customizing the new WordPress user notification emails:

add_filter('wp_new_user_notification_email', function ($wp_new_user_notification_email, $user, $blogname) {
    $key = get_password_reset_key($user);
    $encoded_user_login = rawurlencode($user->user_login);
    $password_reset_link = network_site_url('wp-login.php?action=rp&key='.$key.'&login='.$encoded_user_login, 'login');

    $message = view('emails/welcome', compact('user', 'blogname', 'password_reset_link'))->render();
    $wp_new_user_notification_email['message'] = $message;
    $wp_new_user_notification_email['headers'] = ['Content-Type: text/html; charset=UTF-8'];

    return $wp_new_user_notification_email;
}, 10, 3);

Last updated