Статьи

Взгляд на API WordPress HTTP: практический пример wp_remote_post

В предыдущей статье мы рассмотрели предыдущие статьи, касающиеся запросов GET, встроенных средств PHP для выполнения запросов, и рассмотрели wp_remote_post API WordPress wp_remote_post вместе с аргументами, которые она предлагает.

В этой статье мы собираемся использовать wp_remote_post таким образом, чтобы мы могли увидеть его в действии. Помните, что это, как и wp_remote_post является частью HTTP API, и есть другие функции, которые стоит рассмотреть.

Но сейчас мы собираемся запустить wp_remote_post .

В частности, мы собираемся сделать следующее:

  • Когда страница загрузится, мы собираемся представить некоторую информацию в пользовательский скрипт
  • Скрипт изучит информацию и вернет ее на нашу страницу
  • Затем мы отобразим данные на странице

Конечно, это немного надуманный пример, но он даст нам опыт создания отдельного сценария PHP, который можно использовать для операций, запускаемых с помощью wp_remote_post .

В любом случае, для целей этого примера мы собираемся использовать коллекцию PHP $_SERVER чтобы регистрировать, когда пользователь представил свои предпочтения, а не требовать, чтобы они вошли в систему.

Наконец, исходный код будет доступен на GitHub и доступен в конце этой серии в следующей статье.

Однако сейчас давайте начнем с работы над плагином.


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

С этой целью многое из этого будет повторяться — пока ничего. Изменится бизнес-логика — или основная логика — плагина, так что следите за обновлениями.

В вашем каталоге wp-content / plugins создайте каталог с именем wp-remote-post-example, так как это будет именем нашего плагина. После этого все следующие файлы:

  • WP-удаленный пост-example.php
  • Класс-сор-дистанционный после example.php
  • WP-дистанционного receiver.php

В wp-remote-post-example.php добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
/**
 * Plugin Name: WP Remote Post Example
 * Plugin URI: http://tommcfarlin.com/wp-remote-post/
 * Description: An example plugin demonstrating how to use <code>wp_remote_post</code>.
 * Version: 1.0.0
 * Author: Tom McFarlin
 * Author URI: http://tommcfarlin.com
 * License: GPL-2.0+
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 */
 
// If this file is called directly, abort.
if ( ! defined( ‘WPINC’ ) ) {
    die;
}
 
require_once( plugin_dir_path( __FILE__ ) . ‘class-wp-remote-post.php’ );
WP_Remote_Post_Example::get_instance();
«

Затем в class-wp-remote-post-example.php добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class WP_Remote_Post_Example {
 
    protected static $instance = null;
 
    private function __construct() {
 
    }
 
    public static function get_instance() {
 
        if ( null == self::$instance ) {
            self::$instance = new self;
        }
 
        return self::$instance;
 
    }
 
}
«

Наконец, добавьте следующую строку в wp-remote-receiver.php :

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
echo «<h4>The Post Data</h4>»;
 
echo «<ul>»;
    foreach( $_POST as $key => $value ) {
        echo «<li>» .
    }
echo «</ul>»;
 
echo «<p>You can now save or disregard this information, </p>»;
«

Обратите внимание, что мы собираемся перебирать список данных $_POST и отображать их в виде списка, который облегчает чтение.

Обратите внимание, что ради пространства я оставляю комментарии к коду из этого конкретного плагина. Загружаемый файл на GitHub будет полностью документирован, а также будет доступен в следующем посте.

На этом этапе вы сможете активировать плагин; однако после активации ничего не произойдет, кроме как увидеть успешное сообщение.

Это хорошо!

На данный момент, давайте соберем информацию, которую мы хотим отправить как часть запроса. В частности, давайте получим следующее:

  • Уникальный адрес посетителя
  • Адрес домашней страницы блога
  • Адрес страницы, которая посещается

Добавьте следующую строку в конструктор (частная функция __construct , а не публичная функция get_instance ):

1
add_action( ‘the_content’, array( $this, ‘get_post_response’ ) );

Затем добавьте следующую функцию в класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
public function increment_visitor_count( $content ) {
 
    if ( is_single() ) {
 
        $unique_id = $_SERVER[‘REMOTE_ADDR’];
        $site_url = site_url();
        $page_url = get_permalink();
 
    }
 
    return $content;
 
}

