✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Створення власних мета-блоків за допомогою редактора блоків WordPress (Gutenberg)

15

Перше запитання, яке у вас може виникнути, це «навіщо мені створювати користувацькі мета-поля за допомогою редактора блоків (Gutenberg)?», ви все ще можете реалізувати мета-поля за допомогою PHP і додавати елементи керування до блоку, публікації чи навіть спеціальної бічної панелі. у Гутенбергу.

Є кілька причин, чому ви можете це зробити, зокрема:

  • Деякі блоки мають складні параметри, і перегляд мета-поля в режимі редагування може полегшити його використання для клієнта
  • Оскільки ви можете змінити певний аспект макета публікації, наприклад заголовок. Ви можете приховати поле заголовка допису та замінити його власним мета-полем у верхній частині сторінки, а також мати можливість контролювати всі мета допису, які до нього стосуються
  • Тому що ви можете використовувати шаблони блоків, щоб розташувати користувацькі метаблоки, де вам подобається, щоб вони мали більше сенсу в контексті
  • Оскільки ви можете застосувати ці знання до інших аспектів розробки блокового редактора (Gutenberg).

У цьому посібнику ми збираємося розширити те, що ми вже створили в нашому посібнику Post Meta Fields. Ви можете використовувати атрибути блоку, однак через природу метабоксів ми будемо використовувати метаполя публікацій у цьому посібнику.

передумови

Оскільки ми продовжуємо посібник з мета-полів публікації, будемо вже використовувати register_metaдля створення нашого мета-поля публікації, переконавшись, що ми встановили show_in_restзначення true, а також встановили джерело нашого атрибута JavaScript metaі визначили мета-ключ.

Залишається лише реалізувати інтерфейс.

Відредагуйте /src/edit.jsфайл, замінивши @wordpress/componentsімпорт таким:

import { Panel, PanelBody, TextControl } from '@wordpress/components';

Потім замініть блок редагування коду таким:

export default function Edit( { attributes, setAttributes }) {
    const { blockText } = attributes;
    return (<div { ...useBlockProps() }>
            <Panel>
                <PanelBody
                    title={ __( 'Example Meta Box', 'wholesome-plugin') }
                    icon="admin-plugins"
                >
                    <TextControl
                        label={ __( 'Example Meta', 'wholesome-plugin') }
                        help={ __( 'This is an example meta field.', 'wholesome-plugin') }
                        onChange={ (blockText) => setAttributes( { blockText }) }
                          value={ blockText }
                    />
                </PanelBody>
            </Panel>
        </div>
    );
}

Тепер у нас є Panel, a PanelBodyі a TextControl. Зауважте, що я додав параметр admin-pluginsto the icon для того PanelBody, щоб він відповідав піктограмі плагіна.

Застосуйте стилі

Замініть SCSS /src/editor.scssна таке:

.wp-block.wp-block-wholesomecode-wholesome-plugin {
    color: unset;
    background: unset;
    padding: unset;

    p {
        all: unset;
    }
}

Якщо ви використовуєте спеціальний метабокс, створений у Gutenberg, я б рекомендував розмістити його за допомогою шаблону блоку, однак ви можете вставити його звичайним способом:

Використання спеціального мета-бокса Gutenberg

Після того, як ви створили метабокс, немає обмежень на те, що ви можете додати в нього. Вам доступна вся бібліотека компонентів WordPress Gutenberg React, а також величезна бібліотека зовнішніх компонентів React (перегляньте мою статтю про додавання select2 у ваш проект ).

Наступний приклад є вершиною айсберга того, чого ви можете досягти:

Створення власних мета-блоків за допомогою редактора блоків WordPress (Gutenberg)Користувацьке мета-поле з додатковими мета-полями

Щоб створити це, ось код, який вам потрібен:

Зареєструйте мета-поля публікації в PHP

Відкрийте кореневий PHP-файл плагіна (в даному випадку wholesome-plugin.php) і оновіть register_metaдоданий нами в попередньому посібнику наступне:

function wholesomecode_wholesome_plugin_register_post_meta() {
    register_meta(
        'post',
        '_wholesomecode_wholesome_plugin_example_select',
        [
            'auth_callback' => '__return_true',
            'default'       => '',
            'show_in_rest'  => true,
            'single'        => true,
            'type'          => 'string',
        ]
    );

    register_meta(
        'post',
        '_wholesomecode_wholesome_plugin_example_text',
        [
            'auth_callback' => '__return_true',
            'default'       => '',
            'show_in_rest'  => true,
            'single'        => true,
            'type'          => 'string',
        ]
    );

    register_meta(
        'post',
        '_wholesomecode_wholesome_plugin_example_text_2',
        [
            'auth_callback' => '__return_true',
            'default'       => '',
            'show_in_rest'  => true,
            'single'        => true,
            'type'          => 'string',
        ]
    );

    register_meta(
        'post',
        '_wholesomecode_wholesome_plugin_example_text_3',
        [
            'auth_callback' => '__return_true',
            'default'       => '',
            'show_in_rest'  => true,
            'single'        => true,
            'type'          => 'string',
        ]
    );

    register_meta(
        'post',
        '_wholesomecode_wholesome_plugin_example_toggle',
        [
            'auth_callback' => '__return_true',
            'default'       => false,
            'show_in_rest'  => true,
            'single'        => true,
            'type'          => 'boolean',
        ]
    );
}
add_action( 'init', 'wholesomecode_wholesome_plugin_register_post_meta' );

