WordPress Rest API Создать Запись

Вопрос или проблема

Можно ли войти на мой другой сайт 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), необходимо:

  1. Убедиться, что на вашем целевом сайте (test.com) включен REST API. Обычно это включено по умолчанию, но нужно проверить настройки.
  2. Аутентификация: WordPress REST API не позволяет неавторизованным пользователям создавать или редактировать посты. Вам нужно использовать правильный метод аутентификации, обычно это Basic Authentication или OAuth.

Исправление вашего кода

В вашем коде замечены несколько проблем, которые могут приводить к ошибке 401 (Unauthorized). Рассмотрим основные аспекты:

  1. Убедитесь, что указанные учетные данные правильные: Ваша строка аутентификации должна выглядеть корректно. Убедитесь, что имя пользователя и пароль действительны и имеют необходимые разрешения для создания постов.

  2. Используйте правильные заголовки: В JavaScript-коде есть несколько ошибок в заголовках, особенно в строке аутентификации. Исправленный код должен выглядеть следующим образом:

xhr.setRequestHeader('Authorization', 'Basic ' + btoa('saurab:saurav123'));

Проверьте, чтобы заголовок Authorization использовался вместо Authentication.

  1. Отправка данных в формате JSON: В вашем AJAX-запросе для передачи данных стоит указать правильный формат. Используйте JSON.stringify() для оплаты данных:
data: JSON.stringify(data),
  1. Корректный URL для API: Убедитесь, что ваш URL правильно указывает на API, к которому вы пытаетесь получить доступ. Проверьте, что https://test.com/wp-json/wp/v2/posts– это правильный путь к вашему API.

  2. Запрос не обрабатывается: Метод 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 возможно и может быть осуществлено с помощью правильной аутентификации и настройки заголовков. Пожалуйста, удостоверьтесь, что указанные вами учетные данные правильные и что вы используете верные заголовки, как указанно выше. Если все сделано корректно, вы должны успешно создавать посты без ошибок.

Оцените материал
Добавить комментарий

Капча загружается...