WP-API JavaScript клиент (Backbone.js)

В REST API есть JavaScript клиент, который позволяет удобно общаться с сайтом. Библиотека содержит Модели и Коллекции на все конечные точки WP, описанные в разделе Маршруты WP из коробки, а также на все эндпоинты, созданные вручную.

Backbone JavaScript Client (developer.wordpress.org).

Использование

Чтобы включить библиотеку WP API нужно подключить скрипт wp-api.

Сделать это можно напрямую:

wp_enqueue_script( 'wp-api' );

или через зависимость от нашего скрипта, например, my_script:

wp_enqueue_script( 'my_script', 'path/to/my/script', array('wp-api') );

Скрипт wp-api подключает с собой (зависит от следующих скриптов):
'jquery', 'backbone', 'underscore', 'wp-api-request'

Библиотека анализирует корневую конечную точку (схему REST API) и создает по ней Backbone модели и коллекции. Таким образом у нас появляется два основных объекта: wp.api.models и wp.api.collections, которые содержат следующие JS методы:

// Модели:
wp.api.models.Category
wp.api.models.Comment
wp.api.models.Media
wp.api.models.Page
wp.api.models.PageMeta
wp.api.models.PageRevision
wp.api.models.Post
wp.api.models.PostMeta
wp.api.models.PostRevision
wp.api.models.Schema
wp.api.models.Status
wp.api.models.Tag
wp.api.models.Taxonomy
wp.api.models.Type
wp.api.models.User

// Коллекции:
wp.api.collections.Categories
wp.api.collections.Comments
wp.api.collections.Media
wp.api.collections.PageMeta
wp.api.collections.PageRevisions
wp.api.collections.Pages
wp.api.collections.Posts
wp.api.collections.Statuses
wp.api.collections.Tags
wp.api.collections.Taxonomies
wp.api.collections.Types
wp.api.collections.Users

Мы можем использовать эти объекты (конечные точки) для чтения/обновления/создания/удаления элементов с помощью стандартных методов (fetch, sync, save и destroy для models, sync для collections).

Полный список методов и свойств смотрите в коде скрипта wp-includes/js/wp-api.js.

Значения по умолчанию

Каждая Модель и Коллекция содержит ссылку на значения по умолчанию, например:

wp.api.models.Post.prototype.args

author         : null
comment_status : null
content        : null
date           : null
date_gmt       : null
excerpt        : null
featured_image : null
format         : null
modified       : null
modified_gmt   : null
password       : null
ping_status    : null
slug           : null
status         : null
sticky         : null
title          : null

Доступные методы

Каждая Модель и Коллекция содержит список методов, которые поддерживает соответствующая конечная точка. Например, модель wp.api.models.Post имеет следующие методы:

["GET", "POST", "PUT", "PATCH", "DELETE"]

Принимаемые параметры

Каждая Модель и Коллекция содержит список параметров, которые принимает соответствующая конечная точка (обратите внимание, что параметры передаются в качестве второго аргумента при создании моделей или коллекций), например:

wp.api.collections.Posts.prototype.options

// содержит:
author
context
filter
order
orderby
page
per_page
search
status

Примеры использования Моделей

Чтобы создать/изменить запись (пост), убедитесь, что вы авторизованы и у вас есть достаточные для этого права.

// Создаем новый пост
var post = new wp.api.models.Post( { title: 'Это пробный пост' } );
post.save();

Пример работы с записью (постом):

// Получим пост ID=1
var post = new wp.api.models.Post( { id: 1 } );
post.fetch();

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

// Получим автора поста (User модель)
post.getAuthorUser().done( function( user ){
	// ... делаем что-нибудь с юзерами
	console.log( user.get( "name" ) );
} );

// Получим картинку поста (Media модель).
post.getFeaturedMedia().done( function( image ){
	// ... делаем что-нибудь с картинкой
	console.log( image );
} );

// Установим рубрики поста
post.setCategories( [ "apples", "oranges" ] );

Пример работы с рубриками:

// Получим все рубрики
var allCategories = new wp.api.collections.Categories()
allCategories.fetch();

// Найдем рубрику apples
var appleCategory = allCategories.findWhere( { slug: "apples" } );

// Добавим полученный выше пост в рубрику "apples" (установим рубрику для поста)
appleCategory.set( "parent_post", post.get( "id" ) );

Примеры использования Коллекций

Получим 10 последних постов:

var postsCollection = new wp.api.collections.Posts();
postsCollection.fetch();

Получим 25 последних постов:

postsCollection.fetch( { data: { per_page: 25 } } );

Используем фильтр, чтобы изменить параметры сортировки (order и orderby):

postsCollection.fetch( { data: { 'filter': { 'orderby': 'title', 'order': 'ASC' } } } );

Все коллекции поддерживают пагинацию автоматически, и следующий пакет результатов можно получить с помощью метода more():

postsCollection.more();

Получим страницу 5 из коллекции:

posts.fetch( { data: { page: 5 } } );

Проверим есть ли в коллекции еще записи (посты):

posts.hasMore();

Ожидание загрузки wp-api клиента (скрипта)

Backbone.js загружается асинхронно. Если схема api локализована и не нужно делать AJAX запрос на получение схемы, то клиент начинает работу сразу же. Однако когда нужно подождать полную готовность клиента к работе, нужно использовать loadPromise.done:

wp.api.loadPromise.done( function() {
	// Тут можно использовать клиент
} )

Работа с ревизиями

Через коллекции PostRevisions или PageRevisions, можно получить все ревизии постов/страниц. Или ревизии можно получить из коллекций Post или Page.

Например, получим все ревизии поста 1:

var revisions = new wp.api.collections.PostRevisions({}, { parent: 1 });

Коллекции редакций также могут быть доступны через родительскую коллекцию. В этом примере выполняется 2 HTTP-запроса вместо одного, но теперь доступна исходная запись и ее редакции:

var post = new wp.api.models.Post( { id: 1 } );
post.fetch();
post.getRevisions().done( function( revisions ){
  console.log( revisions );
});

Если были добавлены свои конечные точки в API, то они также становятся доступными как модели/коллекции. Например, вы получите новые модели и коллекции при добавлении поддержки rest API в пользовательский Тип записи.

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