Вопрос или проблема
Я пытаюсь создать запись в WordPress с использованием REST API, OAuth и cURL. Однако у меня возникают некоторые проблемы.
Мне удаётся создать пустую запись (без заголовка, слага и т. д.) с помощью следующего кода:
$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_POST => true,
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
Это работает, как и ожидалось — авторизация проходит успешно, и создаётся пустая запись в WordPress. Однако, когда я пытаюсь установить заголовок (или любое другое свойство), добавив
CURLOPT_POSTFIELDS => "title=testTitle",
я получаю ошибку:
{
"data": {
"code": "json_oauth1_signature_mismatch",
"message": "Подпись OAuth не совпадает",
"data": {
"status": 401
}
},
"headers": [],
"status": 401
}
Интересно, что мне удаётся установить заголовок с успехом, используя Postman. Есть идеи, что я делаю не так? Буду очень признателен за помощь — я занимаюсь этим уже несколько часов.
“REST API использует JSON исключительно в качестве формата запроса и ответа, включая ответы об ошибках.”
Я бы попробовал явно задать тип контента/длину и закодировать ваши данные в JSON с помощью что-то вроде этого (если вам нужно указать все параметры, которые вы использовали в предоставленном вами коде):
$data = array(
'title' => 'testTitle',
'content' => '',
);
$data = json_encode( $data );
$header = array(
buildAuthorizationHeader( $oauth ),
'Content-Type: application/json',
'Content-Length: ' . strlen( $data ),
'Expect:',
);
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_POST => true,
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POSTFIELDS => $data,
);
Ответ или решение
Для успешного создания поста в WordPress через REST API с использованием OAuth и cURL, необходимо убедиться, что вы правильно формируете запрос и отправляете данные в нужном формате. Ошибка 401 с сообщением "OAuth signature does not match", которую вы получаете, указывает на то, что подпись OAuth не соответствует ожидаемой, что может происходить из-за неправильного формата или содержания запроса.
Вот пошаговый подход для устранения данной проблемы:
-
Формат отправляемых данных: Ваша ошибка может быть связана с тем, что WordPress REST API ожидает данные в формате JSON. Вам необходимо использовать
json_encode()
для сериализации вашего массива данных. -
Заголовки запроса: Убедитесь, что в заголовках вашего запроса установлен заголовок
Content-Type
какapplication/json
. Это позволит серверу корректно обработать входящие данные.
Вот исправленный код с учётом всех вышеупомянутых моментов:
$data = array(
'title' => 'testTitle',
'content' => '', // Вы можете добавить содержимое поста, если нужно
);
$data = json_encode($data);
$header = array(
buildAuthorizationHeader($oauth), // Убедитесь, что эта функция работает корректно
'Content-Type: application/json',
'Content-Length: ' . strlen($data),
'Expect:',
);
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_POST => true,
CURLOPT_URL => $url, // Убедитесь, что URL правильный
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POSTFIELDS => $data,
);
// Инициализация cURL
$ch = curl_init();
curl_setopt_array($ch, $options);
// Выполнение запроса
$response = curl_exec($ch);
// Проверка на ошибки
if(curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
}
// Закрытие cURL соединения
curl_close($ch);
// Печать ответа
echo $response;
Важные моменты:
-
Функция
buildAuthorizationHeader()
: Убедитесь, что данная функция формирует корректный заголовок авторизации OAuth, включая все обязательные параметры. -
Правильный URL: Проверьте, что переменная
$url
указывает на правильный эндпоинт для создания поста, например,https://yourwebsite.com/wp-json/wp/v2/posts
. -
Проверка других параметров: Если вы добавляете другие свойства к посту, убедитесь, что они поддерживаются в REST API и правильно формируются.
Следуя приведённым рекомендациям, вы сможете устранить ошибку 401 и успешно создать пост в WordPress с помощью REST API, OAuth и cURL. Если ошибка все еще возникает, пожалуйста, проверьте логи сервера и убедитесь, что все ключи и токены корректны.