Статьи

XML-RPC в WordPress

XML-RPC — это протокол для удаленных вызовов процедур, который использует XML для обмена данными и в основном использует HTTP для фактического вызова. В XML-RPC клиент, который хочет сделать вызов удаленному методу, создает входные параметры в форме XML и отправляет их через HTTP-запрос на удаленный сервер, реализующий протокол XML-RPC. Удаленный сервер, реализующий протокол XML-RPC, получает запрос, а затем выполняет удаленный метод и возвращает результат обратно в формате XML.

В этой статье мы рассмотрим, как вызывать методы в вашей установке WordPress с использованием XML-RPC.


WordPress — это полноценная блог-платформа. Он сделан очень настраиваемым и открыт для других систем для подключения и связи с ним. XML-RPC в WordPress помогает этой открытости WordPress, позволяя другим системам или программному обеспечению выполнять операции по установке WordPress даже удаленно. Таким образом, с помощью WordPress XML-RPC можно создавать клиенты блогов WordPress, некоторые другие программы, которые выполняют некоторые пакетные задачи, такие как создание нескольких записей из файла и т. Д.


По умолчанию XML-RPC не включен в вашей установке WordPress. Таким образом, чтобы ваша установка WordPress могла обслуживать запросы XML-RPC, вы должны включить эту функцию на своем веб-сайте.

Чтобы включить эту функцию, вам нужно перейти в раздел администратора. Там, в Настройки -> Запись, вы должны будете включить опцию XML-RPC, как показано ниже.


Все запросы XML-RPC отправляются в файл xmlrpc.php, который находится в вашем основном каталоге установки WordPress. Файл в основном выполняет начальную загрузку для загрузки среды WordPress, а затем создает объект класса wp_xmlrpc_server который находится в расположении wp-includes / class-wp-xmlrpc-server.php .

Класс wp_xmlrpc_server отвечает за обработку всех запросов XML-RPC, поступающих от клиентов XML-RPC.


WordPress XML-RPC-сервер поддерживает несколько типов API для XML-RPC. Ниже приведены типы API, которые поддерживает сервер WordPress XML-RPC:

  • WordPress API
  • Blogger API
  • MetaWeblog API
  • API MovableType
  • PingBack API

