Installation
composer require dreimus/wordpress-bundle
Add to config/bundles.php:
return [
// ...
Dreimus\WordpressBundle\DreimusWordpressBundle::class => ['all' => true],
];
Configure
Create config/packages/dreimus_wordpress.yaml:
dreimus_wordpress:
install: true # Auto-install WordPress on first request
path: '%kernel.project_dir%/var/wordpress'
plugins:
- { path: 'vendor/dreimus/wordpress-bundle/mu-plugins' }
First Use Case Access WordPress functions in a Symfony controller:
use Symfony\Component\HttpFoundation\Response;
use Dreimus\WordpressBundle\Wordpress;
class PostController extends AbstractController
{
public function show(Wordpress $wp, int $id): Response
{
$post = $wp->getPost($id);
return $this->render('post/show.html.twig', ['post' => $post]);
}
}
Hybrid Routing
/blog/{slug}).dreimus_wordpress.yaml):
permalinks:
post: '/blog/%year%/%monthnum%/%postname%/'
Data Integration
Post, User) via the Wordpress service:
$posts = $wp->getPosts(['posts_per_page' => 5]);
$users = $wp->getUsers();
$acfData = $wp->getPostMeta($post->ID, 'field_group_name');
Template Rendering
{% for post in posts %}
<h2>{{ post.title.rendered }}</h2>
<div>{{ post.content.rendered|raw }}</div>
{% endfor %}
Media Handling
$url = $wp->getImageUrl($attachmentId, ['width' => 300, 'height' => 200]);
Asset component for relative URLs:
<img src="{{ asset(url) }}" alt="{{ post.title.rendered }}">
Admin Integration
# config/packages/dreimus_wordpress.yaml
cpt:
my_custom_post:
edit_button: true
Caching Invalidate Symfony cache when WordPress content changes (Varnish-compatible):
$wp->invalidateCache();
Multisite Support Sync images across multisite installations for multilingual setups:
multisite:
sync_images: true
Backup Management Trigger backups via CLI or admin:
php bin/console dreimus:wordpress:backup
Hidden WordPress
/wp-admin/). Access admin via Symfony routes or configure a proxy:
# config/packages/dreimus_wordpress.yaml
admin_route: '/wp-admin' # Custom route for admin
Plugin Conflicts
/mu-plugins) for compatibility.Permalink Conflicts
requirements in routing:
# config/routes.yaml
blog_index:
path: /blog
controller: App\Controller\PostController::index
requirements:
_route: ^blog($|/)
Database Schema
wp_* tables directly.ACF Data Cleaning
$rawData = $wp->getPostMeta($postId, 'field_name', ['clean' => false]);
Enable Debug Mode
# config/packages/dreimus_wordpress.yaml
debug: true
Logs WordPress errors to Symfony’s var/log/dev.log.
Check WordPress Errors Use Symfony’s profiler to inspect WordPress notices/warnings:
if ($wp->hasErrors()) {
foreach ($wp->getErrors() as $error) {
error_log($error);
}
}
Maintenance Mode Enable during updates:
maintenance: true
Or via CLI:
php bin/console dreimus:wordpress:maintenance --enable
Custom Entities
Extend the Wordpress service to add custom query methods:
// src/Service/CustomWordpress.php
class CustomWordpress extends \Dreimus\WordpressBundle\Wordpress
{
public function getCustomPosts(array $args = []): array
{
return $this->queryPosts('my_custom_post_type', $args);
}
}
Register as a service in config/services.yaml:
services:
App\Service\CustomWordpress:
decorates: 'dreimus_wordpress.wordpress'
arguments: ['@.inner']
Event Listeners Hook into WordPress actions/filters via Symfony events:
// src/EventListener/WordpressListener.php
class WordpressListener
{
public function onKernelRequest(GetResponseEvent $event)
{
if ($event->isMasterRequest()) {
add_filter('the_content', [$this, 'modifyContent']);
}
}
public function modifyContent($content)
{
return str_replace('foo', 'bar', $content);
}
}
Register in services.yaml:
services:
App\EventListener\WordpressListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Custom Permalinks Override permalink logic for custom post types:
# config/packages/dreimus_wordpress.yaml
permalinks:
custom_post:
pattern: '/custom/%post_id%/'
rewrite_rules:
- '^custom/(\d+)/$ => index.php?p=$matches[1]'
SVG Support Enable SVG uploads and sanitization:
# config/packages/dreimus_wordpress.yaml
media:
allowed_mime_types:
- 'image/svg+xml'
How can I help you explore Laravel packages today?