Blogi

WordPressin dynaamisten lohkojen hallinta: PHP:n ja JavaScriptin yhdistäminen interaktiiviseen sisältöön

Opi luomaan dynaamisia WordPress-lohkoja, jotka hyödyntävät sekä PHP:tä että JavaScriptiä tarjotakseen käyttäjillesi interaktiivisia ja datalähtöisiä sisältökokemuksia.

Yhteenveto

WordPressin dynaamiset lohkot tarjoavat tehokkaan tavan luoda sisältöä, joka ylittää staattisen HTML:n, mahdollistaen reaaliaikaisen datan integroinnin ja interaktiiviset elementit. Toisin kuin staattiset lohkot, dynaamiset lohkot renderöivät tulosteensa palvelinpuolella PHP:tä käyttäen, mikä mahdollistaa ajantasaisen tiedon hakemisen ja näyttämisen. Tämä artikkeli tarjoaa käytännön oppaan omien dynaamisten lohkojen kehittämiseen, käsitellen lohkojen rekisteröinnin, palvelinpuolen renderöintikutsut ja asiakaspuolen attribuuttien käsittelyn keskeisiä käsitteitä. Käymme läpi vaiheittaisen esimerkin, joka näyttää, kuinka rakentaa dynaaminen lohko, joka näyttää viimeisimmät julkaisut, tarjoten perustan monimutkaisemmille interaktiivisille komponenteille.

WordPressin dynaamisten lohkojen hallinta: PHP:n ja JavaScriptin yhdistäminen interaktiiviseen sisältöön

WordPress on ytimeltään vankka sisällönhallintajärjestelmä (CMS), joka perustuu modulaariseen PHP-arkkitehtuuriin ja MySQL-tietokantaan. Sen laajennettavuus on keskeinen vahvuus, joka saavutetaan pääasiassa teemojen ja lisäosien avulla. Gutenbergiin, lohkoeditoriin, siirtyminen on mullistanut sisällön luomisen esittelemällä modulaarisen, JavaScript-pohjaisen käyttöliittymän. Vaikka staattiset Gutenberg-lohkot ovat erinomaisia jäsennellylle, muuttumattomalle sisällölle, monet todelliset tilanteet vaativat sisältöä, joka on dynaamista, interaktiivista ja datalähtöistä. Tässä dynaamiset lohkot astuvat kuvaan, tarjoten tehokkaan sillan PHP:n palvelinpuolen logiikan ja JavaScriptin asiakaspuolen interaktiivisuuden välille.

Dynaamisten lohkojen tehon ymmärtäminen

Staattiset lohkot, jotka ovat Gutenbergiin oletusarvoisia, luovat HTML:n asiakaspuolella tallennuksen yhteydessä. Tämä HTML tallennetaan sitten suoraan julkaisun sisältöön. Vaikka tehokas staattiselle sisällölle, tällä lähestymistavalla on rajoituksia käsiteltäessä usein muuttuvaa tai palvelinpuolen käsittelyä vaativaa tietoa. Dynaamiset lohkot puolestaan ratkaisevat tämän ongelman renderöimällä tulosteensa palvelinpuolella PHP:tä käyttäen. Kun käyttäjä tarkastelee dynaamista lohkoa sisältävää sivua, WordPress suorittaa PHP-funktion (render_callback) luodakseen lohkon HTML:n lennossa. Tämä mahdollistaa lohkon reaaliaikaisen tiedon hakemisen tietokannasta, vuorovaikutuksen muiden WordPress-toimintojen kanssa ja aina ajantasaisen tiedon esittämisen.

Tämä palvelinpuolen renderöinti on ratkaisevan tärkeää useista syistä:

  • Reaaliaikainen data: Viimeisimpien julkaisujen, tulevien tapahtumien, osakekurssien tai muun usein muuttuvan tiedon näyttäminen.
  • Monimutkainen logiikka: Laskelmien suorittaminen, mukautettujen julkaisutyyppien kyselyt tai integraatio ulkoisiin rajapintoihin ennen tulosteen renderöintiä.
  • Turvallisuus: Tiedon puhdistaminen ja validoiminen ennen sen näyttämistä, erityisesti käsiteltäessä käyttäjän luomaa sisältöä tai ulkoisia lähteitä.
  • Suorituskyky: Monimutkaisten renderöintitehtävien siirtäminen palvelimelle voi joskus parantaa asiakaspuolen suorituskykyä.

Dynaamisen lohkon anatomia

Dynaaminen lohko, kuten mikä tahansa muu Gutenberg-lohko, määritellään sen metadatan ja JavaScript-rekisteröinnin perusteella. Sen ainutlaatuinen ominaisuus on kuitenkin rekisteröinnin yhteydessä määritetty render_callback-attribuutti. Tämä takaisinkutsufunktio vastaa lohkon HTML-tulosteen luomisesta palvelimella.

