Blogg

Mestre WordPress Dynamiske Blokker: Brobygging av PHP og JavaScript for Interaktivt Innhold

Lær hvordan du lager dynamiske WordPress-blokker som utnytter både PHP og JavaScript for å levere interaktive og datadrevne innholdsopplevelser for brukerne dine.

Sammendrag

WordPress dynamiske blokker tilbyr en kraftig måte å lage innhold som går utover statisk HTML, og muliggjør sanntids dataintegrasjon og interaktive elementer. I motsetning til statiske blokker, gjengir dynamiske blokker utdataene sine på serversiden ved hjelp av PHP, noe som gjør at de kan hente og vise oppdatert informasjon. Denne artikkelen gir en praktisk veiledning for å utvikle dine egne dynamiske blokker, og dekker de essensielle konseptene for blokkregistrering, serverside-gjengivelseskall og håndtering av klientattributter. Vi vil gå gjennom et steg-for-steg-eksempel, som demonstrerer hvordan du bygger en dynamisk blokk som viser nylige innlegg, og gir et grunnlag for mer komplekse interaktive komponenter.

Mestre WordPress Dynamiske Blokker: Brobygging av PHP og JavaScript for Interaktivt Innhold

WordPress, i sin kjerne, er et robust innholdsstyringssystem (CMS) bygget på en modulær PHP-arkitektur og en MySQL-database. Dens utvidbarhet er en nøkkelstyrke, primært oppnådd gjennom temaer og plugins. Fremveksten av Gutenberg, blokkredigeringsprogrammet, har revolusjonert innholdsskaping ved å introdusere et modulært, JavaScript-drevet grensesnitt. Mens statiske Gutenberg-blokker er utmerkede for strukturert, uforanderlig innhold, krever mange virkelige scenarier innhold som er dynamisk, interaktivt og datadrevet. Dette er der dynamiske blokker kommer inn, og tilbyr en kraftig bro mellom serverlogikken til PHP og klientinteraktiviteten til JavaScript.

Forstå Kraften i Dynamiske Blokker

Statiske blokker, standarden i Gutenberg, genererer HTML på klientsiden når de lagres. Denne HTML-en lagres deretter direkte i innleggsinnholdet. Selv om det er effektivt for statisk innhold, har denne tilnærmingen begrensninger når det gjelder data som endres ofte eller krever serverprosessering. Dynamiske blokker, derimot, løser dette problemet ved å gjengi utdataene sine på serversiden ved hjelp av PHP. Når en bruker ser en side som inneholder en dynamisk blokk, utfører WordPress en PHP-funksjon ( render_callback ) for å generere blokkens HTML "on the fly". Dette gjør at blokken kan hente sanntidsdata fra databasen, samhandle med andre WordPress-funksjoner og presentere informasjon som alltid er oppdatert.

Denne serverside-gjengivelsen er avgjørende av flere grunner:

  • Sanntidsdata: Viser de siste innleggene, kommende arrangementer, aksjekurser eller andre data som endres ofte.
  • Kompleks logikk: Utfører beregninger, spør om egendefinerte innleggstyper eller integrerer med eksterne API-er før utdataene gjengis.
  • Sikkerhet: Sanitiserer og validerer data før de vises, spesielt når det gjelder brukergenerert innhold eller eksterne kilder.
  • Ytelse: Avlasting av komplekse gjengivelsesoppgaver til serveren kan noen ganger forbedre klientsidenes ytelse.

Anatomien til en Dynamisk Blokk

En dynamisk blokk, som enhver annen Gutenberg-blokk, defineres av metadataene og JavaScript-registreringen. Dens unike egenskap ligger imidlertid i render_callback -attributtet som er spesifisert under registreringen. Denne tilbakekallingsfunksjonen er ansvarlig for å generere blokkens HTML-utdata på serveren.

Her er en oversikt over nøkkelkomponentene:

  1. Blokkregistrering (JavaScript): Du må fortsatt registrere blokken din ved hjelp av registerBlockType() i JavaScript-filen din. Dette forteller Gutenberg at blokken din eksisterer og hvordan du håndterer attributtene og grensesnittet i redigeringsprogrammet.
  2. Attributter: Dette er datafeltene knyttet til blokken din, lagret i innleggsinnholdet. For dynamiske blokker brukes attributter primært til å konfigurere blokkens oppførsel og innstillinger i redigeringsprogrammet. Det faktiske innholdet som vises, genereres av render_callback .
  3. render_callback (PHP): Dette er hjertet i en dynamisk blokk. Det er en PHP-funksjon som mottar blokkens attributter som et argument og returnerer HTML-strengen som skal gjengis på front-end.
  4. Redigeringsgrensesnitt (JavaScript): Du vil fortsatt bygge blokkens grensesnitt i Gutenberg-redigeringsprogrammet ved hjelp av React-komponenter. Dette grensesnittet lar brukere konfigurere blokkens attributter og se en forhåndsvisning (ofte en forenklet representasjon) av hvordan det dynamiske innholdet vil se ut.

