Как создать тему WordPress с помощью React: полное руководство

Создание тем для WordPress с использованием React открывает новые горизонты для разработчиков, позволяя сочетать мощь и гибкость популярной CMS с современными подходами к построению пользовательских интерфейсов. Этот подход позволяет создавать быстрые, интерактивные и масштабируемые веб-сайты, сохраняя при этом удобство управления контентом через WordPress.

Преимущества использования React для разработки тем WordPress

Интеграция React в разработку тем WordPress предоставляет ряд существенных преимуществ:

Современный UI/UX: React позволяет создавать динамичные и отзывчивые пользовательские интерфейсы, значительно улучшая впечатления посетителей сайта. Плавные переходы, мгновенная обратная связь и интерактивные элементы становятся стандартом.

Компонентный подход: Разработка на основе компонентов способствует переиспользованию кода, упрощает поддержку и тестирование. Каждый элемент интерфейса (шапка, подвал, карточка поста) может быть изолированным компонентом.

Разделение ответственности: Четкое разделение между бэкендом (WordPress) и фронтендом (React) упрощает командную работу и позволяет специалистам фокусироваться на своих областях.

Производительность: Виртуальный DOM и эффективный рендеринг React способствуют высокой производительности фронтенда. С правильной настройкой можно добиться впечатляющей скорости загрузки и отклика.

Богатая экосистема: React имеет огромное сообщество и множество готовых библиотек и инструментов, которые ускоряют разработку и расширяют возможности.

Single Page Application (SPA) или гибридный подход: Возможность создавать темы как SPA, где WordPress выступает в роли Headless CMS, или интегрировать React-компоненты в традиционные PHP-шаблоны.

Необходимые инструменты и предварительные требования

Для начала разработки вам понадобятся:

Node.js и npm/yarn: Среда выполнения JavaScript и менеджер пакетов для установки зависимостей React и инструментов сборки.

create-react-app (CRA) или аналоги: Инструмент для быстрого создания и настройки React-приложения. Vite является популярной современной альтернативой.

Знания: Уверенное владение JavaScript (ES6+), React (компоненты, хуки, JSX), базовое понимание WordPress (структура тем, хуки, REST API).

Локальный сервер: XAMPP, MAMP, Local by Flywheel или Docker для запуска WordPress локально.

Редактор кода: VS Code, WebStorm или другой с поддержкой JavaScript/TypeScript и JSX.

Обзор структуры темы WordPress и как React в нее вписывается

Классическая тема WordPress состоит из PHP-файлов шаблонов (index.php, single.php, page.php и т.д.), файла стилей style.css с метаданными темы и файла functions.php для добавления функциональности.

При интеграции React возможны два основных подхода:

Гибридный подход: React-компоненты встраиваются в существующие PHP-шаблоны. WordPress по-прежнему отвечает за роутинг и генерацию основной структуры страницы, а React оживляет отдельные ее части.

Headless (или decoupled) подход: WordPress используется исключительно как бэкенд (Headless CMS) для управления контентом, предоставляя данные через REST API или GraphQL. React-приложение полностью отвечает за отображение и роутинг на фронтенде. Оно может быть развернуто отдельно или интегрировано в минимальную WordPress-тему, которая служит лишь точкой входа для React-приложения.

В данном руководстве мы сосредоточимся на подходе, где React-приложение формирует основную часть фронтенда, а WordPress-тема служит для его инициализации и передачи начальных данных. Файлы React-приложения обычно размещаются в отдельной директории внутри темы, а скомпилированные ассеты (JS, CSS) подключаются через functions.php.

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

Создание нового React-приложения с помощью `create-react-app`

Предположим, ваша тема WordPress будет называться my-react-theme. Создадим для нее React-приложение. Перейдите в директорию wp-content/themes/ вашего локального сайта WordPress и выполните команду:

Реклама
npx create-react-app my-react-theme/react-app --template typescript

Эта команда создаст папку react-app внутри будущей темы my-react-theme и развернет в ней React-проект с поддержкой TypeScript. Структура react-app будет стандартной для CRA:

public/: Содержит index.html (который мы не будем использовать напрямую в WordPress) и другие статические ассеты.

src/: Основная папка с исходным кодом React-компонентов, сервисов и стилей.

package.json: Файл с зависимостями и скриптами проекта.

Настройка WordPress для разработки темы (локальный сервер, тема-заглушка)

Установите WordPress на локальный сервер, если еще не сделали этого.

В директории wp-content/themes/my-react-theme/ (рядом с созданной react-app/) создайте следующие минимальные файлы для WordPress темы:

style.css:

