# Создание компонента списка задач для редактора блоков WordPress — часть 1

- Canonical: https://asgru.com/ru/sozdanie-komponenta-spiska-zadach-dlya-redaktora-blokov-wordpress-chast-1/
- Language: ru
- Author: asgru
- Published: 2024-08-19T07:56:15+02:00
- Updated: 2024-08-19T06:20:30+02:00

С помощью этой серии практических материалов я хочу показать вам, насколько далеко продвинулось развитие WordPress. В 2024 году разработчик WordPress в первую очередь является frontend-разработчиком, который должен хорошо разбираться в HTML/CSS, React, особенностях WordPress, а также PHP, чтобы самостоятельно писать backend для создаваемых блоков. Признайтесь, вы думали, что это просто работа с кнопками в Elementor, не так ли? 🙂

Редактор блоков WordPress (Gutenberg) значительно преобразил процесс создания и редактирования контента на сайтах WordPress, предоставив разработчикам мощные инструменты для создания настраиваемых и функциональных блоков. В этом руководстве мы создадим свой собственный компонент «Список задач», который позволит пользователям создавать списки задач и отправлять данные на сервер при изменении статуса задач.

Основные элементы блока

Создаваемый нами блок будет состоять из нескольких ключевых элементов:

- RichText: Компонент, позволяющий пользователям вводить и редактировать текст внутри блока.

- InspectorControls: Панель, предоставляющая настройки и элементы управления для блока в редакторе.

- CheckboxControl: Элемент управления, используемый для пометки задач как выполненных.

- useState: Хук, управляющий состоянием задач внутри блока.

- fetch API: Используется для отправки данных задач на сервер.

Каждый блок создается как отдельный плагин, который можно повторно использовать в других проектах на WordPress. Это позволяет легко интегрировать созданный блок в любые другие сайты на WordPress.

Настройка окружения для разработки

Прежде чем приступить к созданию компонента, важно убедиться, что ваше окружение для разработки настроено правильно. Вам понадобятся следующие инструменты для разработки блока:

- WordPress: Убедитесь, что ваша версия WordPress — 5.0 или выше, так как редактор блоков был введен в этой версии.

- Node.js и npm: Необходимы для работы с JavaScript и управления зависимостями.

- WP-CLI (опционально): Инструмент командной строки для работы с WordPress, который может упростить разработку.

Установка Node.js и npm

Если Node.js и npm еще не установлены на вашем компьютере, загрузите и установите их с официального сайта Node.js.

После установки выполните следующие команды, чтобы убедиться, что все установлено правильно:

node -v
npm -v

Если команды возвращают версии, значит, все работает правильно.

Создание блока «Список задач»

Чтобы ускорить процесс создания блока, вы можете использовать команду, которая автоматически сгенерирует всю структуру проекта, включая конфигурации и файлы.

Шаг 1: Создание блока через команду

Откройте терминал и выполните следующую команду, чтобы автоматически создать блок «Список задач»:

npx @wordpress/create-block@latest todo-list

Эта команда выполнит следующие шаги:

- Инициализация проекта: Команда создаст новую директорию с именем todo-list, содержащую все необходимые файлы и структуру для блока.

- Установка зависимостей: Все необходимые пакеты, такие как @wordpress/scripts, будут установлены автоматически.

- Создание файловой структуры: Структура будет включать папки src и build, а также файл index.js с базовым кодом для блока.

- Настройка block.json: Этот файл будет создан с базовой конфигурацией, определяющей блок «Список задач».

Файловая структура и описание

После выполнения команды будет создана следующая структура проекта:

todo-list/
│
├── src/
│ └── index.js
│
├── build/
│
├── block.json
├── package.json
└── README.md

- src/index.js

Файл index.js в папке src содержит весь исходный код вашего блока. Здесь реализована логика блока, включая его внешний вид и взаимодействие с пользователем. Основные части кода включают регистрацию блока с помощью функции registerBlockType, настройку атрибутов и определение функций для редактирования и сохранения блока.

Пример содержимого index.js:

import { registerBlockType } from '@wordpress/blocks';
import { useState } from '@wordpress/element';
import { RichText, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, CheckboxControl } from '@wordpress/components';

