wp_remote_post() – это функция WordPress, предназначенная для отправки HTTP POST запросов. Она позволяет взаимодействовать с внешними API и другими веб-ресурсами. Функция является частью WordPress HTTP API, что делает отправку HTTP запросов более удобной и упрощает процесс разработки.
wp_remote_post( $url, $args = array() )- $url (string) (обязательный): URL, к которому осуществляется запрос.
- $args (array) (необязательный): Дополнительные параметры запроса.
Параметры
- method (string): Метод запроса. Допустимые значения – GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS, PATCH. По умолчанию – POST.
- timeout (int): Лимит времени в секундах на получение данных. По умолчанию – 5. (Если сервер отвечает долго, установите большее значение, например 45).
- redirection (int): Максимальное количество редиректов. По умолчанию – 5.
- httpversion (string): Версия используемого HTTP-протокола. Поддерживаемые значения – 1.0 (по умолчанию) и 1.1.
- user-agent (string): По умолчанию – WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ).
- reject_unsafe_urls (bool): Проверка безопасности URL функцией wp_http_validate_url(). По умолчанию – false.
- blocking (bool): Блокирующий (true) или неблокирующий (false) запрос. По умолчанию – true.
- headers (string|array): Заголовки запроса.
- cookies (array): Куки, передаваемые в запросе.
- body (string|array): Тело запроса. По умолчанию – null.
- compress (bool): Сжатие тела запроса. По умолчанию – false.
- decompress (bool): Распаковка полученных данных. По умолчанию – true.
- sslverify (bool): Проверка SSL сертификата. По умолчанию – true.
- sslcertificates (string): Путь к файлу SSL-сертификата. По умолчанию: ABSPATH . WPINC . '/certificates/ca-bundle.crt'.
- stream (bool): Запись полученного ответа в файл. По умолчанию – false.
- filename (string): Файл, в который нужно записать ответ (если stream– true).
- limit_response_size (int): Ограничение размера ответа в байтах. По умолчанию – null.
Пример 1: Базовый пример использования
Предположим, мы хотим отправить данные о новом посте на внешний сервер каждый раз, когда создаётся новый пост в WordPress. Мы можем использовать хук save_post и функцию wp_remote_post() для достижения этой цели.
function send_post_data_to_external_server( $post_id ) {
    // Избегаем бесконечной рекурсии
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    // Проверяем тип поста и убедимся, что это не ревизия
    if ( 'post' != get_post_type( $post_id ) || wp_is_post_revision( $post_id ) ) {
        return;
    }
    // Получаем данные поста
    $post_data = array(
        'title'   => get_the_title( $post_id ),
        'content' => get_the_content( null, false, $post_id ),
        'url'     => get_permalink( $post_id )
    );
    // Аргументы для запроса
    $args = array(
        'body' => json_encode( $post_data ),
        'headers' => array(
            'Content-Type' => 'application/json',
        )
    );
    // Отправляем POST запрос на внешний сервер
    $response = wp_remote_post( 'https://example.com/api/posts', $args );
    // Проверяем ответ
    if ( is_wp_error( $response ) ) {
        $error_message = $response->get_error_message();
        error_log( "Ошибка при отправке данных поста: $error_message" );
    } else {
        error_log( "Данные поста успешно отправлены." );
    }
}
add_action( 'save_post', 'send_post_data_to_external_server' );
Объяснение кода
- Функция send_post_data_to_external_server: Эта функция срабатывает каждый раз, когда сохраняется пост.
- Проверка автосохранения: Мы избегаем выполнения кода во время автосохранения.
- Проверка типа поста и ревизии: Убедимся, что обрабатываем только обычные посты и исключаем ревизии.
- Получение данных поста: Собираем необходимые данные, такие как заголовок, контент и URL поста.
- Настройка аргументов для запроса: Подготавливаем тело запроса в формате JSON и задаём соответствующий заголовок.
- Отправка POST запроса: Используем wp_remote_post()для отправки данных на внешний сервер.
- Проверка ответа: Логируем ошибки или успешную отправку данных.
Используя wp_remote_post(), вы можете легко взаимодействовать с внешними сервисами и API, отправляя данные с вашего сайта WordPress.
Пример 2: Передача параметров запроса
$url = 'http://example.com/profile';
$args = array(
    'timeout'     => 45,         // Устанавливаем лимит времени на выполнение запроса в 45 секунд.
    'redirection' => 5,          // Максимальное количество редиректов - 5.
    'httpversion' => '1.0',      // Используем версию HTTP 1.0.
    'blocking'    => true,       // Запрос будет блокирующим, то есть код будет ждать ответа.
    'headers'     => array(),    // Заголовки запроса, оставляем пустыми.
    'body'        => array(      // Тело запроса, передаем данные пользователя.
        'username' => 'andy',
        'password' => '2024andy'
    ),
    'cookies'     => array()     // Куки, оставляем пустыми.
);
$response = wp_remote_post( $url, $args );
// Проверка на наличие ошибок
if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Что-то пошло не так: $error_message";
} else {
    echo 'Ответ: <pre>';
    print_r( $response );
    echo '</pre>';
}В этом примере отправляется POST запрос с данными пользователя к указанному URL. Если запрос успешен, выводится ответ сервера.
Пример 3: Пример базовой авторизации
$username = 'your_username';    // Имя пользователя для авторизации.
$password = 'your_password';    // Пароль для авторизации.
$url = 'http://example.com/endpoint';
$response = wp_remote_post( 
    $url, 
    array(
        'body'    => array('data' => 'example_data'),  // Передаваемые данные в теле запроса.
        'headers' => array(
            'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),  // Добавляем заголовок для базовой авторизации.
        ),
    )
);В этом примере отправляется POST запрос с базовой авторизацией. Логин и пароль кодируются в Base64 и добавляются в заголовок Authorization.
Пример 4: Передача данных в теле запроса
$endpoint = 'https://api.example.com/orders';
// Тело запроса, содержащие информацию о заказе
$body = array(
    'billing_name'  => 'Andy',
    'product_name'  => 'iPhone 14 Pro',
);
// Преобразование тела запроса в JSON
$body = json_encode( $body );
$options = array(
    'body'        => $body,              // Тело запроса в формате JSON.
    'headers'     => array(
        'Content-Type' => 'application/json',  // Заголовок для указания типа контента.
    ),
    'timeout'     => 60,                 // Лимит времени на выполнение запроса в 60 секунд.
    'redirection' => 5,                  // Максимальное количество редиректов - 5.
    'blocking'    => true,               // Запрос будет блокирующим.
    'httpversion' => '1.0',              // Используем версию HTTP 1.0.
    'sslverify'   => false,              // Отключаем проверку SSL сертификата.
);
$response = wp_remote_post( $endpoint, $options );
// Проверка на наличие ошибок
if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Ошибка: $error_message";
} else {
    echo 'Ответ: <pre>';
    print_r( $response );
    echo '</pre>';
}В этом примере отправляется POST запрос с JSON телом, содержащим данные о заказе. Заголовок Content-Type устанавливается как application/json.
Возвращаемое значение
Функция wp_remote_post() возвращает массив с данными ответа или объект WP_Error в случае ошибки. Пример структуры ответа:
Array
(
    [headers] => Array
        (
            [date] => Fri, 12 Jul 2024 12:00:00 GMT
            [server] => Apache
            [x-powered-by] => PHP/8.0
            [content-type] => application/json
        )
    [body] => {"success":true,"data":{"id":123}}
    [response] => Array
        (
            [code] => 200
            [message] => OK
        )
    [cookies] => Array
        (
        )
)Заключение
Использование wp_remote_post() позволяет легко отправлять HTTP POST запросы из вашего сайта на WordPress к внешним сервисам. С помощью гибких параметров вы можете настроить запрос под свои нужды, например, для отправки данных формы, взаимодействия с внешними API и многого другого.
