Blogg

Bemästra WordPress dynamiska block: Koppla PHP och JavaScript för interaktivt innehåll

Lär dig hur du skapar dynamiska WordPress-block som utnyttjar både PHP och JavaScript för att leverera interaktiva och datadrivna innehållsupplevelser för dina användare.

Sammanfattning

WordPress dynamiska block erbjuder ett kraftfullt sätt att skapa innehåll som går utöver statisk HTML, vilket möjliggör realtidsdataintegration och interaktiva element. Till skillnad från statiska block renderar dynamiska block sin utdata på serversidan med PHP, vilket gör att de kan hämta och visa uppdaterad information. Den här artikeln ger en praktisk guide för att utveckla dina egna dynamiska block, som täcker de väsentliga koncepten för blockregistrering, server-side rendering callbacks och hantering av klientattribut. Vi går igenom ett steg-för-steg-exempel som visar hur man bygger ett dynamiskt block som visar de senaste inläggen, vilket ger en grund för mer komplexa interaktiva komponenter.

Bemästra WordPress dynamiska block: Koppla PHP och JavaScript för interaktivt innehåll

WordPress är i grunden ett robust innehållshanteringssystem (CMS) byggt på en modulär PHP-arkitektur och en MySQL-databas. Dess utbyggbarhet är en nyckelstyrka, främst uppnådd genom teman och plugins. Framväxten av Gutenberg, blockredigeraren, har revolutionerat innehållsskapandet genom att introducera ett modulärt, JavaScript-drivet gränssnitt. Medan statiska Gutenberg-block är utmärkta för strukturerat, oföränderligt innehåll, kräver många verkliga scenarier innehåll som är dynamiskt, interaktivt och datadrivet. Det är här dynamiska block kommer in, vilket erbjuder en kraftfull koppling mellan server-sidans logik i PHP och klient-sidans interaktivitet i JavaScript.

Förstå kraften i dynamiska block

Statiska block, standard i Gutenberg, genererar HTML på klientsidan när de sparas. Denna HTML lagras sedan direkt i inläggsinnehållet. Även om det är effektivt för statiskt innehåll, har detta tillvägagångssätt begränsningar när det gäller data som ofta ändras eller kräver server-sidobearbetning. Dynamiska block löser däremot detta problem genom att rendera sin utdata på serversidan med PHP. När en användare visar en sida som innehåller ett dynamiskt block kör WordPress en PHP-funktion ( render_callback ) för att generera blockets HTML i farten. Detta gör att blocket kan hämta realtidsdata från databasen, interagera med andra WordPress-funktioner och presentera information som alltid är uppdaterad.

Denna server-side rendering är avgörande av flera skäl:

  • Realtidsdata: Visa de senaste inläggen, kommande evenemang, aktiekurser eller annan data som ofta ändras.
  • Komplex logik: Utföra beräkningar, fråga anpassade inläggstyper eller integrera med externa API:er innan utdata renderas.
  • Säkerhet: Sanera och validera data innan den visas, särskilt när det gäller användargenererat innehåll eller externa källor.
  • Prestanda: Att flytta komplexa renderinguppgifter till servern kan ibland förbättra prestandan på klientsidan.

Anatomien för ett dynamiskt block

Ett dynamiskt block, liksom alla andra Gutenberg-block, definieras av dess metadata och JavaScript-registrering. Dess unika egenskap ligger dock i attributet render_callback som anges under registreringen. Denna callback-funktion ansvarar för att generera blockets HTML-utdata på servern.

Här är en uppdelning av nyckelkomponenterna:

  1. Blockregistrering (JavaScript): Du måste fortfarande registrera ditt block med registerBlockType() i din JavaScript-fil. Detta talar om för Gutenberg att ditt block existerar och hur det ska hantera dess attribut och redigeringsgränssnitt.
  2. Attribut: Detta är datafälten som är associerade med ditt block, lagrade i inläggsinnehållet. För dynamiska block används attribut främst för att konfigurera blockets beteende och inställningar i redigeraren. Det faktiska innehållet som visas genereras av render_callback.
  3. render_callback (PHP): Detta är hjärtat i ett dynamiskt block. Det är en PHP-funktion som tar emot blockets attribut som ett argument och returnerar HTML-strängen som ska renderas på front-end.
  4. Redigeringsgränssnitt (JavaScript): Du kommer fortfarande att bygga blockets gränssnitt inom Gutenberg-redigeraren med React-komponenter. Detta gränssnitt gör det möjligt för användare att konfigurera blockets attribut och se en förhandsgranskning (ofta en förenklad representation) av hur det dynamiska innehållet kommer att se ut.