/*
Theme Name: My React Theme
Theme URI: https://example.com/my-react-theme
Author: Your Name
Author URI: https://example.com/
Description: A WordPress theme built with React and TypeScript.
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: react, typescript, modern, spa, custom-theme
Text Domain: my-react-theme
Requires at least: 5.8
Requires PHP: 7.4
*/

index.php:



    

Загрузка React-приложения...

<?php get_footer(); // Важно для wp_footer()

functions.php (пока пустой или с базовым кодом, который мы дополним позже):

<?php
/**
 * My React Theme functions and definitions.
 *
 * @package My_React_Theme
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

// Код подключения скриптов и стилей будет здесь

Активируйте тему My React Theme в админ-панели WordPress (Внешний вид -> Темы).

Интеграция React-приложения в структуру темы WordPress

Теперь необходимо настроить WordPress для загрузки скомпилированного React-приложения.

Сборка React-приложения: Перейдите в wp-content/themes/my-react-theme/react-app/ и выполните команду:

npm run build
# или yarn build

Эта команда создаст папку build внутри react-app/ со статическими файлами вашего React-приложения.

Подключение скриптов и стилей в functions.php: Откройте wp-content/themes/my-react-theme/functions.php и добавьте следующий код для подключения JS и CSS бандлов из папки build:

get( 'Version' );
    $react_app_build_path = get_template_directory() . '/react-app/build/';
    $react_app_build_url = get_template_directory_uri() . '/react-app/build/';

    // Пытаемся прочитать asset-manifest.json для получения актуальных имен файлов
    $asset_manifest_path = $react_app_build_path . 'asset-manifest.json';

    if ( file_exists( $asset_manifest_path ) ) {
        $asset_manifest_json = file_get_contents( $asset_manifest_path );
        $asset_manifest      = json_decode( $asset_manifest_json, true );

        if ( isset( $asset_manifest['files']['main.js'] ) ) {
            wp_enqueue_script(
                'my-react-app-main-js',
                $react_app_build_url . $asset_manifest['files']['main.js'],
                [], // Зависимости, например ['wp-api-fetch']
                $theme_version,
                true // В футере
            );
        }

        if ( isset( $asset_manifest['files']['main.css'] ) ) {
            wp_enqueue_style(
                'my-react-app-main-css',
                $react_app_build_url . $asset_manifest['files']['main.css'],
                [],
                $theme_version
            );
        }
    } else {
        // Фоллбэк, если asset-manifest.json не найден (менее надежно)
        // Пути могут отличаться в зависимости от конфигурации CRA
        wp_enqueue_script(
            'my-react-app-main-js',
            $react_app_build_url . 'static/js/main.js', // Примерный путь
            [],
            $theme_version,
            true
        );
        wp_enqueue_style(
            'my-react-app-main-css',
            $react_app_build_url . 'static/css/main.css', // Примерный путь
            [],
            $theme_version
        );
    }
    
    // Передача данных из WordPress в React через wp_localize_script
    $post_data = null;
    if (is_singular() && get_the_ID()) {
        $current_post = get_post(get_the_ID());
        if ($current_post) {
             $post_data = [
                'id'      => $current_post->ID,
                'title'   => get_the_title($current_post),
                'content' => apply_filters('the_content', $current_post->post_content),
                'slug'    => $current_post->post_name,
                'type'    => get_post_type($current_post),
                // Добавьте другие необходимые поля, например, ACF
            ];
        }
    }

    wp_localize_script( 'my-react-app-main-js', 'wpData', [
        'rootUrl'     => esc_url_raw( home_url() ),
        'restUrl'     => esc_url_raw( rest_url() ),
        'nonce'       => wp_create_nonce( 'wp_rest' ),
        'siteName'    => get_bloginfo( 'name' ),
        'tagline'     => get_bloginfo( 'description' ),
        'themeDirUrl' => get_template_directory_uri(),
        'currentPost' => $post_data, // Данные текущей страницы/поста
        'isFrontPage' => is_front_page(),
        'isSingle'    => is_singular(),
    ]);
}
add_action( 'wp_enqueue_scripts', 'my_react_theme_enqueue_scripts' );

/**
 * Базовая настройка темы.
 */
function my_react_theme_setup(): void {
    add_theme_support( 'title-tag' );
    add_theme_support( 'post-thumbnails' );
    // register_nav_menus( [ 'primary' => __( 'Primary Menu', 'my-react-theme' ) ] );
}
add_action( 'after_setup_theme', 'my_react_theme_setup' );

Теперь, при открытии вашего сайта, WordPress должен загрузить index.php, который содержит `<div id=


Добавить комментарий