WordPress: Расширение возможностей XML-RPC

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

Пример

Например, нам необходимо создать API метод, который позволит просто получить ID пользователя, который делает запрос на сайт через XML-RPC. Для этого наш метод сначала надо зарегистрировать  системе:

// Добавляем фильтр
add_filter( 'xmlrpc_methods', 'register_my_methods');

// Функция-фильтр для регистрации методов
function register_my_methods( $methods ) {
    $methods['my.getUserID'] = 'my_getUserID';
    return $methods;
}

Теперь у нас есть метод my.getUserID, который при вызове будет выполнять функцию my_getUserID и возвращать результат ее работы. Функция пока не существует, по этому создадим ее:

function my_getUserID( $args ) {
    global $wp_xmlrpc_server;

    // обезопасиваем передаваемые данные
    $wp_xmlrpc_server->escape( $args );

    // получаем данные для авторизации
    $username = $args[0];
    $password = $args[1];

    // авторизируемся, и в случае ошибки возвращаем ее
    if ( ! $user = $wp_xmlrpc_server->login( $username, $password ) )
        return $wp_xmlrpc_server->error;

    // возвращаем наш ID
    return $user->ID;    
}

Как вызвать метод

На данном этапе наш собственный метод готов к вызову с удаленного сервера. Но практика показала, что вызов можно осуществить прямо со своего сервера, но это может зависеть от настроек сервера, а именно от настройки allow_url_fopen, но сейчас не об этом =). Следующий код демонстрирует пример запроса к нашему методу. К остальным методам, как стандартным так и нет, код будет похожим.

// Подключаем нужные классы для работы с клиентом XML-RPC
include_once( ABSPATH . WPINC . '/class-IXR.php' );
include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' );

// Инициализируем клиент
$client = new WP_HTTP_IXR_CLIENT( 'http://my.site/xmlrpc.php' );

// Делаем запрос к нашему методу
$client->query( 'my.getUserID', array( 'username', 'password' ) );

// Получаем ответ
$ID = $client->getResponse();