Blog
Mistrzowskie Opanowanie Dynamicznych Bloków WordPress: Łączenie PHP i JavaScript dla Interaktywnych Treści
Dowiedz się, jak tworzyć dynamiczne bloki WordPress, które wykorzystują zarówno PHP, jak i JavaScript, aby dostarczać użytkownikom interaktywne i oparte na danych doświadczenia.

Podsumowanie
Dynamiczne bloki WordPress oferują potężny sposób tworzenia treści, które wykraczają poza statyczny HTML, umożliwiając integrację danych w czasie rzeczywistym i elementy interaktywne. W przeciwieństwie do bloków statycznych, bloki dynamiczne renderują swoje wyjście po stronie serwera przy użyciu PHP, co pozwala im pobierać i wyświetlać aktualne informacje. Ten artykuł stanowi praktyczny przewodnik po tworzeniu własnych bloków dynamicznych, obejmujący podstawowe koncepcje rejestracji bloków, wywołań zwrotnych renderowania po stronie serwera i obsługi atrybutów po stronie klienta. Przejdziemy przez przykład krok po kroku, demonstrując, jak zbudować blok dynamiczny wyświetlający najnowsze posty, oferując podstawę dla bardziej złożonych komponentów interaktywnych.
Mistrzowskie Opanowanie Dynamicznych Bloków WordPress: Łączenie PHP i JavaScript dla Interaktywnych Treści
WordPress, w swojej istocie, jest solidnym systemem zarządzania treścią (CMS) zbudowanym na modularnej architekturze PHP i bazie danych MySQL. Jego rozszerzalność jest kluczową siłą, osiąganą głównie poprzez motywy i wtyczki. Pojawienie się Gutenberga, edytora bloków, zrewolucjonizowało tworzenie treści, wprowadzając modularny interfejs oparty na JavaScript. Chociaż statyczne bloki Gutenberga są doskonałe do strukturalnych, niezmiennych treści, wiele scenariuszy z życia wymaga treści dynamicznych, interaktywnych i opartych na danych. Tu właśnie pojawiają się bloki dynamiczne, oferujące potężne połączenie między logiką po stronie serwera PHP a interaktywnością po stronie klienta JavaScript.
Zrozumienie Mocy Bloków Dynamicznych
Bloki statyczne, domyślne w Gutenberg, generują HTML po stronie klienta podczas zapisywania. Ten HTML jest następnie przechowywany bezpośrednio w treści posta. Chociaż jest to wydajne dla treści statycznych, takie podejście ma ograniczenia w przypadku danych, które często się zmieniają lub wymagają przetwarzania po stronie serwera. Bloki dynamiczne natomiast rozwiązują ten problem, renderując swoje wyjście po stronie serwera przy użyciu PHP. Kiedy użytkownik przegląda stronę zawierającą blok dynamiczny, WordPress wykonuje funkcję PHP (tzw. render_callback), aby dynamicznie generować kod HTML bloku. Pozwala to blokowi pobierać dane w czasie rzeczywistym z bazy danych, wchodzić w interakcję z innymi funkcjonalnościami WordPress i prezentować informacje, które są zawsze aktualne.
To renderowanie po stronie serwera jest kluczowe z kilku powodów:
- Dane w czasie rzeczywistym: Wyświetlanie najnowszych postów, nadchodzących wydarzeń, cen akcji lub innych danych, które często się zmieniają.
- Złożona logika: Wykonywanie obliczeń, wysyłanie zapytań do niestandardowych typów postów lub integracja z zewnętrznymi API przed wyrenderowaniem wyjścia.
- Bezpieczeństwo: Czyszczenie i walidacja danych przed ich wyświetleniem, zwłaszcza w przypadku treści generowanych przez użytkowników lub źródeł zewnętrznych.
- Wydajność: Odciążenie złożonych zadań renderowania na serwer może czasami poprawić wydajność po stronie klienta.
Anatomia Bloku Dynamicznego
Blok dynamiczny, podobnie jak każdy inny blok Gutenberga, jest definiowany przez swoje metadane i rejestrację JavaScript. Jednak jego unikalną cechą jest atrybut render_callback określony podczas rejestracji. Ta funkcja zwrotna jest odpowiedzialna za generowanie wyjścia HTML bloku na serwerze.
Oto podział kluczowych komponentów:
- Rejestracja Bloku (JavaScript): Nadal musisz zarejestrować swój blok za pomocą
registerBlockType()w swoim pliku JavaScript. Informuje to Gutenberga o istnieniu bloku i sposobie obsługi jego atrybutów oraz interfejsu edytora. - Atrybuty: Są to pola danych powiązane z blokiem, przechowywane w treści posta. W przypadku bloków dynamicznych atrybuty służą głównie do konfiguracji zachowania i ustawień bloku w edytorze. Rzeczywista wyświetlana treść jest generowana przez
render_callback. render_callback(PHP): To serce bloku dynamicznego. Jest to funkcja PHP, która otrzymuje atrybuty bloku jako argument i zwraca ciąg HTML do wyrenderowania na froncie.- Interfejs Edytora (JavaScript): Nadal będziesz budować interfejs bloku w edytorze Gutenberga przy użyciu komponentów React. Ten interfejs pozwala użytkownikom konfigurować atrybuty bloku i widzieć podgląd (często uproszczoną reprezentację) tego, jak będą wyglądać dynamiczne treści.
Krok po Kroku: Tworzenie Dynamicznego Bloku „Najnowsze Posty”
Stwórzmy praktyczny przykład: blok dynamiczny wyświetlający listę najnowszych postów z Twojej witryny WordPress.
Wymagania wstępne:
- Lokalne środowisko programistyczne WordPress.
- Podstawowa znajomość PHP i JavaScript.
- Wtyczka lub motyw, do którego dodasz kod swojego bloku.
Krok 1: Konfiguracja Wtyczki/Motywu Bloku
Jeśli nie masz niestandardowej wtyczki lub motywu, utwórz prosty. W tym przykładzie założymy, że dodajesz to do wtyczki.
Krok 2: Rejestracja Bloku (JavaScript)
W pliku JavaScript swojej wtyczki (np. src/index.js) zarejestrujesz blok. Użyjemy @wordpress/blocks i @wordpress/i18n do internacjonalizacji.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Zaimportuj komponent edycji swojego bloku
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Najnowsze Posty', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// Funkcja save() NIE jest potrzebna dla bloków dynamicznych
// render_callback po stronie serwera obsłuży wyjście
} );
Krok 3: Utworzenie Komponentu Edytora (JavaScript)
Teraz utwórz plik src/edit.js. Ten komponent zdefiniuje, jak blok wygląda i zachowuje się w edytorze Gutenberga.
// src/edit.js
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';
export default function Edit( { attributes, setAttributes } ) {
const blockProps = useBlockProps();
const { numberOfPosts, showExcerpt } = attributes;
return (
<div { ...blockProps }>
<InspectorControls>
<PanelBody title={ __( 'Ustawienia Postów', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Liczba Postów', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Pokaż Wstęp', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Użyj ServerSideRender, aby wyświetlić podgląd bloku dynamicznego
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Zauważ, że nie definiujemy funkcji save(). To kluczowa różnica w przypadku bloków dynamicznych. Komponent ServerSideRender służy do wyświetlania podglądu wyjścia bloku bezpośrednio w edytorze, poprzez wysłanie żądania do serwera.
Krok 4: Dołączenie Skryptów i Rejestracja Renderowania po Stronie Serwera (PHP)
W głównym pliku PHP swojej wtyczki (np. my-dynamic-blocks.php) musisz dołączyć swój plik JavaScript i zarejestrować typ bloku, w tym render_callback.
<?php
/**
* Nazwa Wtyczki: My Dynamic Blocks
* Opis: Prosta wtyczka do dynamicznych bloków Gutenberga.
* Wersja: 1.0
* Autor: Twoje Imię
*/
function my_dynamic_blocks_register_block() {
// Zarejestruj typ bloku
register_block_type( 'my-dynamic-blocks/recent-posts', array(
'editor_script' => 'my-dynamic-blocks-editor-script',
'render_callback' => 'my_dynamic_blocks_render_recent_posts',
'attributes' => array(
'numberOfPosts' => array(
'type' => 'number',
'default' => 5,
),
'showExcerpt' => array(
'type' => 'boolean',
'default' => true,
),
),
) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );
function my_dynamic_blocks_enqueue_editor_scripts() {
wp_enqueue_script(
'my-dynamic-blocks-editor-script',
plugins_url( 'build/index.js', __FILE__ ), // Zakładając, że masz proces budowania
array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
);
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );
/**
* Funkcja zwrotna renderowania dla dynamicznego bloku Najnowsze Posty.
*
* @param array $attributes Atrybuty bloku.
* @return string Wyjście HTML.
*/
function my_dynamic_blocks_render_recent_posts( $attributes ) {
$number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
$show_excerpt = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;
$args = array(
'posts_per_page' => $number_of_posts,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
);
$recent_posts_query = new WP_Query( $args );
$output = '';
if ( $recent_posts_query->have_posts() ) {
$output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // Użyj klasy do stylizacji
while ( $recent_posts_query->have_posts() ) {
$recent_posts_query->the_post();
$output .= '<li>';
$output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
if ( $show_excerpt ) {
$output .= '<p>' . get_the_excerpt() . '</p>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata(); // Ważne: zresetuj dane postów po niestandardowej pętli
} else {
$output = '<p>' . __( 'Nie znaleziono postów.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Wyjaśnienie kodu PHP:
my_dynamic_blocks_register_block(): Ta funkcja hookuje się doinit, aby zarejestrować nasz typ bloku. Kluczowo definiujerender_callbackjakomy_dynamic_blocks_render_recent_postsi przekazuje również atrybuty bloku, odzwierciedlając to, co zdefiniowano w JavaScript.my_dynamic_blocks_enqueue_editor_scripts(): Ta funkcja hookuje się doenqueue_block_editor_assets, aby załadować nasz plik JavaScript specjalnie dla edytora. Zawierawp-server-side-renderjako zależność.my_dynamic_blocks_render_recent_posts(): To naszrender_callback. Otrzymuje tablicę$attributes, czyści i rzutuje je na poprawne typy, a następnie używaWP_Querydo pobrania najnowszych postów. Konstruuje listę HTML<ul>i zwraca ją.wp_reset_postdata()jest niezbędne po niestandardowej pętliWP_Query, aby zapobiec konfliktom z głównym zapytaniem WordPress.
Krok 5: Budowanie JavaScript
Jeśli używasz nowoczesnego procesu budowania JavaScript (jak @wordpress/scripts), będziesz musiał zbudować swoje zasoby. Uruchom npm run build (lub yarn build) w katalogu swojej wtyczki.
Krok 6: Aktywacja i Testowanie
Aktywuj swoją wtyczkę. Teraz, gdy dodasz blok 'Najnowsze Posty' do posta lub strony, zobaczysz interfejs edytora. Obszar podglądu pokaże wyjście wyrenderowane przez Twój callback PHP. Po opublikowaniu lub zaktualizowaniu posta, ten sam callback PHP zostanie uruchomiony na froncie, aby wyświetlić dynamiczne treści.
Najlepsze Praktyki i Zastrzeżenia
- Najpierw Bezpieczeństwo: Zawsze czyść i waliduj wszelkie dane pochodzące z atrybutów lub źródeł zewnętrznych przed użyciem ich w
render_callback. Używaj funkcji WordPress, takich jakesc_html(),esc_url(),sanitize_text_field()itp. wp_reset_postdata(): Jeśli Twójrender_callbackużywaWP_Querylub modyfikuje globalny obiekt$post, zawsze wywołajwp_reset_postdata()po tym, aby przywrócić oryginalne zapytanie i dane postów.- Rozważania dotyczące wydajności: Chociaż bloki dynamiczne są potężne, nadmierne lub złożone renderowanie po stronie serwera może wpłynąć na czas ładowania strony. Optymalizuj swoje zapytania i logikę renderowania. Rozważ mechanizmy buforowania, jeśli wydajność stanie się problemem.
- Podgląd Edytora: Komponent
ServerSideRenderzapewnia dobry podgląd, ale polega na wysyłaniu żądania do serwera. W przypadku bardzo złożonych bloków może to nie być natychmiastowe. Upewnij się, że Twójrender_callbackjest wydajny. - Obsługa Atrybutów: Atrybuty służą głównie do konfiguracji bloku w edytorze.
render_callbackjest odpowiedzialny za pobieranie i wyświetlanie rzeczywistych dynamicznych treści. Unikaj przechowywania dużych ilości danych dynamicznych bezpośrednio w atrybutach. - Konwencje Nazewnictwa: Używaj unikalnych prefiksów dla nazw swoich bloków (np.
my-plugin-slug/block-name) i nazw funkcji PHP, aby uniknąć konfliktów z innymi wtyczkami lub motywami. - Internacjonalizacja: Używaj
__()i_n()dla tłumaczeń ciągów znaków zarówno w kodzie JavaScript, jak i PHP.
Poza Najnowszymi Postami: Rozszerzanie Możliwości Bloków Dynamicznych
Przykład „Najnowszych Postów” to tylko wierzchołek góry lodowej. Możesz wykorzystać bloki dynamiczne do:
- Wyświetlania niestandardowych typów postów: Prezentowanie produktów, elementów portfolio lub wydarzeń.
- Treści specyficznych dla użytkownika: Wyświetlanie treści istotnych dla zalogowanego użytkownika.
- Interaktywnych formularzy: Chociaż złożone formularze mogą nadal korzystać z dedykowanych wtyczek, można zbudować proste formularze dynamiczne.
- Wizualizacji danych: Pobieranie danych z API i renderowanie wykresów lub grafów (chociaż często wymaga to bardziej zaawansowanych bibliotek JavaScript).
- Integracji z innymi wtyczkami: Dynamiczne wyświetlanie danych zarządzanych przez inne wtyczki.
Wniosek
Dynamiczne bloki WordPress są nieodzownym narzędziem dla programistów chcących tworzyć prawdziwie interaktywne i oparte na danych doświadczenia w edytorze Gutenberga. Rozumiejąc, jak rejestrować bloki z funkcjami render_callback i efektywnie zarządzać atrybutami, możesz tworzyć potężne komponenty, które pobierają i wyświetlają informacje w czasie rzeczywistym. Chociaż bloki statyczne służą swojemu celowi w przypadku treści strukturalnych, bloki dynamiczne odblokowują nowy poziom funkcjonalności, pozwalając na wypełnienie luki między logiką po stronie serwera a prezentacją po stronie klienta. Przestrzegając najlepszych praktyk w zakresie bezpieczeństwa, wydajności i organizacji kodu, możesz pewnie tworzyć solidne i użyteczne bloki dynamiczne, które ulepszą Twoje strony internetowe WordPress.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- Explaining WordPress Hooks with Actions and Filters - Hey Reliable
- WordPress Hooks, Actions, and Filters: What They Do and How They Work
- Getting Started with Gutenberg: WordPress Block Development Essentials
- Gutenberg Block Development Step by Step Guide - White Label IQ