ОБНОВЛЕНИЕ 16.06.2017:
Я обновил проект, чтобы использовать ReactRouter 4 и Webpack 2. Некоторые части были переработаны и упрощены. Включены ссылки на демонстрацию фронтенда React и бэкенда Wordpress.

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

Но в конце туннеля есть свет! Начиная с версии 4.7 WordPress поставляется со встроенным REST API, и плагины больше не требуются. Это упрощает использование WordPress строго в качестве внутреннего хранилища данных или CMS, позволяя при этом создавать полностью настраиваемое клиентское решение по вашему выбору.

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

В этой статье я собираюсь использовать ReactJS для создания клиентской части приложения, React Router для маршрутизации и Webpack для объединения всего этого вместе. Я также покажу вам, как интегрировать расширенные настраиваемые поля, для тех из нас, кто полагается на него как на инструмент для создания интуитивно понятного решения для наших клиентов.

Стек выглядит так:
- ReactJs
- React Router v4
- Alt (для реализации Flux)
- Webpack v2

Репозиторий GitHub: https://github.com/DreySkee/wp-api-react
URL демонстрации веб-интерфейса React: http: // wp- api-react.surge.sh/
URL демонстрации серверной части Wordpress: http://andreypokrovskiy.com/projects/wp-api-react/wp-admin
Пользователь: демонстрация
Пройти: wp-react-demo

Настройка проекта

Назовем проект wp-api-react. Чтобы продолжить, первое, что вам нужно сделать, это включить это в свой package.json и запустить npm install:

Установите также webpack и webpack-dev-server глобально, если вы этого еще не сделали:

npm i webpack webpack-dev-server -g

Теперь в папке проекта создайте wepack.dev.js для конфигурации разработки и webpack.production.js с конфигурацией для сборки проекта для производства.

Вставьте это в webpack.dev.config.js:

А это в webpack.production.config.js:

Создайте папку «src» в корне проекта и создайте в ней index.html. Файл index.html будет включать этот фрагмент кода:

Теперь давайте добавим в проект еще несколько папок. Внутри папки «src» создайте папку «scripts», а внутри «scripts» создайте «components», «flux» и index.js файл. Такая структура поможет упорядочить файлы.

К настоящему моменту структура папок должна выглядеть так:

wp-api-react /
- node_modules /
- src /
- - скрипты /
- - - компоненты /
- - - flux /
- - - index. js
- - index.html
- package.json
- webpack.config.js

index.js - это точка входа для Webpack, которая будет содержать все маршруты для проекта. Давайте включим в файл React, React Router и базовую структуру маршрутизации:

index.js ссылается на компонент Home в импорте. Нам нужно создать его в папке «компоненты». Home.js будет компонентом шаблона для домашней страницы. Включите это в файл:

Если вы запустите npm start в терминале внутри папки проекта и откроете http: // localhost: 8080 / в браузере, вы увидите сообщение Hello world! сообщение. Если вы начнете изменять файлы, Webpack перезагрузит страницу за вас.

Флюс с Alt

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

wp-api /
- node_modules /
- src /
- - scripts /
- - - поток /
- - - - alt /
- - - - действия /
- - - - магазины /
- - - компоненты /
- - - - Дома. js
- - - index.js
- - index.html
- package.json < br /> - webpack.config.js

Создайте Alt.js внутри папки «alt» и вставьте это в файл:

Все, что делает этот файл, - это экспорт экземпляра Alt, который мы будем использовать в магазинах и действиях.

Создайте DataActions.js в папке действия. В этом файле будет вся логика для получения данных из конечных точек WordPress REST API. Для разговора с API мы будем использовать axios. Включите это в DataActions.js:

Не забудьте заменить URL-адрес примера установки WordPress своим.

Создайте DataStore.js в папке «магазины». Этот файл будет прослушивать getSuccess() метод DataActions.js, который возвращает данные из WordPress API. Затем он будет хранить и обрабатывать данные. Вставьте это в DataStore.js:

Чтобы получить данные из API WordPress и сделать их доступными для приложения, вам нужно включить DataActions.js в index.js и обернуть функцию рендеринга в DataActions.getPages(). Возвращенный ответ позже будет использоваться для динамического создания маршрутов:

Теперь каждый раз, когда приложение запускается, DataActions.getPages() вызывает конечную точку WordPress API и сохраняет возвращенные данные в DataStore.js.

Чтобы получить к нему доступ, просто включите DataStore.js в любой компонент и вызовите соответствующий метод. Например, давайте поместим все данные в Home.js файл и console.log он:

После того, как Webpack обновит страницу, вы должны увидеть возвращенный объект данных в консоли:

Object {pages: Array[1], posts: Array[1]}

