Logo
Back

Strapi или Headless Wordpress?

CMS (системы управления контентом) используют для во многих приложениях: от личного блога и лендингов до E-commerce и B2B решений. Согласно опросу Jamstack Community, WordPress используется в качестве headless CMS на 21% веб-сайтов. Strapi используют 17%. Все же Strapi или WordPress: что и когда использовать?

Согласно опросу Jamstack Community, в пятерку самых популярных CMS входят WordPress, Contentful, Strapi и Drupal.

Вкратце

Если у вас нет предварительного технического опыта (и не хочется разбираться, почему "2" + "2" = "22"), используйте WordPress. В нем уже есть панель администратора и фронтенд (веб-сайт) для ваших пользователей. Очень легко загрузить тему или добавить дополнительные функции с помощью готовых плагинов (такие как карусель или конструктор форм). Вишенкой на торте будет то, что существует множество хостинг-провайдеров, которые установят и настроят сервер для WordPress.

Также можно использовать WordPress как headless, обращаясь только к API для создания своего фронтенда.

Strapi, будучи headless CMS, дает полный контроль над тем, как выглядит сайт. Она работает на идее "Collection type". "Collection type" как форма: имеет набор полей для заполнения и содержимое, которое заполняет эти поля. Для полей можно установить ограничения, как "текстовое поле не может быть длиннее 500 символов" или "поле обязательно" и т. д. Поля также могут содержать отношения "один к одному" или "один ко многим".

Strapi поддерживает плагины на сервере, такие как ezforms. Они позволяют расширять API Strapi, но не имеют элементов пользовательского интерфейса для посетителей.

Имея это в виду, Strapi можно использовать как готовый бэкенд больше, чем для блога: например, для интернет-магазина или сайта объявлений.

Сравнение API

В этой статье мы сравним только API для получения контента, поскольку управление пользователями иногда осуществляется с помощью сторонних сервисов.

У WordPress есть JS клиент для взаимодействия с API.

Он должен быть активирован на стороне сервера:

wp_enqueue_script('wp-api');

Затем его можно использовать на клиенте. Клиент придерживается шаблону объектной модели, в котором нужно сначала создать пустой объект, а затем заполнить его данными:

// создаем новый пост
var post = new wp.api.models.Post({ id: 1 });

// получаем данные для поста с id = 1
post.fetch();

Также можно получить данные, относящиеся к объекту:

// Получить коллекцию категорий поста (вернет promise)
// Использует _embedded данные, если возможно, в таком случае promise завершится сразу.
post.getCategories().done(function (postCategories) {
  // ... что-нибудь сделать с категориями.
  console.log(postCategories[0].name);
});

REST API Strapi предоставляет контент через API.

Есть пакеты для JavaScript/Typescript для взаимодействия с API Strapi, например @iamsamwen/strapi-api. Этот пакет предоставляет "обертку класса для вызовов API-интерфейса для упрощения кода управления данными и мультимедиа файлами".

Это оставляет разработчику выбор какие шаблоны проектирования и структуру проекта использовать.

API Strapi позволяет запрашивать любой тип коллекции:

// GET http://localhost:1337/api/restaurants

{
  "data": {
    "id": 1,
    "attributes": {
      "title": "Пироги у Прокофьи",
      "description": "Пироги из говядины и креветок"
    },
    "meta": {
      "availableLocales": []
    }
  },
  "meta": {}
}

По умолчанию Strapi не заполняет относящиеся объекты и приложенные файлы. Но, в отличие от WordPress, их можно получить за один вызов. Параметр populate=* позволяет заполнить все отношения объекта и приложения

// GET http://localhost:1337/api/restaurants?populate=%2A

{
  "data": {
    "id": 1,
    "attributes": {
      "title": "Пироги у Прокофьи",
      "description": "Пироги из говядины и креветок",
      // headerImage не было в ответе без параметра "populate"
      "headerImage": {
        "data": {
          "id": 1,
          "attributes": {
            "name": "17520.jpg",
            "alternativeText": "Здание \"Пироги у Прокофьи\"",
            "formats": {
              // ...
            }
            // ...
          }
        }
      }
    },
    "meta": {
      "availableLocales": []
    }
  },
  "meta": {}
}

Также можно заполнить только определенные параметры, уменьшив размер ответа API.

Примечание: и WordPress, и Strapi API поддерживают GraphQL, но ни один из них не поддерживает его "из коробки", и в этой статье он не рассматривается. GraphQL + WordPress, GraphQL + Strapi

Управление пользователями (раздела admin)

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

WordPress поддерживает 5 ролей пользователей: Administrator, Editor, Author, Contributor, и Subscriber.

Administrator имеет доступ ко всем функциям администрирования на сайте.

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

Author может публиковать и управлять только своими постами.

Contributor может писать и управлять свои посты, но не может их публиковать.

Subscriber это тот, кто может управлять только своим профилем. Эту роль можно использовать для веб-сайтов с подписками.

Существующие роли можно изменить, а дополнительные можно добавить только с помощью плагинов WordPress.

В бесплатной версии Strapi есть только 3 роли: Author, Editor и Super Admin. Поскольку Strapi использует Collection type, доступ на основе ролей можно настроить для каждого из полей коллекции. В бесплатной версия Strapi также можно указать, какие переводы может редактировать пользователь.

В платной версии Strapi можно добавить дополнительные роли администраторов, настроить доступ к полям для создания, чтения, обновления, удаления и указать условия доступа, такие как "только пользователь, создавший этот объект, может изменять его поля".

Blog
Writing cool articles about backends