Оновіть атрибути JavaScript

Відкрийте /src/index.jsта замініть атрибути, які ми додали в попередньому посібнику, на такі:

attributes: {
    exampleSelect: {
        meta: '_wholesomecode_wholesome_plugin_example_select',
        source: 'meta',
    },
    exampleText: {
        meta: '_wholesomecode_wholesome_plugin_example_text',
        source: 'meta',
    },
    exampleText2: {
        meta: '_wholesomecode_wholesome_plugin_example_text_2',
        source: 'meta',
    },
    exampleText3: {
        meta: '_wholesomecode_wholesome_plugin_example_text_3',
        source: 'meta',
    },
    exampleToggle: {
        meta: '_wholesomecode_wholesome_plugin_example_toggle',
        source: 'meta',
    },
},

Імпортуйте компоненти

Відредагуйте /src/edit.jsфайл, замінивши @wordpress/componentsімпорт таким:

import {
    Panel,
    PanelBody,
    PanelRow,
    SelectControl,
    TextControl,
    ToggleControl,
} from '@wordpress/components';

Оновіть метод редагування

Продовжуйте редагувати /src/edit.jsфайл, замінивши Editблок коду таким:

export default function Edit( { attributes, setAttributes }) {
    const {
        exampleSelect,
        exampleText,
        exampleText2,
        exampleText3,
        exampleToggle,
    } = attributes;

    return (<div { ...useBlockProps() }>
            <Panel>
                <PanelBody
                    title={ __( 'Example Meta Box', 'wholesome-plugin') }
                    icon="admin-plugins"
                >

                        <SelectControl
                            help={ __( 'An example dropdown field.', 'wholesome-plugin') }
                            label={ __( 'Example Select','wholesome-plugin') }
                            onChange={ (exampleSelect) => setAttributes( { exampleSelect }) }
                            options={ [
                                {
                                    label: __( 'Please Select...', 'wholesome-plugin' ),
                                    value: '',
                                },
                                {
                                    label: __( 'Option 1', 'wholesome-plugin' ),
                                    value: 'option-1',
                                },
                                {
                                    label: __( 'Option 2', 'wholesome-plugin' ),
                                    value: 'option-2',
                                },
                            ] }
                            value={ exampleSelect }
                        />

                        <TextControl
                            help={ __( 'This is an example text field.', 'wholesome-plugin') }
                            label={ __( 'Example Text', 'wholesome-plugin') }
                            onChange={ (exampleText) => setAttributes( { exampleText }) }
                            value={ exampleText }
                        />

                    <PanelRow>
                        <TextControl
                            help={ __( 'Use PanelRow to place controls inline.', 'wholesome-plugin') }
                            label={ __( 'Example Text 2', 'wholesome-plugin') }
                            onChange={ (exampleText2) => setAttributes( { exampleText2 }) }
                            value={ exampleText2 }
                        />
                        <TextControl
                            help={ __( 'This control is inline.', 'wholesome-plugin') }
                            label={ __( 'Example Text 3', 'wholesome-plugin') }
                            onChange={ (exampleText3) => setAttributes( { exampleText3 }) }
                            value={ exampleText3 }
                        />
                    </PanelRow>

                        <ToggleControl
                            checked={ exampleToggle }
                            help={ __( 'An example toggle.', 'wholesome-plugin') }
                            label={ __( 'Example Toggle', 'wholesome-plugin') }
                            onChange={ (exampleToggle) => setAttributes( { exampleToggle }) }
                        />

                </PanelBody>
            </Panel>
        </div>
    );
}

Додайте SCSS

Нарешті відкрийте /src/editor.scssфайл і замініть його вміст наступним:

.wp-block.wp-block-wholesomecode-wholesome-plugin {
    color: unset;
    background: unset;
    padding: unset;

    .components-base-control {
        margin-bottom: 1rem;

        select {
            height: 2rem;
            min-height: 2rem;
        }
    }

    p {
        all: unset;
    }
}

Джерело запису: wholesomecode.ltd

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі