Skip to content

Ikhtisar Chapter 28: block.json & render.php (Pendekatan Modern)

Apa yang Dipelajari?

Cara modern dan resmi WordPress untuk membuat custom blocks menggunakan block.json dan render.php — menggantikan class PHP manual (JSXBlock, PlaceholderBlock) dari chapter sebelumnya. Jauh lebih bersih dan sederhana.


Poin Utama

1. Mengapa Pendekatan Modern?

Cara Lama (Chapter 27)Cara Baru (Chapter 28)
Class PHP manual (JSXBlock, PlaceholderBlock)block.json = semua metadata di satu file
Entry point manual di package.jsonAuto-detection subfolder oleh @wordpress/scripts
wp_register_script + register_block_typeregister_block_type_from_metadata() = 1 baris PHP
wp_localize_script per blockData langsung tersedia

Tiga alasan historis kenapa cara manual dipelajari dulu:

  • block.json baru ada pertengahan 2021
  • @wordpress/scripts dulu tidak support multiple blocks otomatis
  • Interactivity API baru ada April 2024

2. Struktur Folder Modern

Setiap block = subfolder di src/ dengan 3 file:

src/
├── footer/
│   ├── block.json      ← Metadata (nama, attributes, supports)
│   ├── render.php      ← HTML untuk front-end
│   └── index.js        ← JavaScript untuk editor
├── banner/
│   ├── block.json
│   ├── render.php
│   ├── edit.js          ← JSX editor (untuk block kompleks)
│   └── index.js
└── genericheading/
    ├── block.json
    └── index.js          ← Tanpa render.php (HTML statis)

@wordpress/scripts otomatis mendeteksi semua subfolder yang punya block.json — tidak perlu konfigurasi apapun.


3. File block.json

json
{
  "$schema": "https://schemas.wp.org/trunk/block.json",
  "apiVersion": 3,
  "name": "ourblocktheme/banner",
  "title": "Banner",
  "supports": { "align": ["full"] },
  "attributes": {
    "imgID": { "type": "number" },
    "imgURL": { "type": "string" }
  },
  "editorScript": "file:./index.js",
  "render": "file:./render.php"
}

Attributes yang sebelumnya di JavaScript sekarang pindah ke block.json.


4. useBlockProps (API Version 3)

Dengan apiVersion: 3, block wajib dibungkus wrapper div agar bisa diklik/diseleksi di editor:

jsx
import { useBlockProps } from "@wordpress/block-editor";

export default function Edit() {
  const blockProps = useBlockProps();
  return (
    <div {...blockProps}>
      {/* konten block */}
    </div>
  );
}

Tanpa useBlockProps → block tidak bisa dipilih, tidak ada border biru.


5. Registrasi di PHP — Cuma 1 Baris!

php
function ourNewBlocks() {
  register_block_type_from_metadata(__DIR__ . "/build/footer");
  register_block_type_from_metadata(__DIR__ . "/build/banner");
  // ... dst
}
add_action("init", "ourNewBlocks");

Path menunjuk ke build/ (bukan src/) karena @wordpress/scripts compile dari src/ ke build/.


6. Block Tanpa render.php

Block seperti generic heading dan generic button menyimpan HTML statis di database — tidak perlu server-side rendering:

  • block.json tanpa property "render"
  • Punya save function di JavaScript yang return HTML
  • Lebih cepat (tidak ada PHP setiap request), tapi kurang fleksibel

7. Proses Migrasi dari Cara Lama

Untuk setiap block:

  1. Comment out class lama di functions.php
  2. Buat subfolder di src/ dengan block.json, index.js, render.php
  3. Pindahkan JSX editor ke edit.js
  4. Pindahkan attributes ke block.json
  5. Tambahkan useBlockProps wrapper
  6. Daftarkan dengan register_block_type_from_metadata()

8. Workflow & Build Tasks

bash
npm start         # Watch mode untuk CSS/JS non-block (src/index.js)
npm run blocks    # Watch mode untuk semua blocks (auto-detect block.json)
npm run build     # Build production sekali jalan (index + blocks)

Saat development butuh dua terminal: satu npm start, satu npm run blocks.

Package npm-run-all digunakan untuk menggabungkan build tasks secara sequential.


Satu Kalimat

Chapter ini mengajarkan cara modern membuat WordPress blocks menggunakan block.json dan render.php — jauh lebih bersih dari cara manual, dengan auto-detection, 1 baris registrasi PHP, dan workflow build yang rapi.