Хотя документации по этому вопросу wp_xmlrpc_server , краткий wp_xmlrpc_server класса wp_xmlrpc_server поможет узнать точное имя API, поддерживаемых сервером WordPress XML-RPC.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
function wp_xmlrpc_server() {
    $this->methods = array(
        // WordPress API
        ‘wp.getUsersBlogs’ => ‘this:wp_getUsersBlogs’,
        ‘wp.getPage’ => ‘this:wp_getPage’,
        ‘wp.getPages’ => ‘this:wp_getPages’,
        ‘wp.newPage’ => ‘this:wp_newPage’,
        ‘wp.deletePage’ => ‘this:wp_deletePage’,
        ‘wp.editPage’ => ‘this:wp_editPage’,
        ‘wp.getPageList’ => ‘this:wp_getPageList’,
        ‘wp.getAuthors’ => ‘this:wp_getAuthors’,
        ‘wp.getCategories’ => ‘this:mw_getCategories’, // Alias
        ‘wp.getTags’ => ‘this:wp_getTags’,
        ‘wp.newCategory’ => ‘this:wp_newCategory’,
        ‘wp.deleteCategory’ => ‘this:wp_deleteCategory’,
        ‘wp.suggestCategories’ => ‘this:wp_suggestCategories’,
        ‘wp.uploadFile’ => ‘this:mw_newMediaObject’, // Alias
        ‘wp.getCommentCount’ => ‘this:wp_getCommentCount’,
        ‘wp.getPostStatusList’ => ‘this:wp_getPostStatusList’,
        ‘wp.getPageStatusList’ => ‘this:wp_getPageStatusList’,
        ‘wp.getPageTemplates’ => ‘this:wp_getPageTemplates’,
        ‘wp.getOptions’ => ‘this:wp_getOptions’,
        ‘wp.setOptions’ => ‘this:wp_setOptions’,
        ‘wp.getComment’ => ‘this:wp_getComment’,
        ‘wp.getComments’ => ‘this:wp_getComments’,
        ‘wp.deleteComment’ => ‘this:wp_deleteComment’,
        ‘wp.editComment’ => ‘this:wp_editComment’,
        ‘wp.newComment’ => ‘this:wp_newComment’,
        ‘wp.getCommentStatusList’ => ‘this:wp_getCommentStatusList’,
        ‘wp.getMediaItem’ => ‘this:wp_getMediaItem’,
        ‘wp.getMediaLibrary’ => ‘this:wp_getMediaLibrary’,
        ‘wp.getPostFormats’ => ‘this:wp_getPostFormats’,
 
        // Blogger API
        ‘blogger.getUsersBlogs’ => ‘this:blogger_getUsersBlogs’,
        ‘blogger.getUserInfo’ => ‘this:blogger_getUserInfo’,
        ‘blogger.getPost’ => ‘this:blogger_getPost’,
        ‘blogger.getRecentPosts’ => ‘this:blogger_getRecentPosts’,
        ‘blogger.getTemplate’ => ‘this:blogger_getTemplate’,
        ‘blogger.setTemplate’ => ‘this:blogger_setTemplate’,
        ‘blogger.newPost’ => ‘this:blogger_newPost’,
        ‘blogger.editPost’ => ‘this:blogger_editPost’,
        ‘blogger.deletePost’ => ‘this:blogger_deletePost’,
 
        // MetaWeblog API (with MT extensions to structs)
        ‘metaWeblog.newPost’ => ‘this:mw_newPost’,
        ‘metaWeblog.editPost’ => ‘this:mw_editPost’,
        ‘metaWeblog.getPost’ => ‘this:mw_getPost’,
        ‘metaWeblog.getRecentPosts’ => ‘this:mw_getRecentPosts’,
        ‘metaWeblog.getCategories’ => ‘this:mw_getCategories’,
        ‘metaWeblog.newMediaObject’ => ‘this:mw_newMediaObject’,
 
        // MetaWeblog API aliases for Blogger API
        // see http://www.xmlrpc.com/stories/storyReader$2460
        ‘metaWeblog.deletePost’ => ‘this:blogger_deletePost’,
        ‘metaWeblog.getTemplate’ => ‘this:blogger_getTemplate’,
        ‘metaWeblog.setTemplate’ => ‘this:blogger_setTemplate’,
        ‘metaWeblog.getUsersBlogs’ => ‘this:blogger_getUsersBlogs’,
 
        // MovableType API
        ‘mt.getCategoryList’ => ‘this:mt_getCategoryList’,
        ‘mt.getRecentPostTitles’ => ‘this:mt_getRecentPostTitles’,
        ‘mt.getPostCategories’ => ‘this:mt_getPostCategories’,
        ‘mt.setPostCategories’ => ‘this:mt_setPostCategories’,
        ‘mt.supportedMethods’ => ‘this:mt_supportedMethods’,
        ‘mt.supportedTextFilters’ => ‘this:mt_supportedTextFilters’,
        ‘mt.getTrackbackPings’ => ‘this:mt_getTrackbackPings’,
        ‘mt.publishPost’ => ‘this:mt_publishPost’,
 
        // PingBack
        ‘pingback.ping’ => ‘this:pingback_ping’,
        ‘pingback.extensions.getPingbacks’ => ‘this:pingback_extensions_getPingbacks’,
 
        ‘demo.sayHello’ => ‘this:sayHello’,
        ‘demo.addTwoNumbers’ => ‘this:addTwoNumbers’
    );

Теперь мы собираемся создать класс XMLRPClientWordPress в PHP, который будет предоставлять функции для выполнения различных операций в вашей установке WordPress через вызовы XML-RPC.

1
2
3
4
5
class XMLRPClientWordPress
{
    var $XMLRPCURL = «»;
    var $UserName = «»;
    var $PassWord = «»;

Сначала мы создадим класс и в нем будет три члена для хранения значения URL-адреса XML-RPC установки WordPress, а также имени пользователя и пароля установки.

URL-адрес XML-PRC: http://yourwordpressinstall.com/xmlrpc.php , а имя пользователя и пароль — это имя пользователя и пароль пользователя блога с соответствующим доступом.

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

1
2
3
4
5
6
7
// Constructor
public function __construct($xmlrpcurl, $username, $password)
{
    $this->XMLRPCURL = $xmlrpcurl;
    $this->UserName = $username;
    $this->PassWord = $password;
}

Затем мы создадим функцию send_request которая будет принимать имя запроса и параметры запроса в качестве входных данных. Затем функция создаст запрос XML из входных параметров, а затем отправит запрос на URL-адрес установки XML-RPC WordPress и вернет результаты.

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

01
02
03
04
05
06
07
08
09
10
11
12
function send_request($requestname, $params)
{
    $request = xmlrpc_encode_request($requestname, $params);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_URL, $this->XMLRPCURL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    $results = curl_exec($ch);
    curl_close($ch);
    return $results;
}

Эта функция использует функцию PHP xmlrpc_encode_request которая создает запрос XML, затем мы используем curl для отправки запроса по URL-адресу XML-RPC установки WordPress, хранящейся в переменной члена класса.

Затем эта функция возвращает результат, полученный с сервера XML-RPC.


Чтобы проверить, можем ли мы правильно вызывать методы на сервере установки WordPress, мы demo.sayHello метод demo.sayHello , он не принимает параметров и который при правильной работе XML-RPC-сервера WordPress возвращает строку «Hello!».

Функция для вызова demo.sayHello выглядит следующим образом:

1
2
3
4
5
function sayHello()
{
    $params = array();
    return $this->send_request(‘demo.sayHello’,$params);
}

По сути, поскольку метод demo.sayHello не принимает никаких параметров, мы отправляем пустой массив в качестве параметра, а затем вызываем send_request , передавая имя запроса как demo.sayHello .

Для вызова этой функции вам необходимо создать объект класса XMLRPClientWordPress следующим образом:

1
$objXMLRPClientWordPress = new XMLRPClientWordPress(«http://localhost/wordpress31/xmlrpc.php» , «admin» , «abbas»);

А затем позвоните:

1
$objXMLRPClientWordPress->sayHello()

Вывод этого будет следующим:

Если вы получаете тот же результат, это означает, что вы можете правильно отправить запрос на ваш XML-RPC-сервер WordPress и правильно получить запрос.

Теперь вы можете выполнить немного более сложную операцию с использованием XML-RPC в вашей установке WordPress.


Теперь давайте создадим функцию, которая будет создавать пост в блоге через XML-RPC.

Имя запроса для создания поста — metaWeblog.newPost который на самом деле является частью API MetaWeblog, поддерживаемого WordPress.

Аргументы, необходимые для этого запроса, являются

  • blogid (который равен 0, если в вашей установке только один блог)
  • username
  • password
  • Структура контента поста, т.е. различная информация о посте, такая как title , content , categories и т. Д.
  • publish то есть publish ли пост

Функция create_post выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
function create_post($title,$body,$category,$keywords=»,$encoding=’UTF-8′)
{
    $title = htmlentities($title,ENT_NOQUOTES,$encoding);
    $keywords = htmlentities($keywords,ENT_NOQUOTES,$encoding);
 
    $content = array(
        ‘title’ => $title,
        ‘description’ => $body,
        ‘mt_allow_comments’ => 0, // 1 to allow comments
        ‘mt_allow_pings’ => 0, // 1 to allow trackbacks
        ‘post_type’ => ‘post’,
        ‘mt_keywords’ => $keywords,
        ‘categories’ => array($category)
    );
    $params = array(0,$this->UserName,$this->PassWord,$content,true);
 
    return $this->send_request(‘metaWeblog.newPost’,$params);
}

Эта функция принимает заголовок, тело, категории и т. Д. В качестве входных аргументов. Затем он создает структуру содержимого из этих аргументов и устанавливает некоторые значения по умолчанию.

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

Эта функция может быть вызвана следующим образом.

1
$objXMLRPClientWordPress->create_post(‘Hello WordPress XML-RPC’, ‘This is the content of post done via XML-RPC’,»);

Идентификатор вновь созданного сообщения — это значение, возвращаемое этим API. Если мы создадим таблицу из API и выведем ее результаты, она будет выглядеть следующим образом.

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


Теперь мы создадим страницу по установке WordPress с использованием XML-RPC. Запрос на создание страницы — это wp.newPage который на самом деле является частью WordPress API.

Аргументы для этого такие же, как и для создания запроса на публикацию.

Ниже create_page функция create_page :

01
02
03
04
05
06
07
08
09
10
11
12
function create_page($title,$body,$encoding=’UTF-8′)
{
    $title = htmlentities($title,ENT_NOQUOTES,$encoding);
 
    $content = array(
        ‘title’ => $title,
        ‘description’ => $body
    );
    $params = array(0,$this->UserName,$this->PassWord,$content,true);
 
    return $this->send_request(‘wp.newPage’,$params);
}

Это в основном принимает заголовок и тело в качестве входных данных, а затем создает параметры, необходимые для запроса, а затем отправляет запрос.

Мы будем вызывать функцию следующим образом

1
$objXMLRPClientWordPress->create_page(‘WordPress XML-RPC page’, ‘This is the content of First Page done via XML-RPC’);

А затем позвоните:

1
$objXMLRPClientWordPress->sayHello()

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


Теперь мы создадим функцию для получения списка авторов из вашей установки WordPress через XML-RPC. Запрос на получение списка авторов — это wp.getAuthors который также является частью WordPress API.

Параметры для этого запроса следующие:

  • blogid (который равен 0, если в вашей установке только один блог)
  • username
  • password

Функция display_authors выглядит следующим образом:

1
2
3
4
5
function display_authors()
{
    $params = array(0,$this->UserName,$this->PassWord);
    return $this->send_request(‘wp.getAuthors’,$params);
}

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

Мы можем вызвать эту функцию следующим образом:

1
$objXMLRPClientWordPress->display_authors();

Ниже приведена таблица, созданная на основе запросов и ответов различных запросов в этом руководстве.


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

Есть запросы на поддержку

  • Создание, редактирование, удаление страниц и постов
  • Создание, редактирование, удаление комментариев
  • Список авторов и подробности блога
  • Для получения последних сообщений и списка категорий

И многое другое поддерживается.


Поддержка XML-RPC в WordPress позволяет писать другое программное обеспечение или сценарии, которые могут автоматизировать задачи в вашей установке WordPress или другое клиентское программное обеспечение для удаленного выполнения задач.

Такие функции, как XML-RPC, помогают WordPress быть очень открытой и расширяемой платформой. Так что счастливого ведения блога с WordPress!

У вас есть конкретная задача, для которой вы хотели бы использовать XML-RPC? Есть ли конкретное программное обеспечение, которое вы хотели бы использовать с WordPress, использующее XML-RPC? Дайте нам знать в комментариях ниже!