Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Wordpress Bundle Laravel Package

dreimus/wordpress-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require dreimus/wordpress-bundle
    

    Add to config/bundles.php:

    return [
        // ...
        Dreimus\WordpressBundle\DreimusWordpressBundle::class => ['all' => true],
    ];
    
  2. 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' }
    
  3. 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]);
        }
    }
    

Implementation Patterns

Core Workflows

  1. Hybrid Routing

    • Use Symfony for frontend routes (e.g., /blog/{slug}).
    • Leverage WordPress permalinks for legacy URLs (configured in dreimus_wordpress.yaml):
      permalinks:
          post: '/blog/%year%/%monthnum%/%postname%/'
      
  2. Data Integration

    • Fetch WordPress data as entities (e.g., Post, User) via the Wordpress service:
      $posts = $wp->getPosts(['posts_per_page' => 5]);
      $users = $wp->getUsers();
      
    • Use ACF (Advanced Custom Fields) data with automatic cleaning:
      $acfData = $wp->getPostMeta($post->ID, 'field_group_name');
      
  3. Template Rendering

    • Render WordPress posts in Symfony templates:
      {% for post in posts %}
          <h2>{{ post.title.rendered }}</h2>
          <div>{{ post.content.rendered|raw }}</div>
      {% endfor %}
      
  4. Media Handling

    • Resize images dynamically:
      $url = $wp->getImageUrl($attachmentId, ['width' => 300, 'height' => 200]);
      
    • Use Symfony’s Asset component for relative URLs:
      <img src="{{ asset(url) }}" alt="{{ post.title.rendered }}">
      
  5. Admin Integration

    • Add "Edit Post" buttons to custom post type archives:
      # config/packages/dreimus_wordpress.yaml
      cpt:
          my_custom_post:
              edit_button: true
      

Advanced Patterns

  • 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
    

Gotchas and Tips

Pitfalls

  1. Hidden WordPress

    • WordPress is intentionally hidden (no /wp-admin/). Access admin via Symfony routes or configure a proxy:
      # config/packages/dreimus_wordpress.yaml
      admin_route: '/wp-admin'  # Custom route for admin
      
  2. Plugin Conflicts

    • Avoid plugins that rely on themes or frontend hooks (e.g., widget/shortcode plugins). Use mu-plugins (/mu-plugins) for compatibility.
  3. Permalink Conflicts

    • Ensure Symfony routes don’t clash with WordPress permalinks. Use Symfony’s requirements in routing:
      # config/routes.yaml
      blog_index:
          path: /blog
          controller: App\Controller\PostController::index
          requirements:
              _route: ^blog($|/)
      
  4. Database Schema

    • WordPress tables are shared with Symfony. Avoid custom migrations that alter wp_* tables directly.
  5. ACF Data Cleaning

    • ACF data is sanitized by default. To bypass cleaning (e.g., for raw JSON):
      $rawData = $wp->getPostMeta($postId, 'field_name', ['clean' => false]);
      

Debugging Tips

  • 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
    

Extension Points

  1. 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']
    
  2. 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 }
    
  3. 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]'
    
  4. SVG Support Enable SVG uploads and sanitization:

    # config/packages/dreimus_wordpress.yaml
    media:
        allowed_mime_types:
            - 'image/svg+xml'
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
iio/libmergepdf
redaxo/project
zatona-eg/zatona-eg-api
patrickbussmann/oauth2-apple
3brs/enterprise-security-bundle
ardenexal/fhir-models
ardenexal/fhir-validation
dpfx/laravel-livewire-wizards
dmstr/symfony-system-resources-bundle
dmstr/symfony-job-queue-bundle
dmstr/openapi-json-schema-bundle
dmstr/keycloak-security-bundle
dmstr/doctrine-audit-log-bundle
dmstr/api-platform-utils-bundle
dmstr/api-configuration-bundle
chrisdev/ux-components
crudly/encrypted
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony