Skip to content

WP Training Website

WP Training Website is a blog platform where anyone can post and share their thoughts. All content on the website is free, as we believe in the freedom of code.

Menu
  • Guest Blogging
  • Build Your Site
Menu

Developing Gutenberg Plugins with Vue

Posted on February 7, 2025

Level Up Your Gutenberg Blocks: Building Powerful Plugins with Vue.js

Gutenberg, WordPress’s revolutionary block editor, offers unparalleled flexibility for building custom website experiences. While WordPress’s default JavaScript API provides a solid foundation, integrating a powerful framework like Vue.js significantly enhances development speed, component reusability, and overall developer experience. This blog post will guide you through the process of creating a sophisticated Gutenberg plugin powered by Vue.js, covering everything from setup to advanced features.

1. Project Setup and Dependencies:

First, create a new directory for your plugin. We’ll call it vue-gutenberg-block. Inside, create the following files:

  • gutenberg-plugin.php: The main plugin file.
  • src/: This directory will contain your Vue.js components and related assets.
  • src/components/MyVueBlock.vue: Our main Vue component for the block.
  • webpack.config.js: Webpack configuration for bundling your Vue.js code.

Let’s start with gutenberg-plugin.php:

<?php
/**
 * Plugin Name:       My Vue Gutenberg Block
 * Plugin URI:        https://yourwebsite.com/
 * Description:       A Gutenberg block powered by Vue.js.
 * Version:           1.0.0
 * Author:            Your Name
 * Author URI:        https://yourwebsite.com/
 * License:           GPL2
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       my-vue-gutenberg-block
 */

// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
    die;
}

// Enqueue scripts and styles.
function my_vue_gutenberg_block_enqueue_scripts() {
    wp_enqueue_script(
        'my-vue-gutenberg-block-script',
        plugins_url( 'src/main.js', __FILE__ ),
        array( 'wp-blocks', 'wp-element', 'wp-i18n', 'wp-components' ),
        '1.0.0',
        true
    );
    wp_enqueue_style(
        'my-vue-gutenberg-block-style',
        plugins_url( 'src/style.css', __FILE__ ),
        array(),
        '1.0.0'
    );
}
add_action( 'enqueue_block_editor_assets', 'my_vue_gutenberg_block_enqueue_scripts' );

// Register the block.  (This part will be handled dynamically later)
//add_action( 'init', 'register_my_vue_gutenberg_block' );

//function register_my_vue_gutenberg_block() {
//  register_block_type( 'my-plugin/my-vue-block', array(
//    'render_callback' => 'my_vue_gutenberg_block_render_callback',
//  ) );
//}

//function my_vue_gutenberg_block_render_callback( $attributes, $content ) {
//  // Handle frontend rendering.
//}

Next, create src/components/MyVueBlock.vue:

<template>
  <div class="wp-block-my-vue-block">
    <h1>Hello from Vue.js in Gutenberg!</h1>
    <p>This is a dynamic block.</p>
    <input type="text" v-model="inputValue" placeholder="Enter text">
    <p>Input Value: {{ inputValue }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    };
  }
};
</script>

<style scoped>
.wp-block-my-vue-block {
  background-color: #f0f0f0;
  padding: 20px;
}
</style>

This simple Vue component displays a heading, paragraph and a text input, demonstrating basic data binding.

2. Webpack Configuration (webpack.config.js):