Динамические маршруты

В настоящее время в приложении не задано никаких маршрутов, кроме индексного маршрута. Если у вас есть несколько страниц, созданных в бэкэнде WordPress, скорее всего, вы хотите, чтобы они были доступны для внешнего интерфейса. Чтобы динамически добавлять маршруты в React Router, нам нужно добавить еще один метод в index.js, назовем его buildRoutes():

Включите {this.buildRoutes(response)} в React Router сразу после <Route path=”/” component={ Home } exact />. Метод просто перебирает все страницы, возвращаемые API WordPress, и возвращает новые маршруты. Обратите внимание, как для каждого маршрута добавляется компонент «Дом». Это означает, что компонент «Дом» будет использоваться для каждого маршрута.

Допустим, в WordPress есть страница с меткой «about ». Если вы перейдете к маршруту для этой страницы «/ about», он загрузится, но вы все равно увидите то же сообщение «Hello World». В случае, если вам нужен только один шаблон для каждой страницы, вы можете оставить его как есть и получить данные для конкретной страницы, вызвав DataStore.getPageBySlug(slug) и предоставив текущий слаг страницы.

Однако в большинстве случаев вам понадобится несколько шаблонов для разных страниц.

Шаблоны страниц

Чтобы использовать шаблоны страниц, нам нужно сообщить React, какой шаблон использовать с той или иной страницей. Мы можем использовать ярлык страницы, который возвращается API, для сопоставления шаблонов с разными маршрутами.

Предположим, у нас есть две страницы с ярлыками «главная» и «о». Нам нужно создать объект, который сопоставляет ярлыки страниц с путями компонентов React. Назовем шаблоны объектов и включим их в index.js:

Мы также внесли изменения в метод buildRoutes(), чтобы требовать правильный компонент. Не забудьте создать компонент About.js для сопоставления заголовка «about».

Чтобы получить данные для конкретной страницы, все, что вам нужно сделать, это вызвать метод DataStore.getPageBySlug(slug) и предоставить текущий ярлык страницы:

render() {
    let page = DataStore.getPageBySlug(‘about’);
return (
        <div>
            <h1>{page.title.rendered}</h1>
        </div>
    );
}

Динамическая навигация

Теперь мы собираемся добавить глобальную навигацию, которая будет отражать все ссылки на серверные страницы WordPress. Сначала создайте Header.js компонент в папке «components»:

Мы получаем все страницы из WordPress с помощью DataStore.getAllPages(), затем сортируем их по «menu_order» с lodash и просматриваем их в цикле, чтобы выплюнуть <Link /> маршрутизатора React. Обратите внимание, что маршрут домашней страницы исключается из массива allPages и включается в качестве отдельной ссылки.

Включите компонент Header.js в index.js, и вы увидите динамическую навигацию на каждой странице:

Расширенные настраиваемые поля

Большинство разработчиков WordPress знакомы с плагином Advanced Custom Fields. Это делает WordPress CMS полностью настраиваемой и удобной для пользователя. К счастью, получить доступ к данным ACF с помощью WordPress API очень просто.

Для получения данных ACF от конечных точек API нам необходимо установить еще один плагин под названием ACF to REST API. Это будет включать свойство acf в объект, возвращаемый API WordPress. Вы можете получить доступ к полям acf следующим образом:

render() {
    let page = DataStore.getPageBySlug(‘about’);
    let acf = page.acf; // Advanced Custom Fields data
return (
        <div>
            <h1>{acf.yourCustomFieldName}</h1>
        </div>
    );
}

Следующие шаги

Хорошо, мы рассмотрели наиболее распространенный вариант использования администратора WordPress CMS вместе с интерфейсом React.

Следующими шагами может быть добавление стиля для проекта в Less или Sass. Или, возможно, расширение файла DataAction.js путем добавления дополнительных вызовов конечных точек API для получения дополнительных данных, таких как комментарии, категории и таксономии.

Я настоятельно рекомендую ознакомиться с официальным Руководством по WordPress REST API, где функциональность API хорошо документирована. Там вы найдете информацию о CRUD, разбивке на страницы, аутентификации, запросах, создании пользовательских конечных точек и многом другом. Эти ресурсы помогут расширить то, что мы здесь создали.

Андрей Покровский - старший разработчик в Гигариф

Если вы зашли так далеко, вы могли бы стать разработчиком, который отлично подошел бы Gigareef. В настоящее время мы ищем талантливых разработчиков для работы над проектами, включающими проекты ReactJS / MEAN Stack / Handlebars / Node.

Отправьте электронное письмо на адрес [email protected] и расскажите нам немного о себе.

Гигариф, где процветают технологии