Статьи

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

В последней статье этой серии мы рассмотрели функции PHP, доступные для выполнения удаленных запросов.

В частности, мы рассмотрели:

  • file_get_contents
  • cURL

И мы также обсудили функцию WordPress wp_remote_get .

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

  1. Количество подписчиков у нас в твиттере
  2. Наш последний твит

Приятно то, что нам не нужно использовать какие-либо механизмы OAuth или аутентификации, и нам нужно только воспользоваться ответами Twitter и функциональностью PHP JSON.

Итак, в этой статье мы рассмотрим, как именно это сделать, а затем закончим серию обзоров всей информации, wp_remote_get возвращает wp_remote_get чтобы мы знали, как правильно обращаться с ней в будущей работе. ,


Как и во всех плагинах, первое, что нам нужно сделать, это создать каталог в нашем каталоге wp-content / plugins . Для целей этой демонстрации мы будем называть наш плагин Twitter Demo .

Итак, назовем каталог плагинов twitter-demo и связанный с ним файл плагина twitter-demo.php .

Демо Твиттера

Далее нам нужно пойти дальше и заглушить заголовок плагина, чтобы WordPress смог обнаружить файл плагина, поэтому давайте сделаем это сейчас.


Сначала поместите следующий код в заголовок файла twitter-demo.php :

01
02
03
04
05
06
07
08
09
10
<?php
/* Plugin Name: Twitter Demo
 * Plugin URI: http://example.com/twitter-demo/
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.
 * 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
 */

Обратите внимание, что мы не собираемся интернационализировать этот плагин. Мы затронули эту тему в другом посте, и это то, что выходит за рамки того, что мы пытаемся сделать в этой статье.

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

По крайней мере, пока.


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

Таким образом, вот что мы можем ожидать:

  • Внизу каждого поста мы будем показывать небольшое уведомление: «У меня есть X подписчиков в Twitter. Мой последний твит был Y.
  • Мы сделаем это только на одной странице поста, чтобы она не отображалась на главном указателе или страницах архива.

Конечно, показывать это в нижней части поста немного неприятно, но помните, что целью этого плагина является демонстрация того, как использовать wp_remote_get , как анализировать ответ из Twitter и как его отображать.

Мы гораздо меньше заботимся о том, где отображается контент.

Итак, давайте пойдем дальше и заглушим класс, который будет предоставлять эту функциональность.

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

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
/**
 * Plugin Name: Twitter Demo
 * Plugin URI: http://tommcfarlin.com/twitter-demo/
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.
 * 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
 */
 
class Twitter_Demo {
 
    /**
     * Instance of this class.
     *
     * @var Twitter_Demo
     */
    private static $instance;
 
    /**
     * Initializes the plugin so that the Twitter information is appended to the end of a single post.
     * Note that this constructor relies on the Singleton Pattern
     *
     * @access private
     */
    private function __construct() {
 
    } // end constructor
 
    /**
     * Creates an instance of this class
     *
     * @access public
     * @return Twitter_Demo An instance of this class
     */
    public function get_instance() {
 
    } // end get_instance
 
    /**
     * Appends a message to the bottom of a single post including the number of followers and the last Tweet.
     *
     * @access public
     * @param $content The post content
     * @return $content The post content with the Twitter information appended to it.
     */
    public function display_twitter_information( $content ) {
 
    } // end display_twitter_information
 
    /**
     * Attempts to request the specified user’s JSON feed from Twitter
     *
     * @access public
     * @param $username The username for the JSON feed we’re attempting to retrieve
     * @return $json The user’s JSON feed or null of the request failed
     */
    private function make_twitter_request( $username ) {
 
    } // end make_twitter_request
 
    /**
     * Retrieves the number of followers from the JSON feed
     *
     * @access private
     * @param $json The user’s JSON feed
     * @return The number of followers for the user.
     */
    private function get_follower_count( $json ) {
 
    } // end get_follower_count
 
    /**
     * Retrieves the last tweet from the user’s JSON feed
     *
     * @access private
     * @param $json The user’s JSON feed
     * @return The last tweet from the user’s feed.
     */
    private function get_last_tweet( $json ) {
 
    } // end get_last_tweet
 
} // end class
 
