Статьи

Отображение информации о плагине WordPress.org на вашем сайте

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

В этом уроке мы приведем теорию в действие, чтобы создать простой плагин, который позволит нам отображать детали любого плагина, размещенного на WordPress.org на нашем веб-сайте WordPress, используя шорткоды.


Я предполагаю, что вы являетесь разработчиком плагинов и знаете основы, но если сомневаетесь, я предлагаю прочитать следующие две статьи:

С помощью этого плагина мы хотим создать шорткод, такой как [mpi slug='my-plugin-information' field='version'] который может принимать два атрибута: «slug» и «field», затем на основе этого мы затем получаем и отображать информацию о любом плагине, размещенном в репозитории WordPress.org.

Давайте начнем с создания папки my-plugin-information в вашем каталоге wp-content / plugins . Внутри него создайте файл с именем my-plugin-info.php и вставьте в него приведенный ниже код:

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
<?php
/*
Plugin Name: My Plugin Info
Plugin URI: http://myplugininfo.com
Description: Communicate with WordPress.org Plugins API to retrive your Plugin Information
Version: 0.1
Author: Harish
Author Email: [email protected]
License: GPL3
*/
if ( ! defined( ‘ABSPATH’ ) ) exit;
 
if ( ! class_exists( ‘DOT_MyPluginInfo’ ) )
{
 
    class DOT_MyPluginInfo {
 
        /**
         * Constructor
         */
        function __construct() {
 
            //Hook up to the init action
            add_action( ‘init’, array( &$this, ‘init_my_plugin_info’ ) );
 
        }
 
        /**
         * Runs when the plugin is initialized
         */
        function init_my_plugin_info() {
 
            // Register the shortcode [mpi slug=’my-plugin-info’ field=’version’]
            add_shortcode( ‘mpi’, array( &$this, ‘render_mpi’ ) );
 
        }
 
        function render_mpi($atts) {
 
        }
 
    } // end class
 
    new DOT_MyPluginInfo();
}
?>

В приведенном выше коде мы создали и инициализировали наш плагин класса DOT_MyPluginInfo . Внутри него находятся общие блоки любого плагина, например, __construct() .

Функция init_my_plugin_info подключена к действию init поэтому она запускается после загрузки WordPress, но до отправки любых заголовков. Внутри функции init_my_plugin_info мы зарегистрировали наш шорткод с add_shortcode функции add_shortcode .

Примечание. Чтобы узнать больше о add_shortcode , ознакомьтесь с Кодексом .

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


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

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

1
Downloaded [mpi slug=’my-plugin-information’ field=’downloaded’] times.

Используя add_shortcode мы зарегистрировали наш шорткод, чтобы каждый раз, когда add_shortcode в содержимом записи, для его обработки render_mpi() функция render_mpi() . Отныне остальная часть кода будет помещена в эту функцию для обработки нашего шорткода.

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

1
2
3
4
5
// get our variable from $atts
extract( shortcode_atts( array(
    ‘slug’ => », //foo is a default value
    ‘field’ => »
), $atts ) );

Это извлекает два атрибута «slug» и «field», если они предоставлены. Прежде чем идти вперед, мы сначала проверяем, существуют ли значения для «slug» и «field», а если нет, то мы прекращаем обработку дальше.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/**
 * Check if slug exists
 */
if ( ! $slug ) {
    return false;
}
 
/**
 * Check if field exists
 * Return value based on the field attribute
 */
if ( ! $field ) {
    return false;
} else {
 
} // $field check

Приведенный выше код проверит, существует ли «slug», а если нет, то вернет false. Если «slug» существует, он перейдет к проверке атрибута «field». Поскольку мы только создаем шорткод для отображения определенной части информации о плагине, проверка того, существуют ли оба атрибута, перед дальнейшей обработкой сохранит ненужные вызовы API плагинов WordPress.org.

Теперь, если значения для атрибутов «slug» и «field» предоставлены в шорткоде, мы продолжим работу, сначала очистив оба значения.

1
2
3
// Sanitize attributes
$slug = sanitize_title( $slug );
$field = sanitize_title( $field );

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

Но что, если плагин обновится и мы продолжим показывать старые данные? Чтобы разобраться в этом, самый быстрый вариант — сохранить данные отдельных плагинов с помощью API-интерфейса Transient и установить дату окончания срока действия данных.

