Blog

Poza Podstawowymi Blokami: Tworzenie Niestandardowych Bloków Gutenberga dla Ulepszonej Funkcjonalności WordPress

Odblokuj pełny potencjał Edytora Bloków WordPress, ucząc się tworzyć własne niestandardowe bloki Gutenberga. Ten przewodnik zawiera praktyczne kroki, przykłady kodu i najlepsze praktyki dotyczące rozszerzania funkcjonalności i projektowania Twojej witryny.

Podsumowanie

Edytor Bloków WordPress, Gutenberg, zrewolucjonizował tworzenie treści dzięki swojemu modułowemu systemowi bloków. Chociaż podstawowe bloki oferują wszechstronność, niestandardowe bloki są niezbędne do unikalnych funkcjonalności i brandingu. Ten artykuł przeprowadzi Cię przez proces tworzenia własnych bloków Gutenberga, omawiając kluczowe koncepcje, takie jak rejestracja bloków, atrybuty i renderowanie. Przyjrzymy się praktycznym przykładom, omówimy najlepsze praktyki dotyczące organizacji kodu i bezpieczeństwa oraz podkreślimy, w jaki sposób niestandardowe bloki integrują się z architekturą i hakami WordPress. Opanowując tworzenie niestandardowych bloków, możesz znacząco zwiększyć możliwości swojej witryny WordPress i doświadczenie użytkownika.

Poza Podstawowymi Blokami: Tworzenie Niestandardowych Bloków Gutenberga dla Ulepszonej Funkcjonalności WordPress

Wejście edytora bloków Gutenberga w WordPress 5.0 oznaczało znaczącą zmianę w sposobie tworzenia i zarządzania treścią. Odchodząc od liniowego podejścia klasycznego edytora, Gutenberg wprowadził system modułowy, w którym treść jest budowana przy użyciu dyskretnych "bloków". Chociaż domyślny zestaw bloków obejmuje szeroki zakres typowych potrzeb, wiele witryn wymaga unikalnych funkcjonalności, specyficznych elementów projektowych lub integracji, które wykraczają poza to, co jest łatwo dostępne. Tutaj wkracza tworzenie niestandardowych bloków Gutenberga, oferując potężny sposób na rozszerzenie możliwości WordPress i dostosowanie go dokładnie do wymagań Twojego projektu.

Tworzenie niestandardowych bloków pozwala na tworzenie komponentów wielokrotnego użytku, które usprawniają tworzenie treści dla redaktorów, zapewniają spójność marki i implementują złożone funkcje bezpośrednio w interfejsie edytora. Ten przewodnik przeprowadzi Cię przez ten proces, od zrozumienia podstaw po wdrożenie najlepszych praktyk w zakresie solidnych i łatwych w utrzymaniu niestandardowych bloków.

Zrozumienie Architektury Edytora Bloków

Zanim zagłębisz się w rozwój, kluczowe jest zrozumienie, jak Gutenberg i jego bloki działają w ekosystemie WordPress. Sam WordPress jest zbudowany na modułowej architekturze PHP i MySQL. Motywy kontrolują prezentację, a wtyczki dodają funkcjonalność. Gutenberg, jako podstawowa funkcja WordPress, płynnie integruje się z tą strukturą. Wykorzystuje JavaScript (głównie React) do dynamicznego doświadczenia edycji w przeglądarce, podczas gdy PHP obsługuje rejestrację i renderowanie po stronie serwera.

Niestandardowe bloki to zasadniczo komponenty JavaScript, które są rejestrowane w WordPress. Kiedy użytkownik dodaje niestandardowy blok do posta lub strony, Gutenberg przechowuje jego konfigurację (atrybuty) w bazie danych. Podczas renderowania posta na froncie witryny, WordPress używa PHP do interpretacji tej konfiguracji i generowania odpowiedniego kodu HTML, często wykorzystując ten sam komponent JavaScript lub oddzielny szablon PHP.

Kluczowe Komponenty Niestandardowego Bloku