Steg-for-steg: Opprette en Dynamisk "Nylige Innlegg"-blokk

La oss lage et praktisk eksempel: en dynamisk blokk som viser en liste over de nyeste innleggene fra WordPress-nettstedet ditt.

Forutsetninger:

  • Et lokalt WordPress-utviklingsmiljø.
  • Grunnleggende forståelse av PHP og JavaScript.
  • En plugin eller et tema der du vil legge til blokkkoden din.

Steg 1: Sett opp din Blokk-plugin/tema

Hvis du ikke har en egendefinert plugin eller et tema, opprett en enkel en. For dette eksemplet antar vi at du legger dette til en plugin.

Steg 2: Registrer Blokk (JavaScript)

I pluginens JavaScript-fil (f.eks. src/index.js), vil du registrere blokken. Vi vil bruke @wordpress/blocks og @wordpress/i18n for internasjonalisering.

// src/index.js

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

// Importer din bloks redigeringskomponent
import Edit from './edit';

registerBlockType( 'my-dynamic-blocks/recent-posts', {
    title: __( 'Nylige Innlegg', 'my-dynamic-blocks' ),
    icon: 'list-view',
    category: 'widgets',
    attributes: {
        numberOfPosts: {
            type: 'number',
            default: 5,
        },
        showExcerpt: {
            type: 'boolean',
            default: true,
        },
    },
    edit: Edit,
    // save() funksjonen trengs IKKE for dynamiske blokker
    // serverside render_callback vil håndtere utdataene
} );

Steg 3: Opprett Redigeringskomponenten (JavaScript)

Lag nå src/edit.js-filen. Denne komponenten vil definere hvordan blokken ser ut og oppfører seg i Gutenberg-redigeringsprogrammet.

// 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={ __( 'Innleggsinnstillinger', 'my-dynamic-blocks' ) }>
                    <RangeControl
                        label={ __( 'Antall Innlegg', 'my-dynamic-blocks' ) }
                        value={ numberOfPosts }
                        onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
                        min={ 1 }
                        max={ 10 }
                    />
                    <ToggleControl
                        label={ __( 'Vis Utdrag', 'my-dynamic-blocks' ) }
                        checked={ showExcerpt }
                        onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
                    />
                </PanelBody>
            </InspectorControls>
            {
                // Bruk ServerSideRender for å vise en forhåndsvisning av den dynamiske blokken
                <ServerSideRender
                    block="my-dynamic-blocks/recent-posts"
                    attributes={ attributes }
                />
            }
        </div>
    );
}

Legg merke til at vi ikke definerer en save()-funksjon. Dette er nøkkelforskjellen for dynamiske blokker. ServerSideRender-komponenten brukes til å vise en forhåndsvisning av blokkens utdata direkte i redigeringsprogrammet, ved å sende en forespørsel til serveren.

Steg 4: Enqueue Skript og Registrer Serverside-gjengivelse (PHP)

I pluginens hoved-PHP-fil (f.eks. my-dynamic-blocks.php), må du enqueue JavaScript-filen din og registrere blokktypen, inkludert render_callback .

<?php
/**
 * Plugin Navn: My Dynamic Blocks
 * Beskrivelse: En enkel plugin for dynamiske Gutenberg-blokker.
 * Versjon: 1.0
 * Forfatter: Ditt Navn
 */

function my_dynamic_blocks_register_block() {
    // Registrer blokktypen
    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__ ), // Forutsetter at du har en byggeprosess
        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' );

