Блог

Овладяване на динамични блокове в WordPress: Свързване на PHP и JavaScript за интерактивно съдържание

Научете как да създавате динамични блокове в WordPress, които използват както PHP, така и JavaScript, за да предоставят интерактивни и базирани на данни изживявания за вашите потребители.

Резюме

Динамичните блокове в WordPress предлагат мощен начин за създаване на съдържание, което надхвърля статичния HTML, позволявайки интеграция на данни в реално време и интерактивни елементи. За разлика от статичните блокове, динамичните блокове рендират своя изход от страна на сървъра, използвайки PHP, което им позволява да извличат и показват актуална информация. Тази статия предоставя практическо ръководство за разработване на собствени динамични блокове, покривайки основните концепции за регистрация на блокове, обратни извиквания за рендиране от страна на сървъра и обработка на атрибути от страна на клиента. Ще преминем през пример стъпка по стъпка, демонстрирайки как да изградим динамичен блок, който показва последните публикации, предлагайки основа за по-сложни интерактивни компоненти.

Овладяване на динамични блокове в WordPress: Свързване на PHP и JavaScript за интерактивно съдържание

WordPress, в основата си, е стабилна система за управление на съдържанието (CMS), изградена върху модулна PHP архитектура и MySQL база данни. Неговата разширяемост е ключова сила, постигана предимно чрез теми и плъгини. Появата на Gutenberg, редакторът на блокове, революционизира създаването на съдържание, като въвежда модулен интерфейс, управляван от JavaScript. Докато статичните блокове на Gutenberg са отлични за структурирано, непроменящо се съдържание, много сценарии от реалния живот изискват съдържание, което е динамично, интерактивно и базирано на данни. Тук идват динамичните блокове, предлагащи мощен мост между логиката от страна на сървъра на PHP и интерактивността от страна на клиента на JavaScript.

Разбиране на силата на динамичните блокове

Статичните блокове, които са стандартни в Gutenberg, генерират HTML от страна на клиента при запазване. Този HTML след това се съхранява директно в съдържанието на публикацията. Въпреки че е ефективен за статично съдържание, този подход има ограничения, когато се занимава с данни, които се променят често или изискват обработка от страна на сървъра. Динамичните блокове, от друга страна, решават този проблем, като рендират своя изход от страна на сървъра, използвайки PHP. Когато потребител види страница, съдържаща динамичен блок, WordPress изпълнява PHP функция (обратното извикване render_callback), за да генерира HTML на блока в движение. Това позволява на блока да извлича данни в реално време от базата данни, да взаимодейства с други функционалности на WordPress и да представя информация, която винаги е актуална.

Това рендиране от страна на сървъра е от решаващо значение по няколко причини:

  • Данни в реално време: Показване на най-новите публикации, предстоящи събития, цени на акции или други данни, които се променят често.
  • Сложна логика: Извършване на изчисления, заявки към персонализирани типове публикации или интеграция с външни API преди рендиране на изхода.
  • Сигурност: Санитизиране и валидиране на данни преди показването им, особено когато се работи с потребителско съдържание или външни източници.
  • Производителност: Прехвърлянето на сложни задачи за рендиране към сървъра понякога може да подобри производителността от страна на клиента.

Анатомия на динамичен блок

Динамичният блок, както всеки друг блок на Gutenberg, се дефинира от своите метаданни и JavaScript регистрация. Неговата уникална характеристика обаче се крие в атрибута render_callback, посочен по време на регистрацията. Тази callback функция е отговорна за генерирането на HTML изхода на блока от страна на сървъра.

Ето разбивка на ключовите компоненти:

  1. Регистрация на блок (JavaScript): Все още трябва да регистрирате вашия блок, използвайки registerBlockType() във вашия JavaScript файл. Това казва на Gutenberg, че вашият блок съществува и как да обработва неговите атрибути и интерфейс на редактора.
  2. Атрибути: Това са полетата с данни, свързани с вашия блок, съхранявани в съдържанието на публикацията. За динамични блокове атрибутите се използват предимно за конфигуриране на поведението и настройките на блока в редактора. Действителното показвано съдържание се генерира от render_callback.
  3. render_callback (PHP): Това е сърцето на динамичния блок. Това е PHP функция, която получава атрибутите на блока като аргумент и връща HTML низа, който ще бъде рендиран на фронтенда.
  4. Интерфейс на редактора (JavaScript): Все още ще изграждате интерфейса на блока в редактора на Gutenberg, използвайки React компоненти. Този интерфейс позволява на потребителите да конфигурират атрибутите на блока и да видят визуализация (често опростено представяне) на това как ще изглежда динамичното съдържание.

