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();