Tässä on erittely keskeisistä komponenteista:

  1. Lohkon rekisteröinti (JavaScript): Sinun on edelleen rekisteröitävä lohkosi käyttämällä registerBlockType() JavaScript-tiedostossasi. Tämä kertoo Gutenbergille, että lohkosi on olemassa ja miten sen attribuutteja ja editorin käyttöliittymää käsitellään.
  2. Attribuutit: Nämä ovat lohkoosi liittyviä tietokenttiä, jotka tallennetaan julkaisun sisältöön. Dynaamisissa lohkoissa attribuutteja käytetään ensisijaisesti lohkon toiminnan ja asetusten määrittämiseen editorissa. Varsinaisen sisällön, joka näytetään, luo render_callback.
  3. render_callback (PHP): Tämä on dynaamisen lohkon ydin. Se on PHP-funktio, joka vastaanottaa lohkon attribuutit argumenttina ja palauttaa HTML-merkkijonon, joka renderöidään etupäässä.
  4. Editorin käyttöliittymä (JavaScript): Rakennat edelleen lohkon käyttöliittymän Gutenberg-editorin sisällä käyttämällä React-komponentteja. Tämä käyttöliittymä antaa käyttäjille mahdollisuuden määrittää lohkon attribuutit ja nähdä esikatselun (usein yksinkertaistetun esityksen) dynaamisen sisällön ulkoasusta.

Vaiheittainen opas: Dynaamisen "Viimeisimmät julkaisut" -lohkon luominen

Luodaan käytännön esimerkki: dynaaminen lohko, joka näyttää luettelon viimeisimmistä julkaisuista WordPress-sivustoltasi.

Edellytykset:

  • Paikallinen WordPress-kehitysympäristö.
  • Perustiedot PHP:stä ja JavaScriptistä.
  • Lisäosa tai teema, johon lisäät lohkokoodisi.

Vaihe 1: Lohkolisäosan/teeman asennus

Jos sinulla ei ole mukautettua lisäosaa tai teemaa, luo yksinkertainen sellainen. Tässä esimerkissä oletamme, että lisäät tämän lisäosaan.

Vaihe 2: Lohkon rekisteröinti (JavaScript)

Lisäosasi JavaScript-tiedostossa (esim. src/index.js) rekisteröit lohkon. Käytämme @wordpress/blocks ja @wordpress/i18n kansainvälistämiseen.

// src/index.js

import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';

// Tuo lohkosi edit-komponentti
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() -funktiota EI tarvita dynaamisille lohkoille
    // Palvelinpuolen render_callback hoitaa tulosteen
} );

Vaihe 3: Editorikomponentin luominen (JavaScript)

Luo nyt src/edit.js -tiedosto. Tämä komponentti määrittää, miltä lohko näyttää ja miten se toimii Gutenberg-editorissa.

// 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>
            {
                // Käytä ServerSideRenderiä näyttääksesi dynaamisen lohkon esikatselun
                <ServerSideRender
                    block="my-dynamic-blocks/recent-posts"
                    attributes={ attributes }
                />
            }
        </div>
    );
}

Huomaa, että emme määritä save()-funktiota. Tämä on keskeinen ero dynaamisille lohkoille. ServerSideRender-komponenttia käytetään lohkon tulosteen esikatselun näyttämiseen suoraan editorissa tekemällä pyyntö palvelimelle.

Vaihe 4: Skriptien lataaminen ja palvelinpuolen renderöinnin rekisteröinti (PHP)