Другая проблема может возникнуть, если у вас есть шорткоды, которые получают данные о различных плагинах. Если мы храним их с одним временным именем, результат может быть неожиданным. Для решения этой проблемы мы присваиваем уникальное имя сохраненным переходным процессам с помощью атрибута «slug».

  • Сохранить информацию о каждом плагине отдельно
  • Делать меньше запросов на WordPress.org
  • Чтобы загружать данные быстрее, обслуживая их прямо с вашего собственного сайта

Давайте сначала $mpi_transient_name переменную $mpi_transient_name чтобы сохранить уникальные временные имена на основе атрибута «slug».

1
2
// Create a empty array with variable name different based on plugin slug
$mpi_transient_name = ‘mpi-‘ .

Далее мы проверяем, существует ли переходный процесс:

1
2
3
4
/**
 * Check if transient with the plugin data exists
 */
 $mpi_info = get_transient( $mpi_transient_name );

Если переходный процесс существует, мы затем переходим к отображению данных на основе атрибута «field» или используем plugins_api для подключения к WordPress.org и запрашиваем информацию о плагине.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
if ( empty( $mpi_info ) ) {
 
    /**
     * Connect to WordPress.org using plugins_api
     * About plugins_api —
     * http://wp.tutsplus.com/tutorials/plugins/communicating-with-the-wordpress-org-plugin-api/
     */
    require_once( ABSPATH . ‘wp-admin/includes/plugin-install.php’ );
    $mpi_info = plugins_api( ‘plugin_information’, array( ‘slug’ => $slug ) );
 
    // Check for errors with the data returned from WordPress.org
    if ( ! $mpi_info or is_wp_error( $mpi_info ) ) {
        return false;
    }
 
    // Set a transient with the plugin data
    // Use Options API with auto update cron job in next version.
    set_transient( $mpi_transient_name, $mpi_info, 1 * HOUR_IN_SECONDS );
 
}

В приведенном выше коде мы сделали три вещи:

  1. Мы подключились к WordPress.org и запросили информацию о плагине. Затем запрос сохраняется в переменной с именем $mpi_info
  2. Затем мы делаем проверку ошибок, чтобы убедиться, что данные были возвращены без ошибок
  3. Наконец, мы создали новый переходный процесс с датой истечения одного часа

Теперь, если значение атрибута slug было « my-plugin-information », тогда имя переходного процесса, в котором хранится информация о плагине, было бы « mpi-my-plugin-information ».

Примечание. Чтобы узнать больше о plugins_api обратитесь к первой статье этой серии, показанной в верхней части этого поста.

Последний шаг включает в себя возврат конкретной информации на основе значения атрибута «field». Для этого мы просто используем индивидуальные проверки.

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
if ( $field == «downloaded» ) {
    return $mpi_info->downloaded;
}
 
if ( $field == «name» ) {
    return $mpi_info->name;
}
 
if ( $field == «slug» ) {
    return $mpi_info->slug;
}
 
if ( $field == «version» ) {
    return $mpi_info->version;
}
 
if ( $field == «author» ) {
    return $mpi_info->author;
}
 
if ( $field == «author_profile» ) {
    return $mpi_info->author_profile;
}
 
if ( $field == «last_updated» ) {
    return $mpi_info->last_updated;
}
 
if ( $field == «download_link» ) {
    return $mpi_info->download_link;
}

Полный код плагина:

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
/*
Plugin Name: My Plugin Information
Plugin URI: http://wp.tutsplus.com
Description: Communicate with WordPress.org Plugins API to retrive your Plugin Information
Version: 0.1.1
Author: Harish
Author Email: [email protected]
License:
 
  Copyright 2013 Harish
 
  This program is free software;
  it under the terms of the GNU General Public License, version 3, as
  published by the Free Software Foundation.
 
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY;
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  GNU General Public License for more details.
 
  You should have received a copy of the GNU General Public License
  along with this program;
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
*/
if ( ! defined( ‘ABSPATH’ ) ) exit;
 
