Блог
Ovladavanje dinamičkim blokovima u WordPressu: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj
Naučite kako da kreirate dinamičke WordPress blokove koji koriste i PHP i JavaScript kako biste svojim korisnicima pružili interaktivna i podatkovno vođena iskustva sadržaja.

Sažetak
Dinamički blokovi u WordPressu nude moćan način za kreiranje sadržaja koji prevazilazi statični HTML, omogućavajući integraciju podataka u realnom vremenu i interaktivne elemente. Za razliku od statičkih blokova, dinamički blokovi renderuju svoj izlaz na strani servera koristeći PHP, što im omogućava da dohvate i prikažu ažurirane informacije. Ovaj članak pruža praktičan vodič za razvoj sopstvenih dinamičkih blokova, pokrivajući suštinske koncepte registracije blokova, povratnih funkcija za renderovanje na strani servera i rukovanje atributima na strani klijenta. Proći ćemo kroz primer korak po korak, demonstrirajući kako da izgradite dinamički blok koji prikazuje nedavne postove, nudeći osnovu za složenije interaktivne komponente.
Ovladavanje dinamičkim blokovima u WordPressu: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj
WordPress, u svojoj suštini, je robustan sistem za upravljanje sadržajem (CMS) izgrađen na modularnoj PHP arhitekturi i MySQL bazi podataka. Njegova proširivost je ključna snaga, uglavnom postignuta kroz teme i dodatke. Dolazak Gittenberga, editora blokova, revolucionisao je kreiranje sadržaja uvođenjem modularnog interfejsa vođenog JavaScriptom. Dok su statički Gittenberg blokovi odlični za strukturiran, nepromenljiv sadržaj, mnogi scenariji iz stvarnog života zahtevaju sadržaj koji je dinamičan, interaktivan i vođen podacima. Tu na scenu stupaju dinamički blokovi, nudeći moćan most između logike na strani servera PHP-a i interaktivnosti na strani klijenta JavaScripta.
Razumevanje moći dinamičkih blokova
Statički blokovi, podrazumevani u Gittenbergu, generišu HTML na strani klijenta prilikom čuvanja. Ovaj HTML se zatim direktno skladišti u sadržaj posta. Iako efikasan za statički sadržaj, ovaj pristup ima ograničenja kada se radi o podacima koji se često menjaju ili zahtevaju obradu na strani servera. Dinamički blokovi, s druge strane, rešavaju ovaj problem renderovanjem svog izlaza na strani servera koristeći PHP. Kada korisnik pregleda stranicu koja sadrži dinamički blok, WordPress izvršava PHP funkciju (render_callback) da bi generisao HTML bloka u hodu. Ovo omogućava bloku da dohvati podatke u realnom vremenu iz baze podataka, komunicira sa drugim WordPress funkcionalnostima i predstavlja informacije koje su uvek ažurne.
Ovo renderovanje na strani servera je ključno iz nekoliko razloga:
- Podaci u realnom vremenu: Prikazivanje najnovijih postova, predstojećih događaja, cena akcija ili bilo kojih drugih podataka koji se često menjaju.
- Složena logika: Izvođenje proračuna, upita ka prilagođenim tipovima postova ili integracija sa eksternim API-jima pre renderovanja izlaza.
- Bezbednost: Čišćenje i validacija podataka pre nego što se prikažu, posebno kada se radi o sadržaju generisanom od strane korisnika ili eksternim izvorima.
- Performanse: Prebacivanje složenih zadataka renderovanja na server ponekad može poboljšati performanse na strani klijenta.
Anatomija dinamičkog bloka
Dinamički blok, kao i svaki drugi Gittenberg blok, definisan je svojim metapodacima i JavaScript registracijom. Međutim, njegova jedinstvena karakteristika leži u render_callback atributu navedenom prilikom registracije. Ova povratna funkcija je odgovorna za generisanje HTML izlaza bloka na serveru.
Evo pregleda ključnih komponenti:
- Registracija bloka (JavaScript): Još uvek morate da registrujete svoj blok koristeći
registerBlockType()u vašoj JavaScript datoteci. Ovo govori Gittenbergu da vaš blok postoji i kako da rukuje njegovim atributima i interfejsom editora. - Atributi: Ovo su polja podataka povezana sa vašim blokom, uskladištena u sadržaju posta. Za dinamičke blokove, atributi se primarno koriste za konfigurisanje ponašanja i podešavanja bloka u editoru. Stvarni prikazani sadržaj generiše
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 string koji treba da se renderuje na front-endu.- Interfejs editora (JavaScript): Još uvek ćete graditi interfejs bloka unutar Gittenberg editora koristeći React komponente. Ovaj interfejs omogućava korisnicima da konfigurišu atribute bloka i vide pregled (često pojednostavljenu reprezentaciju) kako će dinamički sadržaj izgledati.
Korak po korak: Kreiranje dinamičkog bloka "Nedavni postovi"
Napravimo praktičan primer: dinamički blok koji prikazuje listu najnovijih postova sa vašeg WordPress sajta.
Preduslovi:
- Lokalno WordPress razvojno okruženje.
- Osnovno razumevanje PHP-a i JavaScripta.
- Dodatak ili tema gde ćete dodati kod svog bloka.
Korak 1: Postavite svoj dodatak/temu za blokove
Ako nemate prilagođeni dodatak ili temu, kreirajte jednostavan. Za ovaj primer, pretpostavićemo da ovo dodajete dodatku.
Korak 2: Registrujte blok (JavaScript)
U JavaScript datoteci vašeg dodatka (npr. src/index.js), registrujte blok. Koristić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 servera će rukovati izlazom
} );
Korak 3: Kreirajte komponentu editora (JavaScript)
Sada kreirajte datoteku src/edit.js. Ova komponenta će definisati kako blok izgleda i ponaša se unutar Gittenberg editora.
// 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 pregleda dinamičkog bloka
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Primećujete da ne definišemo save() funkciju. Ovo je ključna razlika za dinamičke blokove. ServerSideRender komponenta se koristi za prikaz pregleda izlaza bloka direktno u editoru, slanjem zahteva serveru.
Korak 4: Uključite skripte i registrujte renderovanje na strani servera (PHP)
U glavnoj PHP datoteci vašeg dodatka (npr. my-dynamic-blocks.php), morate da uključite svoju JavaScript datoteku i registrujete tip 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() {
// Registrujte tip 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' );
/**
* Render callback za dinamički blok Nedavni postovi.
*
* @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 stilizovanje
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: Resetujte podatke posta 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 zakači nainitda bi registrovala naš tip bloka. Ključno, definišerender_callbackkaomy_dynamic_blocks_render_recent_postsi takođe prosleđuje atribute bloka, odražavajući ono što je definisano u JavaScriptu.my_dynamic_blocks_enqueue_editor_scripts(): Ova funkcija se zakači naenqueue_block_editor_assetsda bi učitala našu JavaScript datoteku specifično za editor. Uključujewp-server-side-renderkao zavisnost.my_dynamic_blocks_render_recent_posts(): Ovo je našrender_callback. Prima$attributesniz, čisti i konvertuje ih u ispravne tipove, a zatim koristiWP_Queryza dohvaćanje nedavnih postova. Konstruiše HTML<ul>listu i vraća je.wp_reset_postdata()je ključan nakon prilagođeneWP_Querypetlje da bi se sprečili sukobi sa glavnim WordPress upitom.
Korak 5: Izgradite svoj JavaScript
Ako koristite moderan JavaScript proces izgradnje (kao što je @wordpress/scripts), moraćete da izgradite svoje resurse. Pokrenite npm run build (ili yarn build) u direktorijumu vašeg dodatka.
Korak 6: Aktivirajte i testirajte
Aktivirajte svoj dodatak. Sada, kada dodate blok 'Recent Posts' na post ili stranicu, videćete interfejs editora. Područje pregleda će prikazati izlaz renderovan vašim PHP pozivom. Kada objavite ili ažurirate post, isti PHP poziv će se izvršiti na front-endu da bi prikazao dinamički sadržaj.
Najbolje prakse i napomene
- Prvo bezbednost: Uvek čistite i validirajte sve podatke koji dolaze iz atributa ili eksternih izvora pre nego što ih koristite u svom
render_callback. Koristite WordPress funkcije kao što suesc_html(),esc_url(),sanitize_text_field(), itd. wp_reset_postdata(): Ako vašrender_callbackkoristiWP_Queryili modifikuje globalni$postobjekat, uvek pozovitewp_reset_postdata()nakon toga da biste vratili originalni upit i podatke posta.- Razmatranja performansi: Iako su dinamički blokovi moćni, prekomerno ili složeno renderovanje na strani servera može uticati na vreme učitavanja stranice. Optimizujte svoje upite i logiku renderovanja. Razmotrite mehanizme keširanja ako performanse postanu problem.
- Pregled editora:
ServerSideRenderkomponenta pruža dobar pregled, ali se oslanja na slanje zahteva serveru. Za veoma složene blokove, ovo možda neće biti trenutno. Osigurajte da je vašrender_callbackefikasan. - Rukovanje atributima: Atributi su primarno za konfigurisanje bloka u editoru.
render_callbackje odgovoran za dohvaćanje i prikazivanje stvarnog dinamičkog sadržaja. Izbegavajte skladištenje velikih količina dinamičkih podataka direktno u atribute. - Konvencije imenovanja: Koristite jedinstvene prefikse za nazive vaših blokova (npr.
my-plugin-slug/block-name) i PHP funkcija kako biste izbegli sukobe sa drugim dodacima ili temama. - Internacionalizacija: Koristite
__()i_n()za prevodive stringove i u vašem JavaScript i PHP kodu.
Dalje od nedavnih postova: Proširenje mogućnosti dinamičkih blokova
Primer "Nedavni postovi" je samo vrh ledenog brega. Možete iskoristiti dinamičke blokove za:
- Prikazivanje prilagođenih tipova postova: Prikazivanje proizvoda, stavki portfolija ili događaja.
- Sadržaj specifičan za korisnika: Prikazivanje sadržaja relevantnog za prijavljenog korisnika.
- Interaktivni obrasci: Iako složeni obrasci mogu i dalje imati koristi od namenskih dodataka, jednostavni dinamički obrasci se mogu izgraditi.
- Vizualizacija podataka: Dohvatanje podataka iz API-ja i renderovanje grafova ili dijagrama (iako ovo često uključuje naprednije JavaScript biblioteke).
- Integracija sa drugim dodacima: Dinamičko prikazivanje podataka kojima upravljaju drugi dodaci.
Zaključak
Dinamički WordPress blokovi su neophodan alat za programere koji žele da kreiraju istinski interaktivna i podatkovno vođena iskustva unutar Gittenberg editora. Razumevanjem kako registrovati blokove sa render_callback funkcijama i efikasno upravljati atributima, možete izgraditi moćne komponente koje dohvaćaju i prikazuju informacije u realnom vremenu. Dok statički blokovi služe svojoj svrsi za strukturiran sadržaj, dinamički blokovi otključavaju novi nivo funkcionalnosti, omogućavajući vam da premostite jaz između logike na strani servera i prezentacije na front-endu. Prateći najbolje prakse za bezbednost, performanse i organizaciju koda, možete sa samopouzdanjem razvijati robusne i korisne dinamičke blokove koji poboljšavaju vaše WordPress sajtove.
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