We need Webpack to bundle our Vue.js components and assets. Create webpack.config.js:

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'main.js'
  },
  module: {
    rules: [
      {
        test: /.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  },
  resolve: {
    extensions: ['.js', '.vue']
  }
};

This configuration tells Webpack to use vue-loader for .vue files and css-loader and style-loader for CSS.

3. Entry Point (src/main.js):

This file will register our block with Gutenberg. Create src/main.js:

import { registerBlockType } from '@wordpress/blocks';
import MyVueBlock from './components/MyVueBlock.vue';

const { render, Component } = wp.element;

wp.blocks.registerBlockType( 'my-plugin/my-vue-block', {
    edit: props => {
        return render( <Component {...props} component={MyVueBlock} /> )
    },
    save: props => {
        return null; // Handle rendering on frontend. Often empty for dynamic content.
    }
} );

This uses the WordPress wp.element and wp.blocks APIs to register our block. Note that save returns null. This is because the frontend rendering is often handled completely by JavaScript and doesn’t require a PHP callback.

4. Building and Activating:

Before activating the plugin, you need to install the necessary packages:

npm install vue vue-loader css-loader style-loader webpack webpack-cli

Then, build your assets:

npx webpack

This will create a build directory containing the bundled main.js. Make sure to copy the build directory contents (main.js) into your plugin directory.

5. Adding Attributes and Dynamic Content:

Let’s enhance our block with attributes. Modify src/components/MyVueBlock.vue:

<template>
  <div class="wp-block-my-vue-block">
    <h1 v-if="attributes.showHeading">{{attributes.heading}}</h1>
    <p v-if="attributes.showParagraph">{{ attributes.paragraph }}</p>
    <input type="text" v-model="attributes.textInput" placeholder="Enter text">
    <p>Input Value: {{ attributes.textInput }}</p>
  </div>
</template>

<script>
export default {
  props: ['attributes', 'setAttributes']
};
</script>

Now, modify src/main.js:

import { registerBlockType } from '@wordpress/blocks';
import MyVueBlock from './components/MyVueBlock.vue';

const { render, Component } = wp.element;

wp.blocks.registerBlockType( 'my-plugin/my-vue-block', {
    attributes: {
        showHeading: { type: 'boolean', default: true },
        heading: { type: 'string', default: 'My Vue Block' },
        showParagraph: { type: 'boolean', default: true },
        paragraph: { type: 'string', default: 'This is a paragraph' },
        textInput: { type: 'string', default: '' }
    },
    edit: props => {
        return render( <Component {...props} component={MyVueBlock} /> )
    },
    save: props => {
        return null; // Handle rendering on frontend. Often empty for dynamic content.
    }
} );

This adds attributes that control the visibility of the heading and paragraph, and allows for a dynamic heading text and paragraph content. The setAttributes function is now automatically passed to your Vue component, allowing you to update attributes from within your Vue component.

6. Advanced Features:

  • API Integration: Fetch data from external APIs using axios or fetch within your Vue component and display the results dynamically in your block.
  • Component Reusability: Create reusable Vue components that can be used across multiple Gutenberg blocks.
  • State Management: For complex blocks, consider using a state management library like Vuex to manage your application’s state.
  • Server-Side Rendering (SSR): For improved performance, explore server-side rendering of your Vue components. This requires more advanced configuration and may involve using libraries like Nuxt.js or Next.js alongside your WordPress setup.

7. Conclusion:

By combining the power of Gutenberg with the efficiency of Vue.js, you can create highly interactive and dynamic WordPress blocks. This approach significantly enhances development productivity, code maintainability, and the overall user experience. While this tutorial provides a basic framework, the possibilities are vast. Experiment with different Vue.js features, explore the WordPress block editor API further, and build impressive custom blocks that will elevate your WordPress projects. Remember to always test thoroughly across different browsers and devices. This setup provides a solid foundation upon which you can create extremely versatile and complex Gutenberg blocks. The key is to understand both the WordPress block API and the power of Vue.js for creating reusable and maintainable components. Remember to adjust paths and filenames to match your project structure. Happy coding!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • Building Real-Time Content Blocks with Vue and Websockets
  • Vue.js for Toggle Blocks in WordPress
  • Customizing WooCommerce with Vue in Gutenberg
  • Building Block Conditional Options with Vue Watchers
  • Extending Block Editor Tools with Vue-Powered UI

Recent Comments

  1. Hairstyles on CORS error while fetching data from WordPress REST API in Vue
  2. เอ้กไทย on The Future of Headless WordPress in Web Development
  3. คาสิโนออนไลน์เว็บตรง on The Future of Headless WordPress in Web Development
  4. NormandTONGE on How to Build a Headless WordPress Dashboard
  5. RaymondApedo on How to Build a Headless WordPress Dashboard

Categories

  • E-commerce with WordPress
  • Plugin Reviews
  • Security Tips
  • SEO for WordPress
  • The Daily Blend
  • Theme Customization
  • WordPress Tutorials
  • WordPress Updates
©2025 WP Training Website | Design: Newspaperly WordPress Theme