Steg-för-steg: Skapa ett dynamiskt "Senaste inlägg"-block

Låt oss skapa ett praktiskt exempel: ett dynamiskt block som visar en lista över de senaste inläggen från din WordPress-webbplats.

Förutsättningar:

  • En lokal WordPress-utvecklingsmiljö.
  • Grundläggande förståelse för PHP och JavaScript.
  • Ett plugin eller tema där du kommer att lägga till din blockkod.

Steg 1: Konfigurera ditt Block-plugin/tema

Om du inte har ett anpassat plugin eller tema, skapa ett enkelt. För det här exemplet antar vi att du lägger till detta i ett plugin.

Steg 2: Registrera blocket (JavaScript)

I din plugins JavaScript-fil (t.ex. src/index.js) registrerar du blocket. Vi kommer att använda @wordpress/blocks och @wordpress/i18n för internationalisering.

// src/index.js

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

// Importera din blocks redigeringskomponent
import Edit from './edit';

registerBlockType( 'my-dynamic-blocks/recent-posts', {
    title: __( 'Senaste inlägg', 'my-dynamic-blocks' ),
    icon: 'list-view',
    category: 'widgets',
    attributes: {
        numberOfPosts: {
            type: 'number',
            default: 5,
        },
        showExcerpt: {
            type: 'boolean',
            default: true,
        },
    },
    edit: Edit,
    // save() funktionen behövs INTE för dynamiska block
    // server-side render_callback kommer att hantera utdata
} );

Steg 3: Skapa redigeringskomponenten (JavaScript)

Skapa nu filen src/edit.js. Denna komponent definierar hur blocket ser ut och beter sig inom Gutenberg-redigeraren.

// 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={ __( 'Inläggsinställningar', 'my-dynamic-blocks' ) }>
                    <RangeControl
                        label={ __( 'Antal inlägg', 'my-dynamic-blocks' ) }
                        value={ numberOfPosts }
                        onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
                        min={ 1 }
                        max={ 10 }
                    />
                    <ToggleControl
                        label={ __( 'Visa utdrag', 'my-dynamic-blocks' ) }
                        checked={ showExcerpt }
                        onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
                    />
                </PanelBody>
            </InspectorControls>
            {
                // Använd ServerSideRender för att visa en förhandsgranskning av det dynamiska blocket
                <ServerSideRender
                    block="my-dynamic-blocks/recent-posts"
                    attributes={ attributes }
                />
            }
        </div>
    );
}

Observera att vi inte definierar en save()-funktion. Detta är den avgörande skillnaden för dynamiska block. ServerSideRender-komponenten används för att visa en förhandsgranskning av blockets utdata direkt i redigeraren, genom att göra en begäran till servern.

Steg 4: Ladda skript och registrera server-side rendering (PHP)

I din plugins huvudsakliga PHP-fil (t.ex. my-dynamic-blocks.php) måste du ladda ditt JavaScript-fil och registrera blocktypen, inklusive render_callback.

<?php
/**
 * Plugin Name: My Dynamic Blocks
 * Description: Ett enkelt plugin för dynamiska Gutenberg-block.
 * Version: 1.0
 * Author: Ditt Namn
 */

