Как получить HTTP POST в WordPress?

22 янв. 2017 г., 09:32:56
Просмотры: 26.1K
Голосов: 10

Как мне отслеживать и получать HTTP POST от сторонних сервисов в WordPress, чтобы я мог обработать данные из этого POST запроса внутри WordPress?

Ищу не конкретный код, а методологию, с помощью которой WordPress может получать такие HTTP POST запросы.

6
Комментарии

О, я думаю, вы сможете. Кто-то здесь знает как :)

James James
22 янв. 2017 г. 09:42:04

Если вы считаете, что это возможно, то отредактируйте вопрос и добавьте соответствующие ссылки

Mark Kaplun Mark Kaplun
22 янв. 2017 г. 09:48:54

Давайте посмотрим, ответят ли другие, хорошо? Я уже использую плагин, который получает мгновенные уведомления о платежах от PayPal в WordPress и позволяет мне делать с этими данными что угодно. Так что я знаю, что это возможно. Я просто ищу конструктивное направление здесь. Как говорил мой отец: "Не могу — никогда не мог. Могу — всегда сможет."

James James
22 янв. 2017 г. 09:56:50

Хм, кажется, я неправильно понял вопрос... но ни один из ответов на самом деле не является правильным способом для WordPress 4.4 и выше

Mark Kaplun Mark Kaplun
22 янв. 2017 г. 12:37:07

Так какой же способ правильный?

James James
22 янв. 2017 г. 12:38:00
Показать остальные 1 комментариев
Все ответы на вопрос 4
1

Легко! У вас есть несколько вариантов для этого.

Самый простой, но менее безопасный - создать новый PHP-файл в корневой папке WordPress. Допустим, мы назовем его get_post.php и добавим в него функционал WordPress.

Вот так:

<?php 
    require_once('wp-load.php'); // добавляем функционал WordPress
    $post = $_POST;

    if ( $something ) // проверка безопасности
    update_post_meta( $post['post_id'], 'post_data', $post );
?>

Ссылка на API будет: yourdomain.com/get_posts.php

Другой вариант - создать новый шаблон страницы в директории вашей темы. Затем создать страницу с этим шаблоном через панель управления WordPress.

<?php 
    /* Template Name: API Шаблон */ 

    if ( ! defined( ‘ABSPATH’ ) ) {
        exit;
    }

    $post = $_POST;

    update_post_meta( $post['post_id'], 'post_data', $post );
?>

Ссылка на API будет: yourdomain.com/newly-created-page-permalink.

22 янв. 2017 г. 10:19:11
Комментарии

Я считаю, что это требует санитизации и может быть уязвимым?

Oliver M Grech Oliver M Grech
30 июн. 2020 г. 01:32:00
0

Я хотел бы привести пример к ответу @Mark Kaplun. Вы можете зарегистрировать конечную точку для обработки ваших HTTP POST запросов, используя register_rest_route следующим образом:

/** Сначала создаем функцию для обработки запроса */
function process_my_request(WP_REST_Request $request)
{
   $request_body = $request->get_body_params();
   if(update_post_meta( $request_body['post_id'], 'post_data', $request_body ))
   {
      $response = new WP_REST_Response(array('message'=>'Успешно'));
      $response->set_status(200);
      return $response;
   }
   else{
        return new WP_Error('invalid_request', 'Что-то пошло не так', array('status'=>403));
   }
}

/** Затем создаем функцию регистрации маршрута */
function register_my_route(){
   register_rest_route('myplugin/v1', '/myroute', array(
        'methods'=>'POST',
        'callback'=>'process_my_request',
        'permission_callback'=>'some_auth_function'
   ));
}
add_action('rest_api_init', 'register_my_route');

После того как вы это сделали, теперь вы можете отправлять свои запросы по следующему пути

site_url('wp-json/myplugin/v1/myroute');
9 февр. 2021 г. 06:31:53
1

Начиная с версии 4.4 и выше, WordPress имеет официальную конечную точку для доступа типа "API" - wp-json, которую вы можете расширить, определив свою собственную точку расширения и обработчик с помощью register_rest_route. Я никогда не пробовал отправлять не-JSON полезную нагрузку таким способом, но предполагаю, что это должно быть возможно, или ваш фронтенд может легко закодировать её в JSON.

Преимущество перед другими решениями здесь в том, что это позволяет WordPress понимать, что запрос является API-запросом, а не фронтенд-запросом.

(в более старых версиях вы могли бы использовать правила перезаписи... но это слишком грязно, чтобы даже упоминать)

22 янв. 2017 г. 12:48:53
Комментарии

Ссылка на руководство по register_rest_route https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/

OctaviaLo OctaviaLo
24 февр. 2020 г. 18:32:17
2

Вам следует начать с создания нового шаблона страницы на основе уже имеющегося в теме шаблоне (отредактируйте шаблон, измените его название в верхней части страницы и сохраните как отдельный PHP-файл).

Затем добавьте PHP-код для обработки HTTP POST-запроса в новый файл.

Последний шаг — перейти в админ-панель и создать новую страницу, используя новый шаблон.

22 янв. 2017 г. 10:02:13
Комментарии

Я обдумываю то, что вы написали... значит, новая страница затем "прослушивает" HTTP POST запрос извне WordPress?

James James
22 янв. 2017 г. 10:06:46

Вы должны отправить HTTP POST запрос со стороннего веб-сайта на новую страницу, которую вы создали, и обработать значения внутри созданного php-файла. HTTP POST запрос должен отправляться не на php-файл напрямую, а на URL страницы, созданной в админ-панели

Cdorob Cdorob
22 янв. 2017 г. 10:19:38