Skip to content

Media Blocks

This page documents the media block handlers available in WP Block to HTML.

Overview

Media blocks handle various forms of media content in WordPress, such as images, galleries, audio, video, and more. WP Block to HTML provides optimized handlers for all WordPress core media blocks.

Importing Media Block Handlers

You can import individual media block handlers for optimized bundle size:

javascript
import { imageBlockHandler } from 'wp-block-to-html/blocks/media';
import { galleryBlockHandler } from 'wp-block-to-html/blocks/media';
import { coverBlockHandler } from 'wp-block-to-html/blocks/media';

Or import all media block handlers at once:

javascript
import * as mediaBlockHandlers from 'wp-block-to-html/blocks/media';

Available Media Block Handlers

Image Block

Handles the core/image block type.

javascript
// Example input
const imageBlock = {
  blockName: 'core/image',
  attrs: {
    id: 123,
    url: 'https://example.com/image.jpg',
    alt: 'Example image',
    width: 800,
    height: 600,
    align: 'center',
    caption: 'An example image'
  },
  innerContent: ['<figure class="wp-block-image aligncenter size-full"><img src="https://example.com/image.jpg" alt="Example image" width="800" height="600"/><figcaption>An example image</figcaption></figure>']
};

// Example output with default CSS
// <figure class="wp-block-image aligncenter size-full">
//   <img src="https://example.com/image.jpg" alt="Example image" width="800" height="600"/>
//   <figcaption>An example image</figcaption>
// </figure>

// Example output with Tailwind CSS
// <figure class="mx-auto">
//   <img src="https://example.com/image.jpg" alt="Example image" width="800" height="600" class="w-full"/>
//   <figcaption class="text-center text-sm text-gray-600">An example image</figcaption>
// </figure>

Handles the core/gallery block type.

javascript
// Example input
const galleryBlock = {
  blockName: 'core/gallery',
  attrs: {
    ids: [123, 456, 789],
    columns: 3,
    linkTo: 'none'
  },
  innerContent: [/* ... */],
  innerBlocks: [
    // Each gallery item is a separate block
    {
      blockName: 'core/image',
      attrs: {
        id: 123,
        url: 'https://example.com/image1.jpg',
        alt: 'Image 1'
      },
      innerContent: [/* ... */]
    },
    // More gallery items...
  ]
};

// Example output with Tailwind CSS
// <figure class="wp-block-gallery">
//   <ul class="grid grid-cols-3 gap-4">
//     <li class="block">
//       <figure>
//         <img src="https://example.com/image1.jpg" alt="Image 1" class="w-full h-auto"/>
//       </figure>
//     </li>
//     <!-- More gallery items... -->
//   </ul>
// </figure>

Cover Block

Handles the core/cover block type.

javascript
// Example input
const coverBlock = {
  blockName: 'core/cover',
  attrs: {
    url: 'https://example.com/background.jpg',
    id: 123,
    dimRatio: 50,
    overlayColor: 'primary',
    minHeight: 400,
    align: 'full'
  },
  innerContent: [/* ... */],
  innerBlocks: [
    {
      blockName: 'core/paragraph',
      attrs: {
        align: 'center',
        placeholder: 'Write title…',
        fontSize: 'large'
      },
      innerContent: ['<p class="has-text-align-center has-large-font-size">Cover Title</p>']
    }
  ]
};

// Example output with Tailwind CSS
// <div class="relative flex items-center justify-center p-8 overflow-hidden bg-cover bg-center min-h-[400px] w-full"
//      style="background-image: url('https://example.com/background.jpg')">
//   <div class="absolute inset-0 bg-primary-500 opacity-50"></div>
//   <div class="relative z-10 w-full">
//     <p class="text-center text-2xl text-white">Cover Title</p>
//   </div>
// </div>

Video Block

Handles the core/video block type.

javascript
// Example input
const videoBlock = {
  blockName: 'core/video',
  attrs: {
    id: 123,
    src: 'https://example.com/video.mp4',
    poster: 'https://example.com/poster.jpg',
    caption: 'Example video'
  },
  innerContent: [/* ... */]
};