function my_dynamic_blocks_register_block() {
    // Registrera blocktypen
    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__ ), // Antag att du har en byggprocess
        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 för det dynamiska blocket Senaste inlägg.
 *
 * @param array $attributes Blockattribut.
 * @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">'; // Använd en klass för 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(); // Viktigt: Återställ postdata efter anpassad loop
    } else {
        $output = '<p>' . __( 'Inga inlägg hittades.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

Förklaring av PHP-koden:

  • my_dynamic_blocks_register_block(): Denna funktion kopplar in sig på init för att registrera vår blocktyp. Avgörande är att den definierar render_callback som my_dynamic_blocks_render_recent_posts och skickar även blockets attribut, vilket speglar vad som definieras i JavaScript.
  • my_dynamic_blocks_enqueue_editor_scripts(): Denna funktion kopplar in sig på enqueue_block_editor_assets för att ladda vårt JavaScript-fil specifikt för redigeraren. Den inkluderar wp-server-side-render som en beroende.
  • my_dynamic_blocks_render_recent_posts(): Detta är vår render_callback. Den tar emot $attributes-arrayen, sanerar och konverterar dem till korrekta typer, och använder sedan WP_Query för att hämta de senaste inläggen. Den skapar en HTML <ul>-lista och returnerar den. wp_reset_postdata() är avgörande efter en anpassad WP_Query-loop för att förhindra konflikter med WordPress huvudfråga.

Steg 5: Bygg ditt JavaScript

Om du använder en modern JavaScript-byggprocess (som @wordpress/scripts) måste du bygga dina tillgångar. Kör npm run build (eller yarn build) i din plugins katalog.

Steg 6: Aktivera och testa

Aktivera ditt plugin. Nu, när du lägger till blocket 'Senaste inlägg' till ett inlägg eller en sida, kommer du att se redigeringsgränssnittet. Förhandsgranskningsområdet visar utdata som renderats av din PHP-callback. När du publicerar eller uppdaterar inlägget körs samma PHP-callback på front-end för att visa det dynamiska innehållet.

Bästa praxis och förbehåll

  • Säkerhet först: Sanera och validera alltid data som kommer från attribut eller externa källor innan du använder den i din render_callback. Använd WordPress-funktioner som esc_html(), esc_url(), sanitize_text_field(), etc.
  • wp_reset_postdata(): Om din render_callback använder WP_Query eller modifierar det globala $post-objektet, anropa alltid wp_reset_postdata() efteråt för att återställa den ursprungliga frågan och postdatan.
  • Prestandaöverväganden: Även om dynamiska block är kraftfulla, kan överdriven eller komplex server-side rendering påverka sidans laddningstider. Optimera dina frågor och renderinglogik. Överväg cachemekanismer om prestanda blir ett problem.
  • Redigeringsförhandsgranskning: ServerSideRender-komponenten ger en bra förhandsgranskning, men den förlitar sig på att göra en serverbegäran. För mycket komplexa block kanske detta inte är omedelbart. Se till att din render_callback är effektiv.
  • Attributhantering: Attribut är främst för att konfigurera blocket i redigeraren. render_callback ansvarar för att hämta och visa det faktiska dynamiska innehållet. Undvik att lagra stora mängder dynamisk data direkt i attribut.
  • Namngivningskonventioner: Använd unika prefix för dina blocknamn (t.ex. mitt-plugin-slug/block-namn) och PHP-funktionsnamn för att undvika konflikter med andra plugins eller teman.
  • Internationalisering: Använd __() och _n() för översättningsbara strängar i både din JavaScript- och PHP-kod.

Bortom senaste inlägg: Utöka dynamiska blockfunktioner

Exemplet "Senaste inlägg" är bara toppen av isberget. Du kan använda dynamiska block för:

  • Visa anpassade inläggstyper: Visa produkter, portfolioposter eller evenemang.
  • Användarspecifikt innehåll: Visa innehåll som är relevant för den inloggade användaren.
  • Interaktiva formulär: Även om komplexa formulär kan dra nytta av dedikerade plugins, kan enkla dynamiska formulär byggas.
  • Datavisualisering: Hämta data från ett API och rendera diagram eller grafer (även om detta ofta involverar mer avancerade JavaScript-bibliotek).
  • Integration med andra plugins: Dynamiskt visa data som hanteras av andra plugins.

Slutsats

Dynamiska WordPress-block är ett oumbärligt verktyg för utvecklare som vill skapa verkligt interaktiva och datadrivna upplevelser inom Gutenberg-redigeraren. Genom att förstå hur man registrerar block med render_callback-funktioner och hanterar attribut effektivt kan du bygga kraftfulla komponenter som hämtar och visar realtidsinformation. Medan statiska block tjänar sitt syfte för strukturerat innehåll, låser dynamiska block upp en ny nivå av funktionalitet, vilket gör att du kan överbrygga klyftan mellan server-sidans logik och front-end-presentation. Genom att följa bästa praxis för säkerhet, prestanda och kodorganisation kan du med säkerhet utveckla robusta och användbara dynamiska block som förbättrar dina WordPress-webbplatser.

Sources (5)