Стъпка по стъпка: Създаване на динамичен блок "Последни публикации"

Нека създадем практичен пример: динамичен блок, който показва списък с най-новите публикации от вашия WordPress сайт.

Предварителни изисквания:

  • Локална среда за разработка на WordPress.
  • Основни познания по PHP и JavaScript.
  • Плъгин или тема, където ще добавите кода на вашия блок.

Стъпка 1: Настройте вашия плъгин/тема за блокове

Ако нямате персонализиран плъгин или тема, създайте прост такъв. За този пример ще приемем, че добавяте това към плъгин.

Стъпка 2: Регистрирайте блока (JavaScript)

В JavaScript файла на вашия плъгин (напр. src/index.js), ще регистрирате блока. Ще използваме @wordpress/blocks и @wordpress/i18n за интернационализация.

// src/index.js

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

// Импортирайте компонента за редактиране на вашия блок
import Edit from './edit';

registerBlockType( 'my-dynamic-blocks/recent-posts', {
    title: __( 'Последни публикации', 'my-dynamic-blocks' ),
    icon: 'list-view',
    category: 'widgets',
    attributes: {
        numberOfPosts: {
            type: 'number',
            default: 5,
        },
        showExcerpt: {
            type: 'boolean',
            default: true,
        },
    },
    edit: Edit,
    // save() функцията НЕ е необходима за динамични блокове
    // render_callback от страна на сървъра ще се погрижи за изхода
} );

Стъпка 3: Създайте компонента за редактор (JavaScript)

Сега създайте файла src/edit.js. Този компонент ще дефинира как блокът изглежда и се държи в редактора на Gutenberg.

// 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={ __( 'Настройки на публикацията', 'my-dynamic-blocks' ) }>
                    <RangeControl
                        label={ __( 'Брой публикации', 'my-dynamic-blocks' ) }
                        value={ numberOfPosts }
                        onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
                        min={ 1 }
                        max={ 10 }
                    />
                    <ToggleControl
                        label={ __( 'Показване на резюме', 'my-dynamic-blocks' ) }
                        checked={ showExcerpt }
                        onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
                    />
                </PanelBody>
            </InspectorControls>
            {
                // Използвайте ServerSideRender, за да покажете визуализация на динамичния блок
                <ServerSideRender
                    block="my-dynamic-blocks/recent-posts"
                    attributes={ attributes }
                />
            }
        </div>
    );
}

Забележете, че не дефинираме save() функция. Това е ключовата разлика за динамичните блокове. Компонентът ServerSideRender се използва за показване на визуализация на изхода на блока директно в редактора, като прави заявка към сървъра.

Стъпка 4: Включете скриптове и регистрирайте рендиране от страна на сървъра (PHP)

В основния PHP файл на вашия плъгин (напр. my-dynamic-blocks.php), трябва да включите вашия JavaScript файл и да регистрирате типа блок, включително render_callback.

<?php
/**
 * Име на плъгин: My Dynamic Blocks
 * Описание: Прост плъгин за динамични блокове на Gutenberg.
 * Версия: 1.0
 * Автор: Вашето Име
 */

function my_dynamic_blocks_register_block() {
    // Регистриране на типа блок
    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__ ), // Предполагаме, че имате процес на изграждане
        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' );

/**
 * Callback за рендиране на динамичния блок "Последни публикации".
 *
 * @param array $attributes Атрибути на блока.
 * @return string HTML изход.
 */
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">'; // Използвайте клас за стилизиране
        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(); // Важно: Нулирайте данните за публикациите след персонализиран цикъл
    } else {
        $output = '<p>' . __( 'Няма намерени публикации.', 'my-dynamic-blocks' ) . '</p>';
    }

    return $output;
}