if ( ! class_exists( ‘DOT_MyPluginInfo’ ) )
{
 
    class DOT_MyPluginInfo {
 
        /**
         * Constructor
         */
        function __construct() {
 
            //Hook up to the init action
            add_action( ‘init’, array( &$this, ‘init_my_plugin_info’ ) );
 
        }
 
        /**
         * Runs when the plugin is initialized
         */
        function init_my_plugin_info() {
 
            // Register the shortcode [mpi slug=’my-plugin-info’ field=’version’]
            add_shortcode( ‘mpi’, array( &$this, ‘render_mpi’ ) );
 
        }
 
        function render_mpi($atts) {
 
            // get our variable from $atts
            extract(shortcode_atts(array(
                ‘slug’ => », //foo is a default value
                ‘field’ => »
            ), $atts));
 
            /**
             * Check if slug exists
             */
            if ( ! $slug ) {
                return false;
            }
 
            /**
             * Check if field exists
             * Return value based on the field attribute
             */
            if ( ! $field ) {
 
                return false;
 
            } else {
 
                // Sanitize attributes
                $slug = sanitize_title( $slug );
                $field = sanitize_title( $field );
 
                // Create a empty array with variable name different based on plugin slug
                $mpi_transient_name = ‘mpi’ .
 
                /**
                 * Check if transient with the plugin data exists
                 */
                $mpi_info = get_transient( $mpi_transient_name );
 
                if ( empty( $mpi_info ) ) {
 
                    /**
                     * Connect to WordPress.org using plugins_api
                     * About plugins_api —
                     * http://wp.tutsplus.com/tutorials/plugins/communicating-with-the-wordpress-org-plugin-api/
                     */
                    require_once( ABSPATH . ‘wp-admin/includes/plugin-install.php’ );
                    $mpi_info = plugins_api( ‘plugin_information’, array( ‘slug’ => $slug ) );
 
                    // Check for errors with the data returned from WordPress.org
                    if ( ! $mpi_info or is_wp_error( $mpi_info ) ) {
                        return false;
                    }
 
                    // Set a transient with the plugin data
                    // Use Options API with auto update cron job in next version.
                    set_transient( $mpi_transient_name, $mpi_info, 1 * HOUR_IN_SECONDS );
 
                }
 
                if ( $field == «downloaded» ) {
                    return $mpi_info->downloaded;
                }
 
                if ( $field == «name» ) {
                    return $mpi_info->name;
                }
 
                if ( $field == «slug» ) {
                    return $mpi_info->slug;
                }
 
                if ( $field == «version» ) {
                    return $mpi_info->version;
                }
 
                if ( $field == «author» ) {
                    return $mpi_info->author;
                }
 
                if ( $field == «author_profile» ) {
                    return $mpi_info->author_profile;
                }
 
                if ( $field == «last_updated» ) {
                    return $mpi_info->last_updated;
                }
 
                if ( $field == «download_link» ) {
                    return $mpi_info->download_link;
                }
 
            } // $field check
 
        } // render_mpi()
 
    } // end class
    new DOT_MyPluginInfo();
 
}
 
?>

Этот код плагина доступен на GitHub, вы также можете скачать его с WordPress.org


Теперь вы можете просто зайти в свой редактор сообщений и добавить шорткод, например:

1
Downloaded &#91;mpi slug=’my-plugin-information’ field=’downloaded’&#93;

И это будет отображать:

1
Downloaded 10 times.

Заменив значение атрибута «field», вы можете отобразить различную информацию, такую ​​как:

  • Имя плагина: [mpi slug='my-plugin-information' field='name']
  • Версия плагина: [mpi slug='my-plugin-information' field='version']
  • Плагин Slug: [mpi slug='my-plugin-information' field='slug']
  • Автор плагина (возвращает имя и ссылку): [mpi slug='my-plugin-information' field='author']
  • Профиль автора (возвращает адрес профиля): [mpi slug='my-plugin-information' field='author_profile']
  • Последнее обновление: [mpi slug='my-plugin-information' field='last_updated']
  • Ссылка для скачивания: [mpi slug='my-plugin-information' field='download_link']

Для простоты я использовал переходные процессы для сохранения информации о плагине. Однако, переходные процессы никогда не предназначались для сохранения важных данных. Альтернативный метод — сохранить данные плагина либо с помощью API параметров, add_options() , либо в качестве мета-поста, а затем запланировать задачу cron для ежечасного обновления данных.


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

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