Blog
Zvládnutí dynamických bloků WordPress: Propojení PHP a JavaScriptu pro interaktivní obsah
Naučte se vytvářet dynamické bloky WordPress, které využívají PHP i JavaScript k poskytování interaktivních a daty řízených obsahových zážitků pro vaše uživatele.

Shrnutí
Dynamické bloky WordPress nabízejí výkonný způsob vytváření obsahu, který přesahuje statické HTML, což umožňuje integraci dat v reálném čase a interaktivní prvky. Na rozdíl od statických bloků dynamické bloky vykreslují svůj výstup na straně serveru pomocí PHP, což jim umožňuje načítat a zobrazovat aktuální informace. Tento článek poskytuje praktického průvodce vývojem vlastních dynamických bloků, pokrývá základní koncepty registrace bloků, zpětných volání pro vykreslování na straně serveru a zpracování atributů na straně klienta. Projdeme si příklad krok za krokem, který ukazuje, jak vytvořit dynamický blok zobrazující nejnovější příspěvky, což poskytuje základ pro složitější interaktivní komponenty.
Zvládnutí dynamických bloků WordPress: Propojení PHP a JavaScriptu pro interaktivní obsah
WordPress je ve své podstatě robustní systém pro správu obsahu (CMS) postavený na modulární architektuře PHP a databázi MySQL. Jeho rozšiřitelnost je klíčovou silou, dosahovanou především prostřednictvím motivů a pluginů. Příchod Gutenberg, editoru bloků, způsobil revoluci ve tvorbě obsahu zavedením modulárního rozhraní řízeného JavaScriptem. Zatímco statické bloky Gutenberg jsou vynikající pro strukturovaný, neměnný obsah, mnoho scénářů z reálného světa vyžaduje obsah, který je dynamický, interaktivní a řízený daty. Zde přicházejí na řadu dynamické bloky, které nabízejí výkonné propojení mezi logikou na straně serveru v PHP a interaktivitou na straně klienta v JavaScriptu.
Pochopení síly dynamických bloků
Statické bloky, výchozí v Gutenberg, generují HTML na straně klienta při uložení. Toto HTML je pak uloženo přímo v obsahu příspěvku. Zatímco je to efektivní pro statický obsah, tento přístup má omezení, pokud jde o data, která se často mění nebo vyžadují zpracování na straně serveru. Dynamické bloky na druhé straně řeší tento problém vykreslováním svého výstupu na straně serveru pomocí PHP. Když uživatel zobrazí stránku obsahující dynamický blok, WordPress spustí funkci PHP ( render_callback ) k vygenerování HTML bloku za běhu. To umožňuje bloku načítat data v reálném čase z databáze, interagovat s jinými funkcemi WordPress a prezentovat informace, které jsou vždy aktuální.
Toto vykreslování na straně serveru je klíčové z několika důvodů:
- Data v reálném čase: Zobrazení nejnovějších příspěvků, nadcházejících událostí, cen akcií nebo jakýchkoli jiných dat, která se často mění.
- Složitá logika: Provádění výpočtů, dotazování na vlastní typy příspěvků nebo integrace s externími API před vykreslením výstupu.
- Bezpečnost: Čištění a ověřování dat před jejich zobrazením, zejména při práci s obsahem generovaným uživateli nebo externími zdroji.
- Výkon: Přenesení složitých úkolů vykreslování na server může někdy zlepšit výkon na straně klienta.
Anatomie dynamického bloku
Dynamický blok, stejně jako jakýkoli jiný blok Gutenberg, je definován svými metadaty a registrací v JavaScriptu. Jeho jedinečnou charakteristikou je však atribut render_callback specifikovaný během registrace. Tato zpětná volání funkce je zodpovědná za generování výstupu HTML bloku na serveru.
Zde je rozpis klíčových komponent:
- Registrace bloku (JavaScript): Stále musíte svůj blok zaregistrovat pomocí
registerBlockType()ve vašem souboru JavaScript. Tímto způsobem Gutenberg ví, že váš blok existuje a jak zpracovávat jeho atributy a rozhraní editoru. - Atributy: Toto jsou datové pole spojené s vaším blokem, uložené v obsahu příspěvku. Pro dynamické bloky se atributy primárně používají k konfiguraci chování a nastavení bloku v editoru. Skutečný zobrazený obsah je generován
render_callback. render_callback(PHP): Toto je srdce dynamického bloku. Je to funkce PHP, která přijímá atributy bloku jako argument a vrací řetězec HTML, který má být vykreslen na front-endu.- Rozhraní editoru (JavaScript): Rozhraní bloku budete stále vytvářet v editoru Gutenberg pomocí komponent React. Toto rozhraní umožňuje uživatelům konfigurovat atributy bloku a vidět náhled (často zjednodušenou reprezentaci) toho, jak bude dynamický obsah vypadat.
Krok za krokem: Vytvoření dynamického bloku "Nejnovější příspěvky"
Vytvořme praktický příklad: dynamický blok, který zobrazuje seznam nejnovějších příspěvků z vašeho webu WordPress.
Předpoklady:
- Lokální vývojové prostředí WordPress.
- Základní znalost PHP a JavaScriptu.
- Plugin nebo motiv, kam přidáte kód bloku.
Krok 1: Nastavení vašeho pluginu/motivu pro bloky
Pokud nemáte vlastní plugin nebo motiv, vytvořte jednoduchý. Pro tento příklad předpokládáme, že jej přidáváte do pluginu.
Krok 2: Registrace bloku (JavaScript)
Ve vašem souboru JavaScript pluginu (např. src/index.js) zaregistrujete blok. Pro internacionalizaci použijeme @wordpress/blocks a @wordpress/i18n.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Importujte komponentu pro úpravy vašeho bloku
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Nejnovější příspěvky', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// Funkce save() NENÍ pro dynamické bloky potřeba
// Zpětné volání render_callback na straně serveru se postará o výstup
} );
Krok 3: Vytvoření komponenty pro úpravy (JavaScript)
Nyní vytvořte soubor src/edit.js. Tato komponenta definuje, jak blok vypadá a chová se v editoru Gutenberg.
// 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={ __( 'Nastavení příspěvků', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Počet příspěvků', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Zobrazit úryvek', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Použijte ServerSideRender k zobrazení náhledu dynamického bloku
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Všimněte si, že nedefinujeme funkci save(). To je klíčový rozdíl pro dynamické bloky. Komponenta ServerSideRender se používá k zobrazení náhledu výstupu bloku přímo v editoru provedením požadavku na server.
Krok 4: Načtení skriptů a registrace vykreslování na straně serveru (PHP)
Ve vašem hlavním souboru PHP pluginu (např. my-dynamic-blocks.php) musíte načíst váš soubor JavaScript a zaregistrovat typ bloku, včetně render_callback.
<?php
/**
* Název pluginu: My Dynamic Blocks
* Popis: Jednoduchý plugin pro dynamické bloky Gutenberg.
* Verze: 1.0
* Autor: Vaše jméno
*/
function my_dynamic_blocks_register_block() {
// Registrace typu 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__ ), // Předpokládá se, že máte build proces
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' );
/**
* Zpětné volání pro vykreslení dynamického bloku Nejnovější příspěvky.
*
* @param array $attributes Atributy bloku.
* @return string HTML výstup.
*/
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">'; // Použijte třídu pro stylizaci
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(); // Důležité: Resetujte data příspěvku po vlastním cyklu
} else {
$output = '<p>' . __( 'Nebyly nalezeny žádné příspěvky.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Vysvětlení kódu PHP:
my_dynamic_blocks_register_block(): Tato funkce se připojuje kinita registruje náš typ bloku. Klíčové je, že definujerender_callbackjakomy_dynamic_blocks_render_recent_postsa také předává atributy bloku, což zrcadlí to, co je definováno v JavaScriptu.my_dynamic_blocks_enqueue_editor_scripts(): Tato funkce se připojuje kenqueue_block_editor_assetsa načítá náš soubor JavaScript specificky pro editor. Zahrnujewp-server-side-renderjako závislost.my_dynamic_blocks_render_recent_posts(): Toto je nášrender_callback. Přijímá pole$attributes, čistí je a převádí na správné typy a poté používáWP_Queryk načtení nejnovějších příspěvků. Sestavuje HTML seznam<ul>a vrací jej.wp_reset_postdata()je nezbytné po vlastním cykluWP_Queryk zabránění konfliktům s hlavním dotazem WordPress.
Krok 5: Sestavení vašeho JavaScriptu
Pokud používáte moderní proces sestavení JavaScriptu (jako @wordpress/scripts), budete muset sestavit svá aktiva.
Krok 6: Aktivace a testování
Aktivujte svůj plugin. Nyní, když přidáte blok 'Nejnovější příspěvky' do příspěvku nebo stránky, uvidíte rozhraní editoru. Oblast náhledu zobrazí výstup vykreslený vaší zpětnou voláním PHP. Když příspěvek publikujete nebo aktualizujete, stejné zpětné volání PHP se spustí na front-endu, aby se zobrazil dynamický obsah.
Osvědčené postupy a upozornění
- Bezpečnost především: Vždy čistěte a ověřujte všechna data pocházející z atributů nebo externích zdrojů před jejich použitím ve vašem
render_callback. Používejte funkce WordPress, jako jsouesc_html(),esc_url(),sanitize_text_field()atd. wp_reset_postdata(): Pokud vášrender_callbackpoužíváWP_Querynebo modifikuje globální objekt$post, vždy poté zavolejtewp_reset_postdata()k obnovení původního dotazu a dat příspěvku.- Úvahy o výkonu: Ačkoli jsou dynamické bloky výkonné, nadměrné nebo složité vykreslování na straně serveru může ovlivnit dobu načítání stránky. Optimalizujte své dotazy a logiku vykreslování. Zvažte mechanismy ukládání do mezipaměti, pokud se výkon stane problémem.
- Náhled editoru: Komponenta
ServerSideRenderposkytuje dobrý náhled, ale spoléhá na provedení požadavku na server. U velmi složitých bloků to nemusí být okamžité. Zajistěte, aby vášrender_callbackbyl efektivní. - Zpracování atributů: Atributy slouží primárně ke konfiguraci bloku v editoru.
render_callbackje zodpovědný za načítání a zobrazování skutečného dynamického obsahu. Vyhněte se ukládání velkého množství dynamických dat přímo do atributů. - Konvence pojmenování: Používejte jedinečné předpony pro názvy vašich bloků (např.
muj-plugin-slug/nazev-bloku) a názvy funkcí PHP, abyste se vyhnuli konfliktům s jinými pluginy nebo motivy. - Internacionalizace: Používejte
__()a_n()pro překladatelné řetězce v kódu JavaScript i PHP.
Za hranicemi nejnovějších příspěvků: Rozšíření možností dynamických bloků
Příklad "Nejnovější příspěvky" je jen špičkou ledovce. Dynamické bloky můžete využít pro:
- Zobrazení vlastních typů příspěvků: Prezentace produktů, portfoliových položek nebo událostí.
- Obsah specifický pro uživatele: Zobrazení obsahu relevantního pro přihlášeného uživatele.
- Interaktivní formuláře: Ačkoli složité formuláře mohou stále těžit ze specializovaných pluginů, lze vytvořit jednoduché dynamické formuláře.
- Vizualizace dat: Načítání dat z API a vykreslování grafů nebo diagramů (i když to často zahrnuje pokročilejší knihovny JavaScript).
- Integrace s jinými pluginy: Dynamické zobrazování dat spravovaných jinými pluginy.
Závěr
Dynamické bloky WordPress jsou nepostradatelným nástrojem pro vývojáře, kteří chtějí vytvářet skutečně interaktivní a daty řízené zážitky v editoru Gutenberg. Pochopením toho, jak registrovat bloky s funkcemi render_callback a efektivně spravovat atributy, můžete vytvářet výkonné komponenty, které načítají a zobrazují informace v reálném čase. Zatímco statické bloky slouží svému účelu pro strukturovaný obsah, dynamické bloky odemykají novou úroveň funkčnosti, což vám umožňuje překlenout propast mezi logikou na straně serveru a prezentací na front-endu. Dodržováním osvědčených postupů pro bezpečnost, výkon a organizaci kódu můžete s jistotou vyvíjet robustní a užitečné dynamické bloky, které vylepší vaše webové stránky 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