Blog
Ovladavanje dinamičkim WordPress blokovima: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj
Naučite kako izraditi dinamičke WordPress blokove koji koriste i PHP i JavaScript kako biste korisnicima pružili interaktivna iskustva sadržaja temeljena na podacima.

Sažetak
Dinamički WordPress blokovi nude snažan način za stvaranje sadržaja koji nadilazi statični HTML, omogućujući integraciju podataka u stvarnom vremenu i interaktivne elemente. Za razliku od statičnih blokova, dinamički blokovi renderiraju svoj izlaz na strani poslužitelja koristeći PHP, što im omogućuje dohvaćanje i prikazivanje ažuriranih informacija. Ovaj članak pruža praktični vodič za razvoj vlastitih dinamičkih blokova, pokrivajući ključne koncepte registracije blokova, pozivnih funkcija za renderiranje na strani poslužitelja i rukovanje atributima na strani klijenta. Provest ćemo vas kroz primjer korak po korak, demonstrirajući kako izraditi dinamički blok koji prikazuje nedavne objave, nudeći temelj za složenije interaktivne komponente.
Ovladavanje dinamičkim WordPress blokovima: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj
WordPress, u svojoj srži, robusni je sustav za upravljanje sadržajem (CMS) izgrađen na modularnoj PHP arhitekturi i MySQL bazi podataka. Njegova proširivost ključna je snaga, prvenstveno postignuta putem tema i dodataka. Dolazak Gutenbergovog uređivača blokova revolucionirao je stvaranje sadržaja uvođenjem modularnog sučelja vođenog JavaScriptom. Dok su statički Gutenberg blokovi izvrsni za strukturirani, nepromjenjivi sadržaj, mnogi scenariji iz stvarnog života zahtijevaju sadržaj koji je dinamičan, interaktivan i temeljen na podacima. Tu na scenu stupaju dinamički blokovi, nudeći snažan most između logike na strani poslužitelja PHP-a i interaktivnosti na strani klijenta JavaScripta.
Razumijevanje moći dinamičkih blokova
Statični blokovi, zadani u Guthenbergu, generiraju HTML na strani klijenta prilikom spremanja. Taj se HTML zatim izravno pohranjuje u sadržaj objave. Iako učinkovit za statični sadržaj, ovaj pristup ima ograničenja kada se bavi podacima koji se često mijenjaju ili zahtijevaju obradu na strani poslužitelja. Dinamički blokovi, s druge strane, rješavaju ovaj problem renderiranjem svog izlaza na strani poslužitelja pomoću PHP-a. Kada korisnik pregledava stranicu koja sadrži dinamički blok, WordPress izvršava PHP funkciju (render_callback) za generiranje HTML-a bloka u stvarnom vremenu. To omogućuje bloku dohvaćanje podataka u stvarnom vremenu iz baze podataka, interakciju s drugim WordPress funkcionalnostima i prezentaciju informacija koje su uvijek ažurirane.
Ovo renderiranje na strani poslužitelja ključno je iz nekoliko razloga:
- Podaci u stvarnom vremenu: Prikazivanje najnovijih objava, nadolazećih događaja, cijena dionica ili bilo kojih drugih podataka koji se često mijenjaju.
- Složena logika: Izvođenje izračuna, upita prilagođenih vrsta objava ili integracija s vanjskim API-jima prije renderiranja izlaza.
- Sigurnost: Čišćenje i provjera podataka prije nego što se prikažu, posebno kada se radi sa sadržajem generiranim od strane korisnika ili vanjskim izvorima.
- Performanse: Prebacivanje složenih zadataka renderiranja na poslužitelj ponekad može poboljšati performanse na strani klijenta.
Anatomija dinamičkog bloka
Dinamički blok, kao i svaki drugi Gutenberg blok, definiran je svojim metapodacima i registracijom u JavaScriptu. Međutim, njegova jedinstvena karakteristika leži u atributu render_callback navedenom tijekom registracije. Ova pozivna funkcija odgovorna je za generiranje HTML izlaza bloka na poslužitelju.
Evo pregleda ključnih komponenti:
- Registracija bloka (JavaScript): Još uvijek morate registrirati svoj blok pomoću
registerBlockType()u svojoj JavaScript datoteci. Ovo govori Gutenbergovom uređivaču da vaš blok postoji i kako rukovati njegovim atributima i sučeljem uređivača. - Atributi: Ovo su polja podataka povezana s vašim blokom, pohranjena u sadržaju objave. Za dinamičke blokove, atributi se prvenstveno koriste za konfiguriranje ponašanja i postavki bloka u uređivaču. Stvarni prikazani sadržaj generira
render_callback. render_callback(PHP): Ovo je srce dinamičkog bloka. To je PHP funkcija koja prima atribute bloka kao argument i vraća HTML niz koji će se renderirati na prednjoj strani.- Sučelje uređivača (JavaScript): Još uvijek ćete graditi sučelje bloka unutar Gutenbergovog uređivača koristeći React komponente. Ovo sučelje omogućuje korisnicima konfiguriranje atributa bloka i pregled (često pojednostavljeni prikaz) kako će dinamički sadržaj izgledati.
Korak po korak: Izrada dinamičkog bloka "Nedavne objave"
Napravimo praktičan primjer: dinamički blok koji prikazuje popis najnovijih objava s vaše WordPress stranice.
Preduvjeti:
- Lokalno WordPress razvojno okruženje.
- Osnovno razumijevanje PHP-a i JavaScripta.
- Dodatak ili tema gdje ćete dodati kod svog bloka.
Korak 1: Postavljanje vašeg dodatka/teme za blokove
Ako nemate prilagođeni dodatak ili temu, stvorite jednostavan. Za ovaj primjer pretpostavit ćemo da ovo dodajete dodatku.
Korak 2: Registracija bloka (JavaScript)
U JavaScript datoteci vašeg dodatka (npr. src/index.js), registrirat ćete blok. Koristit ćemo @wordpress/blocks i @wordpress/i18n za internacionalizaciju.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Uvezite komponentu za uređivanje vašeg bloka
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Recent Posts', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// save() funkcija NIJE potrebna za dinamičke blokove
// render_callback na strani poslužitelja će rukovati izlazom
} );
Korak 3: Izrada komponente za uređivanje (JavaScript)
Sada stvorite datoteku src/edit.js. Ova komponenta će definirati kako blok izgleda i ponaša se unutar Gutenbergovog uređivača.
// 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={ __( 'Post Settings', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Number of Posts', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Show Excerpt', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Koristite ServerSideRender za prikaz pretpregleda dinamičkog bloka
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Primijetite da ne definiramo save() funkciju. Ovo je ključna razlika za dinamičke blokove. Komponenta ServerSideRender koristi se za prikaz pretpregleda izlaza bloka izravno u uređivaču, slanjem zahtjeva poslužitelju.
Korak 4: Uključivanje skripti i registracija renderiranja na strani poslužitelja (PHP)
U glavnoj PHP datoteci vašeg dodatka (npr. my-dynamic-blocks.php), morate uključiti svoju JavaScript datoteku i registrirati vrstu bloka, uključujući render_callback.
<?php
/**
* Plugin Name: My Dynamic Blocks
* Description: A simple plugin for dynamic Gutenberg blocks.
* Version: 1.0
* Author: Your Name
*/
function my_dynamic_blocks_register_block() {
// Registrirajte vrstu bloka
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__ ), // Pretpostavljajući da imate proces izgradnje
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' );
/**
* Pozivna funkcija za renderiranje za dinamički blok Nedavne objave.
*
* @param array $attributes Atributi bloka.
* @return string HTML izlaz.
*/
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">'; // Koristite klasu za stiliziranje
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(); // Važno: Vratite podatke o objavi nakon prilagođene petlje
} else {
$output = '<p>' . __( 'No posts found.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Objašnjenje PHP koda:
my_dynamic_blocks_register_block(): Ova funkcija se povezuje sinitkako bi registrirala našu vrstu bloka. Ključno, definirarender_callbackkaomy_dynamic_blocks_render_recent_postsi također prosljeđuje atribute bloka, odražavajući ono što je definirano u JavaScriptu.my_dynamic_blocks_enqueue_editor_scripts(): Ova funkcija se povezuje senqueue_block_editor_assetskako bi učitala našu JavaScript datoteku posebno za uređivač. Uključujewp-server-side-renderkao ovisnost.my_dynamic_blocks_render_recent_posts(): Ovo je našrender_callback. Prima$attributesniz, čisti i pretvara ih u ispravne tipove, a zatim koristiWP_Queryza dohvaćanje nedavnih objava. Konstruira HTML<ul>popis i vraća ga.wp_reset_postdata()je ključan nakon prilagođeneWP_Querypetlje kako bi se spriječili sukobi s glavnim WordPress upitom.
Korak 5: Izgradite svoj JavaScript
Ako koristite moderni proces izgradnje JavaScripta (poput @wordpress/scripts), morat ćete izgraditi svoje resurse. Pokrenite npm run build (ili yarn build) u direktoriju vašeg dodatka.
Korak 6: Aktivacija i testiranje
Aktivirajte svoj dodatak. Sada, kada dodate blok 'Recent Posts' u objavu ili stranicu, vidjet ćete sučelje uređivača. Područje pretpregleda prikazat će izlaz renderiran vašom PHP pozivnom funkcijom. Kada objavite ili ažurirate objavu, ista PHP pozivna funkcija pokrenut će se na prednjoj strani kako bi prikazala dinamički sadržaj.
Najbolje prakse i napomene
- Prvo sigurnost: Uvijek čistite i provjeravajte sve podatke koji dolaze iz atributa ili vanjskih izvora prije nego što ih upotrijebite u svom
render_callback. Koristite WordPress funkcije poputesc_html(),esc_url(),sanitize_text_field(), itd. wp_reset_postdata(): Ako vašrender_callbackkoristiWP_Queryili mijenja globalni$postobjekt, uvijek pozovitewp_reset_postdata()nakon toga kako biste vratili izvorni upit i podatke o objavi.- Razmatranja performansi: Iako su dinamički blokovi moćni, prekomjerno ili složeno renderiranje na strani poslužitelja može utjecati na vrijeme učitavanja stranice. Optimizirajte svoje upite i logiku renderiranja. Razmotrite mehanizme predmemorije ako performanse postanu problem.
- Pretpregled uređivača: Komponenta
ServerSideRenderpruža dobar pretpregled, ali se oslanja na slanje zahtjeva poslužitelju. Za vrlo složene blokove, ovo možda neće biti trenutno. Osigurajte da je vašrender_callbackučinkovit. - Rukovanje atributima: Atributi su prvenstveno za konfiguriranje bloka u uređivaču.
render_callbackje odgovoran za dohvaćanje i prikazivanje stvarnog dinamičkog sadržaja. Izbjegavajte pohranjivanje velikih količina dinamičkih podataka izravno u atribute. - Konvencije imenovanja: Koristite jedinstvene prefikse za nazive svojih blokova (npr.
my-plugin-slug/block-name) i nazive PHP funkcija kako biste izbjegli sukobe s drugim dodacima ili temama. - Internacionalizacija: Koristite
__()i_n()za prevedive nizove u svom JavaScript i PHP kodu.
Više od nedavnih objava: Proširenje mogućnosti dinamičkih blokova
Primjer "Nedavne objave" samo je vrh ledenog brijega. Dinamičke blokove možete koristiti za:
- Prikazivanje prilagođenih vrsta objava: Prikazivanje proizvoda, stavki portfelja ili događaja.
- Sadržaj specifičan za korisnika: Prikazivanje sadržaja relevantnog za prijavljenog korisnika.
- Interaktivni obrasci: Iako složeni obrasci još uvijek mogu imati koristi od namjenskih dodataka, mogu se izraditi jednostavni dinamički obrasci.
- Vizualizacija podataka: Dohvaćanje podataka iz API-ja i renderiranje grafikona ili dijagrama (iako to često uključuje naprednije JavaScript knjižnice).
- Integracija s drugim dodacima: Dinamičko prikazivanje podataka kojima upravljaju drugi dodaci.
Zaključak
Dinamički WordPress blokovi neizostavan su alat za razvojne programere koji žele stvoriti istinski interaktivna iskustva temeljena na podacima unutar Gutenbergovog uređivača. Razumijevanjem kako registrirati blokove s render_callback funkcijama i učinkovito upravljati atributima, možete izraditi moćne komponente koje dohvaćaju i prikazuju informacije u stvarnom vremenu. Dok statički blokovi služe svojoj svrsi za strukturirani sadržaj, dinamički blokovi otključavaju novu razinu funkcionalnosti, omogućujući vam da premostite jaz između logike na strani poslužitelja i prezentacije na prednjoj strani. Slijedeći najbolje prakse za sigurnost, performanse i organizaciju koda, možete samouvjereno razvijati robusne i korisne dinamičke blokove koji poboljšavaju vaše WordPress web stranice.
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