// Trigger the plugin
Twitter_Demo::get_instance();

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

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

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

  • В конструктор мы добавим действие для добавления нашей информации Twitter в один пост
  • display_twitter_information будет использоваться для визуализации сообщения в нижней части поста.
  • make_twitter_request фактически запросит и вернет данные из Twitter (или ноль, если запрос не удастся)
  • get_follower_count вернет количество подписчиков для указанного пользователя (или -1, если есть проблема)
  • get_last_tweet вернет последний твит от пользователя или сообщение, если плагин не удастся

Достаточно ясно? На данный момент, давайте работать над запросом информации из Twitter, чтобы мы могли обработать ее.

Во-первых, давайте make_twitter_request функцию make_twitter_request следующим кодом. Обратите внимание, что я объясню это после кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
private function make_twitter_request( $username ) {
 
    $response = wp_remote_get( ‘https://twitter.com/users/’ . $username . ‘.json’ );
    try {
 
        // Note that we decode the body’s response since it’s the actual JSON feed
        $json = json_decode( $response[‘body’] );
 
    } catch ( Exception $ex ) {
        $json = null;
    } // end try/catch
 
    return $json;
 
}

В первой строке кода мы используем wp_remote_get для выполнения нашего запроса. Обратите внимание, что мы используем параметр $username для получения пользовательского фида JSON. Обратите внимание, как просто сделать запрос, используя функцию wp_remote_get .

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

Далее, обратите внимание, что мы завершим код в try/catch . Это связано с тем, что запрос в Twitter может быть неудачным. Если это не json_decode , то мы будем использовать PHP-функцию json_decode для декодирования тела ответа; в противном случае мы установим ответ равным null .

Это облегчит вызов вызывающей функции.

Прежде чем мы пойдем дальше, важно отметить, что здесь есть небольшой момент: обратите внимание, что мы декодируем ключ ‘ body ‘ возвращаемого массива $response . Для тех из вас, кто более заинтересован в этом, мы подробно рассмотрим ответ, wp_remote_get при использовании wp_remote_get в следующей статье.

А пока просто отметьте, что индекс body массива $response — это всего лишь одна часть информации, которую мы имеем в наличии.

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

Опять же, вот код, после которого я буду объяснять, что именно он делает:

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
public function display_twitter_information( $content ) {
 
    // If we’re on a single post or page…
    if ( is_single() ) {
 
        // …attempt to make a response to twitter.
        if ( null == ( $json_response = $this->make_twitter_request( ‘wptuts’ ) ) ) {
 
            // …display a message that the request failed
            $html = ‘
<div id=»twitter-demo-content»>’;
 $html .= ‘There was a problem communicating with the Twitter API..’;
 $html .= ‘</div>
<!— /#twitter-demo-content —>’;
 
        // …otherwise, read the information provided by Twitter
        } else {
 
            $html = ‘
<div id=»twitter-demo-content»>’;
 $html .= ‘I have ‘ .
 $html .= ‘</div>
<!— /#twitter-demo-content —>’;
 
        } // end if/else
 
        $content .= $html;
 
    } // end if/else
 
    return $content;
 
}

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

Помните: эта функция будет вызываться во время действия the_content которое будет определено в нашем конструкторе, когда плагин будет полностью готов.

Таким образом, функция сначала проверяет, находимся ли мы в одном посте. Если нет, то он просто вернет содержимое; в противном случае он делает следующее:

  • Попытки сделать запрос в Twitter
  • Если запрос завершится неудачно, отобразится сообщение о том, что
  • В противном случае if распечатает сообщение с указанием количества подписчиков и последнего твита, оставленного человеком
  • Это добавит сообщение к содержанию сообщения

Важное примечание: в этой функции вы указываете имя пользователя, для которого вы хотите получить информацию. Например, обратите внимание, что я пытаюсь получить информацию для @WPTuts , вызывая $this->make_twitter_request('wptuts') .

На данный момент мы готовы прочитать информацию и объединить строки в наше сообщение для отображения пользователю. Мы сделаем это с помощью метода get_follower_count и get_last_tweet .

Поскольку эти методы очень похожи, мы рассмотрим оба из них, а затем объясню их после кода:

1
2
3
4
5
6
7
private function get_follower_count( $json ) {
    return ( -1 < $json->followers_count ) ?
} // end get_follower_count
 
private function get_last_tweet( $json ) {
    return ( 0 < strlen( $json->status->text ) ) ?
} // end get_last_tweet

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

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

Это позволяет нам защищать код от чего-то, что может работать неправильно при обработке данных.


Как и было обещано, вот полный исходный код с соответствующей документацией:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
/**
 * Plugin Name: Twitter Demo
 * Plugin URI: http://example.com/twitter-demo/
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.
 * 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
 */
class Twitter_Demo {
    /**
     * Instance of this class.
     *
     * @var Twitter_Demo
     */
    private static $instance;
 
    /**
     * Initializes the plugin so that the Twitter information is appended to the end of a single post.
     * Note that this constructor relies on the Singleton Pattern
     *
     * @access private
     */
    private function __construct() {
        add_action( ‘the_content’, array( $this, ‘display_twitter_information’ ) );
    } // end constructor
 
    /**
     * Creates an instance of this class
     *
     * @access public
     * @return Twitter_Demo An instance of this class
     */
    public function get_instance() {
        if ( null == self::$instance ) {
            self::$instance = new self;
        }
        return self::$instance;
    } // end get_instance
 
    /**
     * Appends a message to the bottom of a single post including the number of followers and the last Tweet.
     *
     * @access public
     * @param $content The post content
     * @return $content The post content with the Twitter information appended to it.
     */
    public function display_twitter_information( $content ) {
        // If we’re on a single post or page…
        if ( is_single() ) {
            // …attempt to make a response to twitter.
            if ( null == ( $json_response = $this—>make_twitter_request(‘wptuts’) ) ) {
 
                // …display a message that the request failed
                $html = ‘
<div id=»twitter-demo-content»>’;
 $html .= ‘There was a problem communicating with the Twitter API..’;
 $html .= ‘</div>
<!— /#twitter-demo-content —>’;
 
                // …otherwise, read the information provided by Twitter
            } else {
 
                $html = ‘
<div id=»twitter-demo-content»>’;
 $html .= ‘I have ‘ .
 $html .= ‘</div>
<!— /#twitter-demo-content —>’;
 
            } // end if/else
 
            $content .= $html;
 
        } // end if/else
 
        return $content;
 
    } // end display_twitter_information
 
    /**
     * Attempts to request the specified user’s JSON feed from Twitter
     *
     * @access public
     * @param $username The username for the JSON feed we’re attempting to retrieve
     * @return $json The user’s JSON feed or null of the request failed
     */
    private function make_twitter_request( $username ) {
 
        $response = wp_remote_get( ‘https://twitter.com/users/’ . $username . ‘.json’ );
        try {
 
            // Note that we decode the body’s response since it’s the actual JSON feed
            $json = json_decode( $response[‘body’] );
 
        } catch ( Exception $ex ) {
            $json = null;
        } // end try/catch
 
        return $json;
 
    } // end make_twitter_request
 
    /**
     * Retrieves the number of followers from the JSON feed
     *
     * @access private
     * @param $json The user’s JSON feed
     * @return The number of followers for the user.
     */
    private function get_follower_count( $json ) {
        return ( -1 < $json->followers_count ) ?
    } // end get_follower_count
 
    /**
     * Retrieves the last tweet from the user’s JSON feed
     *
     * @access private
     * @param $json The user’s JSON feed
     * @return The last tweet from the user’s feed.
     */
    private function get_last_tweet( $json ) {
        return ( 0 < strlen( $json->status->text ) ) ?
    } // end get_last_tweet
 
} // end class
 
// Trigger the plugin
Twitter_Demo::get_instance();

Это на самом деле относительно просто, верно? На самом деле, комментариев на коде столько же, сколько строк реального кода, поэтому сам плагин очень маленький.


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

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