Blog
Mestring af WordPress Dynamiske Blokke: Brobygning mellem PHP og JavaScript for Interaktivt Indhold
Lær at oprette dynamiske WordPress-blokke, der udnytter både PHP og JavaScript til at levere interaktive og datadrevne indholdoplevelser for dine brugere.

Oversigt
WordPress dynamiske blokke tilbyder en kraftfuld måde at skabe indhold, der går ud over statisk HTML, og muliggør realtids dataintegration og interaktive elementer. I modsætning til statiske blokke gengiver dynamiske blokke deres output på serversiden ved hjælp af PHP, hvilket gør dem i stand til at hente og vise opdateret information. Denne artikel giver en praktisk guide til at udvikle dine egne dynamiske blokke, der dækker de væsentlige koncepter for blokregistrering, server-side rendering callbacks og håndtering af klient-side attributter. Vi gennemgår et trin-for-trin eksempel, der demonstrerer, hvordan man bygger en dynamisk blok, der viser seneste indlæg, og tilbyder et fundament for mere komplekse interaktive komponenter.
Mestring af WordPress Dynamiske Blokke: Brobygning mellem PHP og JavaScript for Interaktivt Indhold
WordPress er i sin kerne et robust Content Management System (CMS) bygget på en modulær PHP-arkitektur og en MySQL-database. Dens udvidelsesmuligheder er en nøglestyrke, primært opnået gennem temaer og plugins. Fremkomsten af Gutenberg, blokeditoren, har revolutioneret indholdsskabelse ved at introducere en modulær, JavaScript-drevet grænseflade. Mens statiske Gutenberg-blokke er fremragende til struktureret, uforanderligt indhold, kræver mange scenarier i den virkelige verden indhold, der er dynamisk, interaktivt og datadrevet. Det er her, dynamiske blokke kommer ind i billedet og tilbyder en kraftfuld bro mellem server-side logikken i PHP og klient-side interaktiviteten i JavaScript.
Forståelse af Kraften i Dynamiske Blokke
Statiske blokke, standarden i Gutenberg, genererer HTML på klientsiden, når de gemmes. Denne HTML gemmes derefter direkte i indlæggets indhold. Mens det er effektivt for statisk indhold, har denne tilgang begrænsninger, når det drejer sig om data, der ændrer sig hyppigt eller kræver server-side behandling. Dynamiske blokke løser derimod dette problem ved at gengive deres output på serversiden ved hjælp af PHP. Når en bruger ser en side, der indeholder en dynamisk blok, udfører WordPress en PHP-funktion ( render_callback ) for at generere blokkens HTML on-the-fly. Dette giver blokken mulighed for at hente realtidsdata fra databasen, interagere med andre WordPress-funktionaliteter og præsentere information, der altid er opdateret.
Denne server-side rendering er afgørende af flere årsager:
- Realtidsdata: Visning af de seneste indlæg, kommende begivenheder, aktiekurser eller andre data, der ændrer sig hyppigt.
- Kompleks logik: Udførelse af beregninger, forespørgsler på brugerdefinerede indlægstyper eller integration med eksterne API'er, før outputtet gengives.
- Sikkerhed: Rensning og validering af data, før de vises, især når det drejer sig om brugergenereret indhold eller eksterne kilder.
- Ydeevne: Afskibning af komplekse renderingopgaver til serveren kan undertiden forbedre klient-side ydeevnen.
Anatomien af en Dynamisk Blok
En dynamisk blok, ligesom enhver anden Gutenberg-blok, defineres af dens metadata og JavaScript-registrering. Dens unikke karakteristika ligger dog i render_callback attributten, der er specificeret under registreringen. Denne callback-funktion er ansvarlig for at generere blokkens HTML-output på serveren.
Her er en oversigt over nøglekomponenterne:
- Blokregistrering (JavaScript): Du skal stadig registrere din blok ved hjælp af
registerBlockType()i din JavaScript-fil. Dette fortæller Gutenberg, at din blok eksisterer, og hvordan den skal håndtere dens attributter og redigeringsgrænseflade. - Attributter: Dette er datafelterne forbundet med din blok, gemt i indlæggets indhold. For dynamiske blokke bruges attributter primært til at konfigurere blokkens adfærd og indstillinger i editoren. Det faktiske indhold, der vises, genereres af
render_callback. render_callback(PHP): Dette er kernen i en dynamisk blok. Det er en PHP-funktion, der modtager blokkens attributter som et argument og returnerer HTML-strengen, der skal gengives på front-end.- Redigeringsgrænseflade (JavaScript): Du vil stadig bygge blokkens grænseflade inden for Gutenberg-editoren ved hjælp af React-komponenter. Denne grænseflade giver brugerne mulighed for at konfigurere blokkens attributter og se en forhåndsvisning (ofte en forenklet repræsentation) af, hvordan det dynamiske indhold vil se ud.
Trin-for-Trin: Oprettelse af en Dynamisk "Seneste Indlæg" Blok
Lad os oprette et praktisk eksempel: en dynamisk blok, der viser en liste over de seneste indlæg fra din WordPress-side.
Forudsætninger:
- Et lokalt WordPress-udviklingsmiljø.
- Grundlæggende forståelse af PHP og JavaScript.
- Et plugin eller tema, hvor du vil tilføje din blokkode.
Trin 1: Opsætning af dit Blok-plugin/tema
Hvis du ikke har et brugerdefineret plugin eller tema, skal du oprette et simpelt et. Til dette eksempel antager vi, at du tilføjer dette til et plugin.
Trin 2: Registrering af Blokken (JavaScript)
I din plugins JavaScript-fil (f.eks. src/index.js) skal du registrere blokken. Vi bruger @wordpress/blocks og @wordpress/i18n til internationalisering.
// 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: __( 'Seneste Indlæg', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// save() funktionen er IKKE nødvendig for dynamiske blokke
// Server-side render_callback vil håndtere outputtet
} );
Trin 3: Oprettelse af Redigeringskomponenten (JavaScript)
Opret nu src/edit.js filen. Denne komponent definerer, hvordan blokken ser ud og opfører sig inden for Gutenberg-editoren.
// 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={ __( 'Indlægsindstillinger', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Antal Indlæg', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Vis uddrag', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Brug ServerSideRender til at vise en forhåndsvisning af den dynamiske blok
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Bemærk, at vi ikke definerer en save() funktion. Dette er den vigtigste forskel for dynamiske blokke. ServerSideRender komponenten bruges til at vise en forhåndsvisning af blokkens output direkte i editoren ved at foretage en anmodning til serveren.
Trin 4: Indlæs Scripts og Registrer Server-Side Rendering (PHP)
I din plugins hoved PHP-fil (f.eks. my-dynamic-blocks.php) skal du indlæse din JavaScript-fil og registrere bloktypen, inklusive render_callback.
<?php
/**
* Plugin Navn: My Dynamic Blocks
* Beskrivelse: Et simpelt plugin til dynamiske Gutenberg-blokke.
* Version: 1.0
* Forfatter: Dit Navn
*/
function my_dynamic_blocks_register_block() {
// Registrer bloktypen
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__ ), // Antager, at du har en build-proces
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 for den dynamiske "Seneste Indlæg" blok.
*
* @param array $attributes Blokattributter.
* @return string HTML-output.
*/
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">'; // Brug en klasse til 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(); // Vigtigt: Nulstil postdata efter brugerdefineret loop
} else {
$output = '<p>' . __( 'Ingen indlæg fundet.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Forklaring af PHP-koden:
my_dynamic_blocks_register_block(): Denne funktion hooker ind iinitfor at registrere vores bloktype. Afgørende er, at den definererrender_callbacksommy_dynamic_blocks_render_recent_postsog også sender blokkens attributter, hvilket afspejler, hvad der er defineret i JavaScript.my_dynamic_blocks_enqueue_editor_scripts(): Denne funktion hooker ind ienqueue_block_editor_assetsfor at indlæse vores JavaScript-fil specifikt til editoren. Den inkludererwp-server-side-rendersom en afhængighed.my_dynamic_blocks_render_recent_posts(): Dette er voresrender_callback. Den modtager$attributesarrayet, renser og konverterer dem til de korrekte typer og bruger derefterWP_Querytil at hente de seneste indlæg. Den konstruerer en HTML<ul>liste og returnerer den.wp_reset_postdata()er afgørende efter et brugerdefineretWP_Queryloop for at forhindre konflikter med WordPress's hovedforespørgsel.
Trin 5: Byg dit JavaScript
Hvis du bruger en moderne JavaScript-build-proces (som @wordpress/scripts), skal du bygge dine assets. Kør npm run build (eller yarn build) i din plugins mappe.
Trin 6: Aktiver og Test
Aktivér dit plugin. Nu, når du tilføjer 'Seneste Indlæg' blokken til et indlæg eller en side, vil du se redigeringsgrænsefladen. Forhåndsvisningsområdet vil vise outputtet, der er gengivet af din PHP-callback. Når du udgiver eller opdaterer indlægget, vil den samme PHP-callback køre på front-end for at vise det dynamiske indhold.
Bedste Praksis og Forbehold
- Sikkerhed Først: Rens og valider altid data, der kommer fra attributter eller eksterne kilder, før du bruger dem i din
render_callback. Brug WordPress-funktioner somesc_html(),esc_url(),sanitize_text_field()osv. wp_reset_postdata(): Hvis dinrender_callbackbrugerWP_Queryeller ændrer det globale$postobjekt, skal du altid kaldewp_reset_postdata()bagefter for at gendanne den oprindelige forespørgsel og postdata.- Ydeevneovervejelser: Selvom dynamiske blokke er kraftfulde, kan overdreven eller kompleks server-side rendering påvirke sideindlæsningstiderne. Optimer dine forespørgsler og renderinglogik. Overvej cachingmekanismer, hvis ydeevnen bliver et problem.
- Editor Forhåndsvisning:
ServerSideRenderkomponenten giver en god forhåndsvisning, men den er afhængig af at foretage en serveranmodning. For meget komplekse blokke er dette muligvis ikke øjeblikkeligt. Sørg for, at dinrender_callbacker effektiv. - Håndtering af Attributter: Attributter er primært til konfiguration af blokken i editoren.
render_callbacker ansvarlig for at hente og vise det faktiske dynamiske indhold. Undgå at gemme store mængder dynamiske data direkte i attributter. - Navngivningskonventioner: Brug unikke præfikser til dine bloknavne (f.eks.
my-plugin-slug/block-name) og PHP-funktionsnavne for at undgå konflikter med andre plugins eller temaer. - Internationalisering: Brug
__()og_n()til oversættelige strenge i både din JavaScript- og PHP-kode.
Ud over Seneste Indlæg: Udvidelse af Dynamiske Blokfunktioner
Eksemplet med "Seneste Indlæg" er kun toppen af isbjerget. Du kan udnytte dynamiske blokke til:
- Visning af brugerdefinerede indlægstyper: Fremvisning af produkter, porteføljeemner eller begivenheder.
- Bruger-specifikt indhold: Visning af indhold, der er relevant for den loggede bruger.
- Interaktive formularer: Selvom komplekse formularer stadig kan have gavn af dedikerede plugins, kan simple dynamiske formularer bygges.
- Datavisualisering: Hentning af data fra et API og rendering af diagrammer eller grafer (selvom dette ofte involverer mere avancerede JavaScript-biblioteker).
- Integration med andre plugins: Dynamisk visning af data, der administreres af andre plugins.
Konklusion
Dynamiske WordPress-blokke er et uundværligt værktøj for udviklere, der ønsker at skabe virkelig interaktive og datadrevne oplevelser inden for Gutenberg-editoren. Ved at forstå, hvordan man registrerer blokke med render_callback funktioner og effektivt administrerer attributter, kan du bygge kraftfulde komponenter, der henter og viser realtidsinformation. Mens statiske blokke tjener deres formål for struktureret indhold, låser dynamiske blokke op for et nyt funktionsniveau, der giver dig mulighed for at bygge bro mellem server-side logik og front-end præsentation. Ved at følge bedste praksis for sikkerhed, ydeevne og kodeorganisation kan du med tillid udvikle robuste og nyttige dynamiske blokke, der forbedrer dine WordPress-websteder.
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