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 и многого другого.