Blog

Ovladavanje dinamičkim WordPress blokovima: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj

Naučite kako kreirati dinamičke WordPress blokove koji koriste i PHP i JavaScript kako biste korisnicima pružili interaktivna iskustva sadržaja zasnovana na podacima.

Sažetak

Dinamički WordPress blokovi 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, omogućavajući im 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 izgraditi dinamički blok koji prikazuje nedavne postove, nudeći osnovu za složenije interaktivne komponente.

Ovladavanje dinamičkim WordPress blokovima: Povezivanje PHP-a i JavaScripta za interaktivni sadržaj

WordPress, u svojoj suštini, je robusni 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 zasnovan na 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) za generisanje HTML-a 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 izračunavanja, upita prilagođenih tipova postova ili integracija sa spoljnim API-jima pre renderovanja izlaza.
  • Sigurnost: Čišćenje i validacija podataka pre nego što se prikažu, posebno kada se radi o sadržaju generisanom od strane korisnika ili spoljnim 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 tokom registracije. Ova povratna funkcija je odgovorna za generisanje HTML izlaza bloka na serveru.

Evo pregleda ključnih komponenti:

  1. Registracija bloka (JavaScript): Još uvek morate registrovati 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.
  2. 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.
  3. 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 renderovati na front-endu.
  4. 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še WordPress lokacije.

Preduslovi:

  • Lokalno WordPress okruženje za razvoj.
  • 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: __( 'Nedavni postovi', '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={ __( 'Podešavanja posta', 'my-dynamic-blocks' ) }>
                    <RangeControl
                        label={ __( 'Broj postova', 'my-dynamic-blocks' ) }
                        value={ numberOfPosts }
                        onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
                        min={ 1 }
                        max={ 10 }
                    />
                    <ToggleControl
                        label={ __( 'Prikaži izvod', '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 uključiti svoju JavaScript datoteku i registrovati tip bloka, uključujući render_callback.

<?php
/**
 * Naziv dodatka: Moji dinamički blokovi
 * Opis: Jednostavan dodatak za dinamičke Gittenberg blokove.
 * Verzija: 1.0
 * Autor: Vaše Ime
 */

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' );

/**
 * Povratna funkcija za renderovanje dinamičkog bloka 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>' . __( 'Nema pronađenih postova.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

Objašnjenje PHP koda:

  • my_dynamic_blocks_register_block(): Ova funkcija se zakači na init da bi registrovala naš tip bloka. Ključno, definiše render_callback kao my_dynamic_blocks_render_recent_posts i 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 na enqueue_block_editor_assets da bi učitala našu JavaScript datoteku posebno za editor. Uključuje wp-server-side-render kao zavisnost.
  • my_dynamic_blocks_render_recent_posts(): Ovo je naš render_callback. Prima $attributes niz, čisti ga i pretvara u ispravne tipove, a zatim koristi WP_Query za dohvaćanje nedavnih postova. Konstruiše HTML <ul> listu i vraća je. wp_reset_postdata() je ključan nakon prilagođene WP_Query petlje kako bi se sprečili sukobi sa glavnim WordPress upitom.

Korak 5: Izgradite svoj JavaScript

Ako koristite moderan proces izgradnje JavaScripta (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 'Nedavni postovi' u 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 sigurnost: Uvek čistite i validirajte sve podatke koji dolaze iz atributa ili spoljnih izvora pre nego što ih koristite u svom render_callback. Koristite WordPress funkcije kao što su esc_html(), esc_url(), sanitize_text_field(), itd.
  • wp_reset_postdata(): Ako vaš render_callback koristi WP_Query ili modifikuje globalni $post objekat, uvek pozovite wp_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: ServerSideRender komponenta pruža dobar pregled, ali se oslanja na slanje serverskog zahteva. Za veoma složene blokove, ovo možda neće biti trenutno. Osigurajte da je vaš render_callback efikasan.
  • Rukovanje atributima: Atributi su prvenstveno za konfigurisanje bloka u editoru. render_callback je 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 nazive PHP funkcija kako biste izbegli sukobe sa drugim dodacima ili temama.
  • Internacionalizacija: Koristite __() i _n() za prevodive stringove u vašem JavaScript i PHP kodu.

Više od nedavnih postova: Proširenje mogućnosti dinamičkih blokova

Primer "Nedavni postovi" je samo vrh ledenog brega. Dinamičke blokove možete koristiti za:

  • Prikazivanje prilagođenih tipova postova: Prikazivanje proizvoda, portfolio stavki ili događaja.
  • Sadržaj specifičan za korisnika: Prikazivanje sadržaja relevantnog za prijavljenog korisnika.
  • Interaktivni obrasci: Iako bi složeni obrasci i dalje imali koristi od namenskih dodataka, mogu se izgraditi jednostavni dinamički obrasci.
  • Vizualizacija podataka: Dohvatanje podataka iz API-ja i renderovanje grafikona 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 iskustva zasnovana na podacima 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 sigurnost, performanse i organizaciju koda, možete sa samopouzdanjem razvijati robusne i korisne dinamičke blokove koji poboljšavaju vaše WordPress veb lokacije.

Sources (5)