Обяснение на PHP кода:

  • my_dynamic_blocks_register_block(): Тази функция се закача за init, за да регистрира нашия тип блок. Ключово, тя дефинира render_callback като my_dynamic_blocks_render_recent_posts и също така предава атрибутите на блока, отразявайки това, което е дефинирано в JavaScript.
  • my_dynamic_blocks_enqueue_editor_scripts(): Тази функция се закача за enqueue_block_editor_assets, за да зареди нашия JavaScript файл специално за редактора. Тя включва wp-server-side-render като зависимост.
  • my_dynamic_blocks_render_recent_posts(): Това е нашият render_callback. Той получава масива $attributes, санитизира и каства ги към правилните типове, след което използва WP_Query, за да извлече последните публикации. Той конструира HTML <ul> списък и го връща. wp_reset_postdata() е жизненоважно след персонализиран цикъл WP_Query, за да се предотвратят конфликти с основната заявка на WordPress.

Стъпка 5: Изградете вашия JavaScript

Ако използвате модерен процес на изграждане на JavaScript (като @wordpress/scripts), ще трябва да изградите вашите активи. Изпълнете npm run build (или yarn build) в директорията на вашия плъгин.

Стъпка 6: Активирайте и тествайте

Активирайте вашия плъгин. Сега, когато добавите блока "Последни публикации" към публикация или страница, ще видите интерфейса на редактора. Областта за визуализация ще покаже изхода, рендиран от вашата PHP callback. Когато публикувате или актуализирате публикацията, същата PHP callback ще се изпълни на фронтенда, за да покаже динамичното съдържание.

Най-добри практики и уговорки

  • Сигурност на първо място: Винаги санитизирайте и валидирайте всички данни, които идват от атрибути или външни източници, преди да ги използвате във вашия render_callback. Използвайте WordPress функции като esc_html(), esc_url(), sanitize_text_field() и т.н.
  • wp_reset_postdata(): Ако вашият render_callback използва WP_Query или модифицира глобалния обект $post, винаги извиквайте wp_reset_postdata() след това, за да възстановите оригиналната заявка и данните за публикацията.
  • Съображения за производителността: Въпреки че динамичните блокове са мощни, прекомерното или сложно рендиране от страна на сървъра може да повлияе на времето за зареждане на страницата. Оптимизирайте вашите заявки и логика за рендиране. Обмислете механизми за кеширане, ако производителността стане проблем.
  • Визуализация в редактора: Компонентът ServerSideRender предоставя добра визуализация, но разчита на правене на заявка към сървъра. За много сложни блокове това може да не е мигновено. Уверете се, че вашият render_callback е ефективен.
  • Обработка на атрибути: Атрибутите са основно за конфигуриране на блока в редактора. render_callback е отговорен за извличането и показването на действителното динамично съдържание. Избягвайте съхраняването на големи количества динамични данни директно в атрибути.
  • Конвенции за именуване: Използвайте уникални префикси за имената на вашите блокове (напр. my-plugin-slug/block-name) и PHP имена на функции, за да избегнете конфликти с други плъгини или теми.
  • Интернационализация: Използвайте __() и _n() за преводими низове както във вашия JavaScript, така и в PHP код.

Отвъд последните публикации: Разширяване на възможностите на динамичните блокове

Примерът "Последни публикации" е само върхът на айсберга. Можете да използвате динамични блокове за:

  • Показване на персонализирани типове публикации: Представяне на продукти, портфолио елементи или събития.
  • Съдържание, специфично за потребителя: Показване на съдържание, което е релевантно за влезлия потребител.
  • Интерактивни формуляри: Въпреки че сложните формуляри може все още да се възползват от специализирани плъгини, могат да бъдат изградени прости динамични формуляри.
  • Визуализация на данни: Извличане на данни от API и рендиране на графики или диаграми (въпреки че това често включва по-напреднали JavaScript библиотеки).
  • Интеграция с други плъгини: Динамично показване на данни, управлявани от други плъгини.

Заключение

Динамичните блокове в WordPress са незаменим инструмент за разработчици, които искат да създават наистина интерактивни и базирани на данни изживявания в редактора на Gutenberg. Разбирайки как да регистрирате блокове с функции render_callback и ефективно да управлявате атрибути, можете да изграждате мощни компоненти, които извличат и показват информация в реално време. Докато статичните блокове служат на своята цел за структурирано съдържание, динамичните блокове отключват ново ниво на функционалност, позволявайки ви да преодолеете пропастта между сървърната логика и представянето на фронтенда. Като следвате най-добрите практики за сигурност, производителност и организация на кода, можете уверено да разработвате стабилни и полезни динамични блокове, които подобряват вашите WordPress уебсайтове.

Sources (5)