Lisäosasi pää-PHP-tiedostossa (esim. my-dynamic-blocks.php) sinun on ladattava JavaScript-tiedostosi ja rekisteröitävä lohkotyyppi, mukaan lukien 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() {
    // Rekisteröi lohkotyyppi
    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__ ), // Olettaen, että sinulla on rakennusprosessi
        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öintikutsu Recent Posts -dynaamiselle lohkolle.
 *
 * @param array $attributes Lohkon attribuutit.
 * @return string HTML-tuloste.
 */
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">'; // Käytä luokkaa tyylittelyyn
        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(); // Tärkeää: Nollaa julkaisutiedot mukautetun silmukan jälkeen
    } else {
        $output = '<p>' . __( 'No posts found.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

PHP-koodin selitys:

  • my_dynamic_blocks_register_block(): Tämä funktio liittyy init-koukkuun rekisteröidäkseen lohkotyyppimme. Keskeisesti se määrittelee render_callback-funktion my_dynamic_blocks_render_recent_posts-funktioksi ja välittää myös lohkon attribuutit, peilaten JavaScriptissä määriteltyä.
  • my_dynamic_blocks_enqueue_editor_scripts(): Tämä funktio liittyy enqueue_block_editor_assets-koukkuun ladatakseen JavaScript-tiedostomme erityisesti editoria varten. Se sisältää wp-server-side-render-riippuvuuden.
  • my_dynamic_blocks_render_recent_posts(): Tämä on render_callback-funktiomme. Se vastaanottaa $attributes-taulukon, puhdistaa ja muuntaa ne oikeiksi tyypeiksi, ja käyttää sitten WP_Query-luokkaa hakeakseen viimeisimmät julkaisut. Se rakentaa HTML <ul>-listan ja palauttaa sen. wp_reset_postdata() on elintärkeä mukautetun WP_Query-silmukan jälkeen alkuperäisen kyselyn ja julkaisutietojen palauttamiseksi.

Vaihe 5: JavaScriptin rakentaminen

Jos käytät modernia JavaScript-rakennusprosessia (kuten @wordpress/scripts), sinun on rakennettava resurssisi. Suorita npm run build (tai yarn build) lisäosasi hakemistossa.

Vaihe 6: Aktivointi ja testaus

Aktivoi lisäosasi. Kun lisäät "Recent Posts" -lohkon julkaisuun tai sivulle, näet editorin käyttöliittymän. Esikatselualue näyttää PHP-takaisinkutsusi renderöimän tulosteen. Kun julkaiset tai päivität julkaisun, sama PHP-takaisinkutsu suoritetaan etupäässä dynaamisen sisällön näyttämiseksi.

Parhaat käytännöt ja huomautukset

  • Turvallisuus ensin: Puhdista ja validoi aina kaikki attribuuteista tai ulkoisista lähteistä tuleva tieto ennen sen käyttöä render_callback-funktiossasi. Käytä WordPressin funktioita, kuten esc_html(), esc_url(), sanitize_text_field() jne.
  • wp_reset_postdata(): Jos render_callback-funktiosi käyttää WP_Query-luokkaa tai muokkaa globaalia $post-oliota, kutsu aina wp_reset_postdata() sen jälkeen palauttaaksesi alkuperäisen kyselyn ja julkaisutiedot.
  • Suorituskykyhuomiot: Vaikka dynaamiset lohkot ovat tehokkaita, liiallinen tai monimutkainen palvelinpuolen renderöinti voi vaikuttaa sivun latausaikoihin. Optimoi kyselysi ja renderöintilogiikkasi. Harkitse välimuistimekanismeja, jos suorituskyky muodostuu ongelmaksi.
  • Editorin esikatselu: ServerSideRender-komponentti tarjoaa hyvän esikatselun, mutta se vaatii palvelinpyynnön tekemistä. Erittäin monimutkaisille lohkoille tämä ei välttämättä ole välitöntä. Varmista, että render_callback-funktiosi on tehokas.
  • Attribuuttien käsittely: Attribuutteja käytetään ensisijaisesti lohkon määrittämiseen editorissa. render_callback-funktio vastaa varsinaisen dynaamisen sisällön hakemisesta ja näyttämisestä. Vältä suuren dynaamisen tiedon tallentamista suoraan attribuutteihin.
  • Nimeämiskäytännöt: Käytä yksilöllisiä etuliitteitä lohkojesi nimissä (esim. my-plugin-slug/block-name) ja PHP-funktioiden nimissä välttääksesi ristiriitoja muiden lisäosien tai teemojen kanssa.
  • Kansainvälistäminen: Käytä __() ja _n() käännettäville merkkijonoille sekä JavaScript- että PHP-koodissasi.

Viimeisimmät julkaisut -lohkoa pidemmälle: Dynaamisten lohkojen ominaisuuksien laajentaminen

"Recent Posts" -esimerkki on vain jäävuoren huippu. Voit hyödyntää dynaamisia lohkoja seuraaviin tarkoituksiin:

  • Mukautettujen julkaisutyyppien näyttäminen: Tuotteiden, portfolioesineiden tai tapahtumien esittely.
  • Käyttäjäkohtainen sisältö: Sisällön näyttäminen, joka on relevanttia sisäänkirjautuneelle käyttäjälle.
  • Interaktiiviset lomakkeet: Vaikka monimutkaiset lomakkeet saattavat edelleen hyötyä erillisistä lisäosista, yksinkertaisia dynaamisia lomakkeita voidaan rakentaa.
  • Datan visualisointi: Datan hakeminen rajapinnasta ja kaavioiden tai graafien renderöinti (vaikka tämä vaatii usein edistyneempiä JavaScript-kirjastoja).
  • Integraatio muihin lisäosiin: Muiden lisäosien hallinnoiman datan dynaaminen näyttäminen.

Johtopäätös

Dynaamiset WordPress-lohkot ovat korvaamaton työkalu kehittäjille, jotka haluavat luoda todella interaktiivisia ja datalähtöisiä kokemuksia Gutenberg-editorin sisällä. Ymmärtämällä, kuinka lohkoja rekisteröidään render_callback-funktioilla ja kuinka attribuutteja käsitellään tehokkaasti, voit rakentaa tehokkaita komponentteja, jotka hakevat ja näyttävät reaaliaikaista tietoa. Vaikka staattiset lohkot palvelevat tarkoitustaan jäsennellylle sisällölle, dynaamiset lohkot avaavat uuden tason toiminnallisuutta, antaen sinun yhdistää palvelinpuolen logiikan ja etupään esityksen. Noudattamalla parhaita käytäntöjä turvallisuuden, suorituskyvyn ja koodin organisoinnin osalta voit luotettavasti kehittää vankkoja ja hyödyllisiä dynaamisia lohkoja, jotka parantavat WordPress-verkkosivustojasi.

Sources (5)