Każdy niestandardowy blok Gutenberga, w swojej istocie, składa się z kilku kluczowych części:

  1. Rejestracja: Jest to proces informowania WordPress o Twoim nowym bloku. Obejmuje zdefiniowanie jego nazwy, tytułu, ikony i innych metadanych. Odbywa się to głównie za pomocą funkcji JavaScript registerBlockType.
  2. Atrybuty: Są to pola danych powiązane z Twoim blokiem. Traktuj je jako ustawienia lub właściwości, które użytkownik może modyfikować dla konkretnej instancji bloku (np. treść tekstowa, adres URL obrazu, wybór koloru). Atrybuty są definiowane w rejestracji JavaScript bloku.
  3. Funkcja Edycji (Edit Function): Ta funkcja JavaScript definiuje, jak blok wygląda i zachowuje się w edytorze Gutenberga. To tutaj tworzysz interaktywny interfejs użytkownika, którego twórcy treści będą używać do konfiguracji bloku.
  4. Funkcja Zapisywania (Save Function): Ta funkcja JavaScript definiuje statyczny kod HTML, który zostanie zapisany w bazie danych i wyrenderowany na froncie Twojej witryny. Powinna odzwierciedlać aktualny stan atrybutów bloku.

Krok po Kroku: Tworzenie Pierwszego Niestandardowego Bloku

Stwórzmy prosty niestandardowy blok, który wyświetla "Wezwanie do działania" (CTA) z nagłówkiem i przyciskiem. Ten przykład skupi się na podstawowych aspektach JavaScript do rejestracji i edycji bloków, zakładając, że podstawowe środowisko programistyczne WordPress jest skonfigurowane.

Wymagania wstępne:

  • Lokalne środowisko programistyczne WordPress.
  • Podstawowa znajomość JavaScript, React i PHP.
  • Zainstalowany Node.js i npm (lub yarn) do kompilacji zasobów.

1. Konfiguracja Projektu:

Niestandardowe bloki są zazwyczaj rozwijane jako część wtyczki. Utwórz nowy plik wtyczki (np. my-custom-blocks/my-custom-blocks.php) i plik JavaScript dla swojego bloku (np. src/index.js). Będziesz także potrzebować procesu budowania do kompilacji JavaScript. Powszechnym podejściem jest użycie @wordpress/scripts, które zapewnia wygodny sposób obsługi kompilacji.

W głównym katalogu wtyczki utwórz plik package.json:

{
  "name": "my-custom-blocks",
  "version": "1.0.0",
  "description": "A plugin for custom Gutenberg blocks.",
  "main": "index.js",
  "scripts": {
    "build": "wp-scripts build",
    "start": "wp-scripts start"
  },
  "keywords": ["wordpress", "gutenberg", "block"],
  "author": "Your Name",
  "license": "GPL-2.0-or-later",
  "devDependencies": {
    "@wordpress/scripts": "^26.0.0" 
  }
}

Zainstaluj zależności: npm install.

2. Rejestracja Bloku (JavaScript):

W pliku src/index.js użyjesz registerBlockType z pakietu @wordpress/blocks.

import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';

// Importuj komponenty dla edytora
import { Edit } from './edit';
import { Save } from './save';

registerBlockType( 'my-custom-blocks/cta', {
    title: __( 'Call to Action', 'my-custom-blocks' ),
    icon: 'megaphone',
    category: 'widgets',
    attributes: {
        headline: {
            type: 'string',
            default: '',
        },
        buttonText: {
            type: 'string',
            default: 'Learn More',
        },
        buttonUrl: {
            type: 'string',
            default: '#',
        },
    },
    edit: Edit,
    save: Save,
} );

3. Definiowanie Interfejsu Edytora (src/edit.js):

Ten komponent obsługuje wygląd i działanie bloku w edytorze.

import { __ } from '@wordpress/i18n';
import { useBlockProps, RichText, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, TextControl } from '@wordpress/components';

export const Edit = ( { attributes, setAttributes } ) => {
    const blockProps = useBlockProps();

    const onChangeHeadline = ( newHeadline ) => {
        setAttributes( { headline: newHeadline } );
    };

    const onChangeButtonText = ( newButtonText ) => {
        setAttributes( { buttonText: newButtonText } );
    };

    const onChangeButtonUrl = ( newButtonUrl ) => {
        setAttributes( { buttonUrl: newButtonUrl } );
    };

    return (
        <>
            <InspectorControls>
                <PanelBody title={ __( 'Button Settings', 'my-custom-blocks' ) }>
                    <TextControl
                        label={ __( 'Button Text', 'my-custom-blocks' ) }
                        value={ attributes.buttonText }
                        onChange={ onChangeButtonText }
                    />
                    <TextControl
                        label={ __( 'Button URL', 'my-custom-blocks' ) }
                        value={ attributes.buttonUrl }
                        onChange={ onChangeButtonUrl }
                    />
                </PanelBody>
            </InspectorControls>
            <div { ...blockProps }>
                <RichText
                    tagName="h3"
                    placeholder={ __( 'Enter your headline here...', 'my-custom-blocks' ) }
                    value={ attributes.headline }
                    onChange={ onChangeHeadline }
                    allowedFormats={ [ 'core/bold', 'core/italic' ] }
                />
                <a href={ attributes.buttonUrl } className="wp-element-button">
                    { attributes.buttonText }
                </a>
            </div>
        </>
    );
};