/**
 * Gjengivelseskall for den dynamiske "Nylige Innlegg"-blokken.
 *
 * @param array $attributes Blokkattributter.
 * @return string HTML-utdata.
 */
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">'; // Bruk en klasse for styling
        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(); // Viktig: Tilbakestill postdata etter egendefinert løkke
    } else {
        $output = '<p>' . __( 'Ingen innlegg funnet.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

Forklaring av PHP-koden:

  • my_dynamic_blocks_register_block(): Denne funksjonen kobler seg til init for å registrere blokktypen vår. Viktigst av alt, den definerer render_callback som my_dynamic_blocks_render_recent_posts og sender også blokkens attributter, som speiler det som er definert i JavaScript.
  • my_dynamic_blocks_enqueue_editor_scripts(): Denne funksjonen kobler seg til enqueue_block_editor_assets for å laste JavaScript-filen vår spesifikt for redigeringsprogrammet. Den inkluderer wp-server-side-render som en avhengighet.
  • my_dynamic_blocks_render_recent_posts(): Dette er vår render_callback. Den mottar $attributes-arrayet, saniterer og konverterer dem til riktige typer, og bruker deretter WP_Query for å hente de nyeste innleggene. Den konstruerer en HTML <ul>-liste og returnerer den. wp_reset_postdata() er avgjørende etter en egendefinert WP_Query-løkke for å forhindre konflikter med hoved-WordPress-spørringen.

Steg 5: Bygg din JavaScript

Hvis du bruker en moderne JavaScript-byggeprosess (som @wordpress/scripts), må du bygge ressursene dine. Kjør npm run build (eller yarn build) i pluginens katalog.

Steg 6: Aktiver og Test

Aktiver pluginen din. Nå, når du legger til "Nylige Innlegg"-blokken til et innlegg eller en side, vil du se redigeringsgrensesnittet. Forhåndsvisningsområdet vil vise utdataene gjengitt av PHP-kallet ditt. Når du publiserer eller oppdaterer innlegget, vil det samme PHP-kallet kjøre på front-end for å vise det dynamiske innholdet.

Beste Praksis og Forbehold

  • Sikkerhet Først: Saniter og valider alltid data som kommer fra attributter eller eksterne kilder før du bruker dem i din render_callback. Bruk WordPress-funksjoner som esc_html(), esc_url(), sanitize_text_field(), osv.
  • wp_reset_postdata(): Hvis din render_callback bruker WP_Query eller endrer det globale $post-objektet, kall alltid wp_reset_postdata() etterpå for å gjenopprette den opprinnelige spørringen og postdataen.
  • Ytelseshensyn: Selv om dynamiske blokker er kraftige, kan overdreven eller kompleks serverside-gjengivelse påvirke sideinnlastingstider. Optimaliser spørringene og gjengivelseslogikken din. Vurder cache-mekanismer hvis ytelsen blir et problem.
  • Forhåndsvisning i Redigeringsprogrammet: ServerSideRender-komponenten gir en god forhåndsvisning, men den er avhengig av å sende en serverforespørsel. For svært komplekse blokker er dette kanskje ikke øyeblikkelig. Sørg for at din render_callback er effektiv.
  • Håndtering av Attributter: Attributter er primært for å konfigurere blokken i redigeringsprogrammet. render_callback er ansvarlig for å hente og vise det faktiske dynamiske innholdet. Unngå å lagre store mengder dynamisk data direkte i attributter.
  • Navnekonvensjoner: Bruk unike prefikser for blokknavnene dine (f.eks. my-plugin-slug/block-name) og PHP-funksjonsnavn for å unngå konflikter med andre plugins eller temaer.
  • Internasjonalisering: Bruk __() og _n() for oversettbare strenger i både JavaScript- og PHP-koden din.

Utover Nylige Innlegg: Utvidelse av Dynamiske Blokkfunksjoner

Eksemplet med "Nylige Innlegg" er bare toppen av isfjellet. Du kan utnytte dynamiske blokker for:

  • Visning av egendefinerte innleggstyper: Vise frem produkter, porteføljeposter eller arrangementer.
  • Brukerspesifikt innhold: Vise innhold som er relevant for den påloggede brukeren.
  • Interaktive skjemaer: Selv om komplekse skjemaer kan dra nytte av dedikerte plugins, kan enkle dynamiske skjemaer bygges.
  • Datavisualisering: Hente data fra et API og gjengi diagrammer eller grafer (selv om dette ofte innebærer mer avanserte JavaScript-biblioteker).
  • Integrasjon med andre plugins: Dynamisk vise data som administreres av andre plugins.

Konklusjon

Dynamiske WordPress-blokker er et uunnværlig verktøy for utviklere som ønsker å skape virkelig interaktive og datadrevne opplevelser innenfor Gutenberg-redigeringsprogrammet. Ved å forstå hvordan man registrerer blokker med render_callback-funksjoner og håndterer attributter effektivt, kan du bygge kraftige komponenter som henter og viser sanntidsinformasjon. Mens statiske blokker tjener sitt formål for strukturert innhold, låser dynamiske blokker opp et nytt nivå av funksjonalitet, og lar deg bygge bro mellom serverlogikk og front-end-presentasjon. Ved å følge beste praksis for sikkerhet, ytelse og kodeorganisering, kan du trygt utvikle robuste og nyttige dynamiske blokker som forbedrer WordPress-nettstedene dine.

Sources (5)