registerBlockType('todo-plugin/todo-list', {
 title: 'Список задач',
 icon: 'list-view',
 category: 'widgets',
 attributes: {
 tasks: {
 type: 'array',
 default: [],
 },
 },
 edit({ attributes, setAttributes }) {
 const { tasks } = attributes;
 const [taskText, setTaskText] = useState('');

 const addTask = () => {
 if (taskText) {
 const newTasks = [...tasks, { text: taskText, done: false }];
 setAttributes({ tasks: newTasks });
 setTaskText('');
 sendTasksToServer(newTasks);
 }
 };

 const toggleTaskDone = (index) => {
 const newTasks = tasks.map((task, i) =>
 i === index ? { ...task, done: !task.done } : task
 );
 setAttributes({ tasks: newTasks });
 sendTasksToServer(newTasks);
 };

 const sendTasksToServer = (tasks) => {
 fetch('/wp-json/todo/v1/update', {
 method: 'POST',
 headers: {
 'Content-Type': 'application/json',
 },
 body: JSON.stringify({ tasks }),
 });
 };

 return (
 <div>
 <InspectorControls>
 <PanelBody title="Задачи">
 {tasks.map((task, index) => (
 <CheckboxControl
 key={index}
 label={task.text}
 checked={task.done}
 onChange={() => toggleTaskDone(index)}
 />
 ))}
 </PanelBody>
 </InspectorControls>
 <div>
 <RichText
 tagName="p"
 value={taskText}
 onChange={(text) => setTaskText(text)}
 placeholder="Введите новую задачу"
 />
 <button onClick={addTask}>Добавить задачу</button>
 </div>
 <ul>
 {tasks.map((task, index) => (
 <li key={index}>
 <CheckboxControl
 label={task.text}
 checked={task.done}
 onChange={() => toggleTaskDone(index)}
 />
 </li>
 ))}
 </ul>
 </div>
 );
 },
 save({ attributes }) {
 const { tasks } = attributes;

 return (
 <ul>
 {tasks.map((task, index) => (
 <li key={index}>
 <RichText.Content
 tagName="span"
 value={task.text}
 style={{ textDecoration: task.done ? 'line-through' : 'none' }}
 />
 </li>
 ))}
 </ul>
 );
 },
});

- build

Папка build предназначена для хранения скомпилированных файлов. После сборки проекта с помощью команды npm run build готовый к использованию файл index.js будет размещен в этой папке и использоваться WordPress для отображения и работы блока.

- block.json

Файл block.json содержит метаданные для вашего блока. В нем определяются имя блока, категория, иконка, необходимые для его работы скрипты и стили. Этот файл необходим для регистрации блока в WordPress.

Пример содержимого block.json:

{
"apiVersion": 2,
"name": "todo-plugin/todo-list",
"title": "Список задач",
"category": "widgets",
"icon": "list-view",
"description": "Настраиваемый блок списка задач.",
"keywords": [ "todo", "tasks", "list" ],
"version": "1.0.0",
"textdomain": "todo-list",
"editorScript": "file:./build/index.js"
}

- package.json

Файл package.json содержит информацию о проекте и его зависимостях. Он управляет установкой и использованием пакетов, необходимых для разработки и сборки блока. Этот файл создается автоматически при инициализации проекта и обновляется по мере добавления новых зависимостей.

Пример содержимого package.json:

{
"name": "todo-list",
"version": "1.0.0",
"description": "Пользовательский блок для списка задач",
"scripts": {
"build": "wp-scripts build",
"start": "wp-scripts start"
},
"devDependencies": {
"@wordpress/scripts": "^24.0.0"
}
}

- README.md

Файл README.md содержит описание проекта, инструкции по установке и использованию, а также другую важную информацию, которая может понадобиться разработчикам или пользователям. Этот файл полезен для документирования проекта.

Сборка проекта

После внесения изменений в код, выполните сборку проекта, чтобы получить готовый к использованию файл для WordPress:

npm run build

Команда build скомпилирует ваш код и разместит его в папке build.

Регистрация блока в WordPress

Теперь, когда блок готов, его нужно зарегистрировать в WordPress. Для этого добавьте следующий код в файл вашего плагина или темы:

function todo_plugin_register_block() {
 wp_register_script(
 'todo-list-editor-script',
 plugins_url( 'build/index.js', __FILE__ ),
 array( 'wp-blocks', 'wp-element', 'wp-editor' ),
 filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
 );

 register_block_type( 'todo-plugin/todo-list', array(
 'editor_script' => 'todo-list-editor-script',
 ) );
}
add_action( 'init', 'todo_plugin_register_block' );

Этот код зарегистрирует ваш блок в WordPress и добавит скомпилированный JavaScript-файл.

Заключение

Использование команды npx @wordpress/create-block@latest значительно ускоряет процесс создания нового блока для редактора блоков WordPress. В этом руководстве мы рассмотрели, как создать блок «Список задач», который позволяет пользователям создавать списки задач и управлять их выполнением, с отправкой данных на сервер. Этот компонент можно расширить, добавляя новые функции и улучшая взаимодействие с пользователем, что открывает широкие возможности для кастомизации вашего сайта на WordPress.