4. Definiowanie Funkcji Zapisywania (src/save.js):

Ta funkcja określa kod HTML wyjściowy dla frontu witryny.

import { useBlockProps, RichText } from '@wordpress/block-editor';

export const Save = ( { attributes } ) => {
    const blockProps = useBlockProps.save();

    return (
        <div { ...blockProps }>
            <RichText.Content
                tagName="h3"
                value={ attributes.headline }
            />
            <a href={ attributes.buttonUrl } className="wp-element-button">
                { attributes.buttonText }
            </a>
        </div>
    );
};

5. Kolejkowanie Skryptu Bloku (PHP):

W głównym pliku wtyczki (my-custom-blocks.php) musisz zarejestrować i zakolejkować skompilowany plik JavaScript.

<?php
/**
 * Plugin Name: My Custom Blocks
 * Description: Adds custom Gutenberg blocks.
 * Version: 1.0
 * Author: Your Name
 */

function my_custom_blocks_register_block() {
    // Automatycznie ładuje plik block.json i kolejkuje skrypt.
    register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'my_custom_blocks_register_block' );
?>

6. Budowanie Zasobów:

Uruchom npm run build w katalogu wtyczki. Spowoduje to skompilowanie JavaScript do folderu build.

Teraz aktywuj wtyczkę w WordPress. Powinieneś zobaczyć swój blok "Call to Action" dostępny w edytorze!

Najlepsze Praktyki w Tworzeniu Niestandardowych Bloków

Tworzenie niestandardowych bloków to coś więcej niż tylko zapewnienie ich funkcjonalności. Przestrzeganie najlepszych praktyk zapewnia, że Twoje bloki są bezpieczne, wydajne, dostępne i łatwe w utrzymaniu.

  • Nazewnictwo (Namespacing): Zawsze używaj unikalnej przestrzeni nazw dla swojego bloku (np. my-custom-blocks/cta). Zapobiega to konfliktom z innymi blokami. Funkcja registerBlockType obsługuje to.
  • Organizacja Kodu: Utrzymuj kod JavaScript i PHP w czystości i dobrej organizacji. W przypadku złożonych bloków rozważ podzielenie JavaScript na mniejsze, wielokrotnego użytku komponenty.
  • Bezpieczeństwo:
    • Sanityzacja: Podczas zapisywania danych w bazie danych (zwłaszcza treści generowanych przez użytkownika) zawsze je sanityzuj. WordPress udostępnia funkcje takie jak sanitize_text_field, esc_url itp.
    • Ucieczka (Escaping): Podczas wyświetlania danych w przeglądarce zawsze je uciekaj, aby zapobiec atakom typu Cross-Site Scripting (XSS). Używaj funkcji takich jak esc_html, esc_attr, esc_url.
    • Nonces: W przypadku wszelkich żądań AJAX lub przesyłania formularzy związanych z Twoim blokiem używaj nonces, aby zweryfikować, czy żądanie pochodzi z legalnego źródła WordPress.
  • Internacjonalizacja (i18n): Używaj funkcji __() i _x() (z @wordpress/i18n) dla wszystkich ciągów znaków widocznych dla użytkownika w Twoim kodzie JavaScript. To sprawia, że Twój blok jest tłumaczalny.
  • Dostępność (Accessibility): Upewnij się, że Twój blok jest użyteczny dla wszystkich. Używaj semantycznego HTML, podawaj atrybuty ARIA tam, gdzie jest to konieczne, i testuj z czytnikami ekranu.
  • Wydajność:
    • Ładowanie Leniwe (Lazy Loading): W przypadku bloków, które ładują ciężkie zasoby lub złożone dane, rozważ wdrożenie technik ładowania leniwego.
    • Wydajne Renderowanie: Optymalizuj funkcję save i wszelkie renderowanie po stronie serwera, aby były jak najbardziej wydajne.
    • Kolejkowanie Zasobów: Kolejkuj tylko niezbędne skrypty i style dla swojego bloku. Użyj enqueue_block_style i enqueue_block_script_handle dla zasobów specyficznych dla bloku.
  • Modułowość i Rozszerzalność: Wykorzystaj haki (akcje i filtry) WordPress w swoim kodzie PHP, aby umożliwić innym wtyczkom lub motywom modyfikację zachowania lub wyjścia Twojego bloku.
  • block.json: W przypadku bardziej złożonych bloków użyj pliku block.json do deklarowania metadanych bloku, zależności, stylów i uchwytów skryptów. Jest to nowoczesny standard tworzenia bloków i upraszcza zarządzanie zasobami.