// Example output
// <figure class="wp-block-video">
//   <video controls src="https://example.com/video.mp4" poster="https://example.com/poster.jpg"></video>
//   <figcaption>Example video</figcaption>
// </figure>

Audio Block

Handles the core/audio block type.

javascript
// Example input
const audioBlock = {
  blockName: 'core/audio',
  attrs: {
    id: 123,
    src: 'https://example.com/audio.mp3',
    caption: 'Example audio'
  },
  innerContent: [/* ... */]
};

// Example output
// <figure class="wp-block-audio">
//   <audio controls src="https://example.com/audio.mp3"></audio>
//   <figcaption>Example audio</figcaption>
// </figure>

Media & Text Block

Handles the core/media-text block type.

javascript
// Example input
const mediaTextBlock = {
  blockName: 'core/media-text',
  attrs: {
    mediaId: 123,
    mediaUrl: 'https://example.com/image.jpg',
    mediaPosition: 'left',
    mediaWidth: 50
  },
  innerContent: [/* ... */],
  innerBlocks: [
    {
      blockName: 'core/paragraph',
      attrs: {},
      innerContent: ['<p>Content next to media</p>']
    }
  ]
};

// Example output with Tailwind CSS
// <div class="grid grid-cols-2 gap-4 items-center">
//   <div class="col-span-1">
//     <figure>
//       <img src="https://example.com/image.jpg" alt="" class="w-full"/>
//     </figure>
//   </div>
//   <div class="col-span-1">
//     <p>Content next to media</p>
//   </div>
// </div>

Embed Block

Handles the core/embed block type and its variations (YouTube, Vimeo, Twitter, etc.).

javascript
// Example input
const embedBlock = {
  blockName: 'core/embed',
  attrs: {
    url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
    type: 'video',
    providerNameSlug: 'youtube',
    responsive: true,
    align: 'wide'
  },
  innerContent: [/* ... */]
};

// Example output
// <figure class="wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio alignwide">
//   <div class="wp-block-embed__wrapper">
//     <iframe width="560" height="315" src="https://www.youtube.com/embed/dQw4w9WgXcQ" 
//             frameborder="0" allowfullscreen></iframe>
//   </div>
// </figure>

Lazy Loading Media Elements

TIP

The SSR optimization module automatically adds loading="lazy" to images and other media elements (except the first one for LCP).

To manually add lazy loading to media elements:

javascript
import { convertBlocks } from 'wp-block-to-html';

const html = convertBlocks(blockData, {
  ssrOptions: {
    enabled: true,
    optimizeImages: true
  }
});

CSS Framework Integration

Media blocks have specific mappings for different CSS frameworks:

Tailwind CSS

javascript
// Image block with Tailwind CSS
const html = convertBlocks(imageBlock, { cssFramework: 'tailwind' });
// <figure class="mx-auto">
//   <img src="..." alt="..." class="w-full h-auto" />
//   <figcaption class="text-center text-sm text-gray-600">...</figcaption>
// </figure>

Bootstrap

javascript
// Image block with Bootstrap
const html = convertBlocks(imageBlock, { cssFramework: 'bootstrap' });
// <figure class="figure text-center">
//   <img src="..." alt="..." class="figure-img img-fluid" />
//   <figcaption class="figure-caption">...</figcaption>
// </figure>

Custom Media Block Handlers

You can create custom media block handlers for specific needs:

javascript
import { createBlockHandler, convertBlocks } from 'wp-block-to-html';

const customImageHandler = createBlockHandler('core/image', {
  transform(block, options) {
    const { attrs = {}, innerContent = [] } = block;
    const { url, alt = '', width, height, align } = attrs;
    
    // Example: Add a lightbox attribute to all images
    return `
      <figure class="${align === 'center' ? 'text-center' : ''}">
        <img src="${url}" alt="${alt}" width="${width}" height="${height}" class="lightbox-image" data-lightbox="gallery" />
        ${attrs.caption ? `<figcaption>${attrs.caption}</figcaption>` : ''}
      </figure>
    `;
  }
});

const html = convertBlocks(blockData, {
  blockTransformers: {
    'core/image': customImageHandler
  }
});

Released under the MIT License.