Вопрос или проблема
Можно ли войти на мой другой сайт WP с другого сайта WP (они имеют разные домены и хосты)?
На самом деле, я пытаюсь создать запись на одном из своих сайтов из другого сайта, используя Rest API?
Я даже не знаю, возможно ли это?
Если это возможно, может кто-нибудь объяснить это?
Я усердно пытаюсь, но за последние несколько дней я застрял. Все, что я получаю, это ошибка 401().
Я могу поделиться своими кодами для дальнейшего объяснения.
class MyPlugin
{
function __construct()
{
add_action( 'wp_ajax_abc_add_post', array( $this, 'abc_add_post' ) );
add_action( 'wp_ajax_nopriv_abc_add_post', array( $this, 'abc_add_post' ) );
add_action( 'wp_footer', array( $this, 'my_js' ) );
}
function abc_add_post()
{
$api_response = wp_remote_post( 'https://test.com/wp-json/wp/v2/posts', array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( 'saurab:saurav123' )
),
'body' => array(
'title' => 'My test',
'status' => 'draft', // ок, мы не хотим публиковать это сразу
'content' => 'lalala',
'categories' => 1, // ID категории
'tags' => '1', // строка, через запятую
'date' => '2018-08-17T10:00:00', // YYYY-MM-DDTHH:MM:SS
'excerpt' => 'Read this awesome post',
'password' => '',
'slug' => 'new-test-post' // часть URL обычно
// здесь больше параметров тела:
// developer.wordpress.org/rest-api/reference/posts/#create-a-post
)
) );
$body = json_decode( $api_response['body'] );
// вы всегда можете использовать print_r, чтобы посмотреть, что внутри
print_r($api_response);
if( wp_remote_retrieve_response_message( $api_response ) === 'Created' ) {
echo 'Запись ' . $body->title->rendered . ' была успешно создана';
}
else{
echo "здесь";
}
die();
}
function my_js()
{
echo "";
}
}
new MyPlugin;
Спасибо.
Ваш JS отправляет запрос напрямую, поэтому abc_add_post()
кажется совершенно ненужным. Проблема с вашим JavaScript в том, что эта часть все еще в строке, начинающейся с "
:
xhr.setRequestHeader( 'Authentication', 'Basic ' + btoa( 'saurab:saurav123' ) );
Чтобы использовать функцию и конкатенировать ее, вам нужно закрыть уже открытую строку:
xhr.setRequestHeader( 'Authentication', 'Basic ' + btoa( 'saurab:saurav123' ) );
Ответ или решение
Создание поста в WordPress с использованием REST API может быть сложной задачей, особенно когда вы работаете с несколькими сайтами и сталкиваетесь с проблемами аутентификации. В этом ответе мы подробно рассмотрим, как создать пост с одного сайта на другом сайте WordPress с помощью REST API, а также исправим ошибки в вашем коде.
Основы работы с REST API WordPress
Для создания поста на одном сайте (например, test.com) с другого сайта (например, saurabadhikari.com.np), необходимо:
- Убедиться, что на вашем целевом сайте (test.com) включен REST API. Обычно это включено по умолчанию, но нужно проверить настройки.
- Аутентификация: WordPress REST API не позволяет неавторизованным пользователям создавать или редактировать посты. Вам нужно использовать правильный метод аутентификации, обычно это Basic Authentication или OAuth.
Исправление вашего кода
В вашем коде замечены несколько проблем, которые могут приводить к ошибке 401 (Unauthorized). Рассмотрим основные аспекты:
-
Убедитесь, что указанные учетные данные правильные: Ваша строка аутентификации должна выглядеть корректно. Убедитесь, что имя пользователя и пароль действительны и имеют необходимые разрешения для создания постов.
-
Используйте правильные заголовки: В JavaScript-коде есть несколько ошибок в заголовках, особенно в строке аутентификации. Исправленный код должен выглядеть следующим образом:
xhr.setRequestHeader('Authorization', 'Basic ' + btoa('saurab:saurav123'));
Проверьте, чтобы заголовок Authorization
использовался вместо Authentication
.
- Отправка данных в формате JSON: В вашем AJAX-запросе для передачи данных стоит указать правильный формат. Используйте JSON.stringify() для оплаты данных:
data: JSON.stringify(data),
-
Корректный URL для API: Убедитесь, что ваш URL правильно указывает на API, к которому вы пытаетесь получить доступ. Проверьте, что
https://test.com/wp-json/wp/v2/posts
– это правильный путь к вашему API. -
Запрос не обрабатывается: Метод
abc_add_post()
в вашем PHP-коде на самом деле не нужен, если вы не собираетесь обрабатывать данные серверной логикой. Вы можете создавать посты непосредственно из JavaScript.
Совершенный пример кода
Вот исправленный код вашего JavaScript:
function my_js() {
echo "<script>
jQuery(document).ready(function ($) {
$('#my-submit').on('click', function (e) {
e.preventDefault();
var title = 'test';
var content = 'this is test';
var status = 'draft';
var data = {
title: title,
content: content,
status: status
};
$.ajax({
method: 'POST',
url: 'https://test.com/wp-json/wp/v2/posts/',
data: JSON.stringify(data),
contentType: 'application/json',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic ' + btoa('saurab:saurav123'));
},
success: function (response) {
alert('Пост успешно создан!');
console.log(response);
},
error: function (response) {
alert('Ошибка при создании поста');
console.log(response);
}
});
});
});
</script>";
}
Заключение
Создание поста на другом сайте WordPress с помощью REST API возможно и может быть осуществлено с помощью правильной аутентификации и настройки заголовков. Пожалуйста, удостоверьтесь, что указанные вами учетные данные правильные и что вы используете верные заголовки, как указанно выше. Если все сделано корректно, вы должны успешно создавать посты без ошибок.