Здесь мы берем уникальный идентификатор из индекса REMOTE_ADDR коллекции $_SERVER , мы берем URL сайта, как определено WordPress, и затем мы сохраняем постоянную ссылку текущей страницы в ее собственную переменную.

На данный момент мы готовы сделать запрос. Напомним из предыдущей статьи, что есть несколько частей информации, которые мы должны отправить вместе с запросом:

  • URL
  • Содержимое тела (которое мы будем использовать в качестве уникального идентификатора, адреса и просмотренной страницы).

Достаточно просто, правда?

Итак, давайте продолжим обновлять нашу функцию выше с помощью следующего блока кода, чтобы функция теперь выглядела так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public function increment_visitor_count( $content ) {
 
    if ( is_single() ) {
 
        $unique_id = $_SERVER[‘REMOTE_ADDR’];
        $site_url = site_url();
        $page_url = get_permalink();
 
        $url = plugins_url( ‘wp-remote-post-example/wp-remote-receiver.php’ );
 
        $response = wp_remote_post(
            $url,
            array(
                ‘body’ => array(
                    ‘unique-id’ => $unique_id,
                    ‘address’ => $site_url,
                    ‘page-viewed’ => $page_url
                )
            )
        );
 
    }
 
    return $content;
 
}

На этом этапе вы сможете перезагрузить страницу, хотя не обязательно, чтобы что-то произошло.

Даже все равно, ничего сложного, правда?

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

Для этого нам нужно сначала проверить, существует ли ошибка, а затем показать сообщение, если это так; в противном случае мы отобразим результаты запроса на публикацию.

Добавьте следующее условие к функции выше непосредственно под вызовом wp_remote_post :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
if ( is_wp_error( $response ) ) {
 
    $html = ‘<div id=»post-error»>’;
        $html .= __( ‘There was a problem retrieving the response from the server.’, ‘wprp-example’ );
    $html .= ‘</div><!— /#post-error —>’;
 
}
else {
 
    $html = ‘<div id=»post-success»>’;
        $html .= ‘<p>’ .
        $html .= ‘<p id=»response-data»>’ .
    $html .= ‘</div><!— /#post-error —>’;
 
}
 
$content .= $html;

Обратите внимание, что мы решили добавить немного HTML на основе ответа, который будет отображаться внизу поста.


На данный момент текущая рабочая версия плагина должна выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
class WP_Remote_Post_Example {
 
    protected static $instance = null;
 
    private function __construct() {
 
        add_action( ‘the_content’, array( $this, ‘get_post_response’ ) );
 
    }
 
    public static function get_instance() {
 
        if ( null == self::$instance ) {
            self::$instance = new self;
        }
 
        return self::$instance;
 
    }
 
    public function get_post_response( $content ) {
 
        if ( is_single() ) {
 
            $unique_id = $_SERVER[‘REMOTE_ADDR’];
            $site_url = site_url();
            $page_url = get_permalink();
 
            $url = plugins_url( ‘wp-remote-post-example/wp-remote-receiver.php’ );
 
            $response = wp_remote_post(
                $url,
                array(
                    ‘body’ => array(
                        ‘unique-id’ => $unique_id,
                        ‘address’ => $site_url,
                        ‘page-viewed’ => $page_url
                    )
                )
            );
 
            if ( is_wp_error( $response ) ) {
 
                $html = ‘<div id=»post-error»>’;
                    $html .= __( ‘There was a problem retrieving the response from the server.’, ‘wprp-example’ );
                $html .= ‘</div><!— /#post-error —>’;
 
            }
            else {
 
                $html = ‘<div id=»post-success»>’;
                    $html .= ‘<p>’ .
                    $html .= ‘<p id=»response-data»>’ .
                $html .= ‘</div><!— /#post-error —>’;
 
            }
 
            $content .= $html;
 
        }
 
        return $content;
 
    }
 
}

В следующем и последнем посте этой серии мы будем работать над тем, чтобы информация, добавленная в конец поста, выглядела немного более аккуратно благодаря использованию LESS для CSS, просто чтобы получить некоторый опыт в этом и продолжать совершенствовать как выглядит плагин

Мы также позаботимся о том, чтобы плагин был полностью документирован и доступен на GitHub для дальнейшего просмотра.

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