Integracja z Architekturą WordPress

Niestandardowe bloki nie są odizolowanymi jednostkami. Są one głęboko zintegrowane z podstawową architekturą WordPress:

  • Haki (Hooks): Możesz używać akcji i filtrów PHP w swojej wtyczce, aby modyfikować rejestrację bloków, dodawać niestandardowe style lub skrypty warunkowo, a nawet zmieniać wyrenderowane wyjście podstawowych bloków. Na przykład, możesz użyć filtra block_type_metadata_settings, aby zmodyfikować ustawienia zarejestrowanego bloku.
  • Integracja z Motywami: Motywy oparte na blokach i Edytor Pełnej Witryny (FSE) w dużym stopniu opierają się na blokach. Niestandardowe bloki mogą być zaprojektowane tak, aby płynnie pasowały do szablonów FSE, umożliwiając użytkownikom budowanie całych witryn przy użyciu spójnego przepływu pracy opartego na blokach.
  • Współdziałanie Wtyczek: Twoje niestandardowe bloki mogą wchodzić w interakcję z innymi wtyczkami. Na przykład, niestandardowy blok produktu może pobierać dane z wtyczki e-commerce, a niestandardowy blok galerii może integrować się z konkretną wtyczką biblioteki mediów.

Zaawansowane Koncepcje i Rozważania

  • Renderowanie po Stronie Serwera (SSR): W przypadku bloków wymagających dynamicznych danych lub złożonej logiki, która najlepiej jest obsługiwana po stronie serwera, możesz zaimplementować renderowanie po stronie serwera. Wymaga to zdefiniowania funkcji render_callback w kodzie PHP podczas rejestracji bloku.
  • Dynamiczne Bloki: Bloki wykorzystujące SSR są często nazywane blokami dynamicznymi. Nie zapisują one statycznego kodu HTML w bazie danych; zamiast tego zapisują tylko swoje atrybuty, a render_callback generuje kod HTML przy każdym ładowaniu strony.
  • Style Bloków: Możesz zdefiniować niestandardowe style dla swoich bloków, które użytkownicy mogą wybierać w edytorze.
  • Warianty Bloków: Twórz warianty bazowego bloku, aby oferować prekonfigurowane wersje z różnymi domyślnymi ustawieniami lub wyglądem.
  • Różnice Między Edytorem a Front-endem: Pamiętaj, że funkcje edit i save mogą wymagać obsługi różnych scenariuszy. Funkcja edit służy do interaktywnego doświadczenia edytora, podczas gdy funkcja save służy do statycznego wyjścia HTML. Czasami możesz potrzebować oddzielnego render_callback do dynamicznego renderowania na froncie.

Wnioski

Tworzenie niestandardowych bloków Gutenberga to potężna umiejętność, która odblokowuje nowy poziom dostosowania i funkcjonalności dla witryn WordPress. Rozumiejąc kluczowe komponenty — rejestrację, atrybuty, funkcje edycji i zapisywania — oraz przestrzegając najlepszych praktyk w zakresie bezpieczeństwa, wydajności i dostępności, możesz tworzyć solidne, wielokrotnego użytku i przyjazne dla użytkownika bloki. Niezależnie od tego, czy tworzysz niestandardową wtyczkę dla klienta, czy ulepszasz własną witrynę, opanowanie niestandardowych bloków znacząco podniesie Twoje możliwości tworzenia w WordPress, pozwalając Ci wyjść poza standardowe oferty i tworzyć naprawdę unikalne doświadczenia cyfrowe.

Sources (5)