Статьи

Создание плагинов “Любимые плагины”

Теперь, когда есть возможность добавлять любимые плагины на WordPress.org, разве не было бы здорово иметь возможность сделать избранное избранным для быстрой установки из панели управления WordPress? Давайте создадим плагин, чтобы сделать это!


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

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

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

Я написал плагин под названием « Любимые плагины », и сейчас я собираюсь помочь вам в его создании.

Примечание. Эта функциональность фактически станет частью WordPress, когда в декабре выйдет версия 3.5. Мы создаем этот плагин как упражнение по созданию плагинов и используем API плагинов WordPress.org.


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

Итак, вот что собирается сделать наш плагин:

  • Добавьте новую вкладку под названием «Избранное» на экран «Установка плагинов» в админке WordPress.
  • На новой вкладке у нас будет форма для ввода имени пользователя WordPress.org для использования
  • Если у нас есть имя пользователя, мы просим WordPress.org о избранных для этого пользователя
  • Ниже формы мы отображаем таблицу, показывающую все любимые плагины для предоставленного пользователя (если есть)
  • Мы также запомним введенное имя пользователя, чтобы все было удобно. В конце концов, это то, что этот плагин все о!

Теперь давайте приведем наши файлы в порядок. Создайте себе каталог в / wp-content / plugins / под названием wptuts-favourite-plugins . Внутри этого нового каталога создайте себе файл с именем wptuts-favourite-plugins.php . Затем откройте файл и, как всегда при разработке плагина, добавьте заголовок плагина следующим образом:

01
02
03
04
05
06
07
08
09
10
<?php
/*
Plugin Name: Wptuts+ Favorite Plugins
Plugin URI: http://wp.tutsplus.com/tutorials/plugins/building-the-favorite-plugins-plugin/
Description: Quickly and easily access and install your favorited plugins from WordPress.org, right from your dashboard.
Version: 0.7
Author: Japh
Author URI: http://wp.tutsplus.com/author/japh
License: GPL2
*/
Плагин "Любимые плагины"

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

Вот заглушка класса и методы, которые нам понадобятся:

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
class Wptuts_Favorite_Plugins {
 
    public $username = null;
 
    function __construct() {
        // The constructor is used to kick things off, as it’s run when the object is created
    }
 
    function add_favorites_tab( $tabs ) {
        // This is where we put code to add a favorites tab to the.
        return $tabs;
    }
 
    function get_favorites() {
        // Someone wants to see what’s on the favorites tab, so we’d better get some stuff to show them
    }
 
    function install_plugins_favorites() {
        // Output the form to accept the WordPress.org username
    }
 
}
 
function wptuts_execute() {
    if ( (float) get_bloginfo( ‘version’ ) < 3.5 ) {
        // Kick everything into action…
        $wptuts_favorite_plugins = new Wptuts_Favorite_Plugins();
    }
}
add_action( ‘admin_init’, ‘wptuts_execute’ );

Это оно! Это все функциональные возможности, которые мы встраиваем в эту тему. Поскольку мы создаем для администратора WordPress, мы пытаемся в полной мере использовать все, что для нас сделано.

Кроме того, обратите внимание, что я завернул строку инициализации в оператор if чтобы остановить плагин, работающий на WordPress 3.5+, который в любом случае будет иметь эту функцию.


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

Во-первых, нам нужно добавить следующий код в метод __construct нашего класса:

1
add_filter( ‘install_plugins_tabs’, array( $this, ‘add_favorites_tab’ ) );

Здесь мы подключаемся к фильтру WordPress ” install_plugins_tab ‘, который является именно тем, что нам нужно, чтобы добавить вкладку.

Что делает этот array( $this, 'function_name' ) ? Как вы, возможно, знаете, при использовании объектно-ориентированного программирования $this зарезервированное слово используется для ссылки на текущий объект. При использовании хуков в WordPress вторым параметром может быть строка с именем используемой функции, или при использовании объекта это может быть массив с объектом и конкретным методом объекта, который нужно использовать.

Подробнее об этом читайте в статье «Избегание коллизий имен функций в кодексе WordPress».

Затем мы делаем метод add_favorites_tab нашего класса следующим образом:

1
2
3
4
5
6
7
<?php
    function add_favorites_tab( $tabs ) {
        // This is where we put code to add a favorites tab to the.
        $tabs[‘favorites’] = __( ‘Favorites’ );
        return $tabs;
    }
?>

Это просто добавляет элемент в массив $tabs со значением ‘Favorites’, который будет отображаться как текст вкладки. Если вы перейдете к экрану «Установка плагинов» в своем администраторе WordPress, нажав «Плагины» -> «Добавить новый», вы увидите там вкладку «Избранное». Нажав сейчас, вы увидите прекрасную пустую вкладку. Давайте добавим кое-что на это.

Вкладка "Избранное"

Имейте в виду, что вкладка в конечном итоге находится на той же странице (‘ install_plugins ‘), что и другие вкладки, и эта страница на самом деле просто ждет, чтобы что-то сделать в зависимости от того, какая вкладка активна. В нем также есть хуки, использующие имя вкладки, такие как ‘ install_plugins_pre_{$tab} ‘ и ‘ install_plugins_{$tab} ‘, которые мы будем использовать.

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

1
add_action( ‘install_plugins_favorites’, array( $this, ‘install_plugins_favorites’ ), 10, 1 );

Действие install_plugins_{$tab} происходит в теле вкладки и ожидает два параметра. Второй параметр предназначен для текущей страницы в paginaton. Нам не нужна нумерация страниц для нашей формы, поэтому мы предоставляем функцию обратного вызова и приоритет по умолчанию, а затем указываем, что будем передавать только один параметр.

Теперь мы заполняем нашу функцию для вывода формы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
    function install_plugins_favorites() {
        // Output the form to accept the WordPress.org username
        $this->username = isset( $_REQUEST[‘user’] ) ?
        ?>
            <p class=”install-help”><?php _e( ‘If you have marked plugins as favorites on WordPress.org, you can browse them here.’ );
            <form method=”get” action=””>
                <input type=”hidden” name=”tab” value=”favorites” />
                <p>
                    <label for=”user”><?php _e( ‘Your WordPress.org username:’ );
                    <input type=”search” id=”user” name=”user” value=”<?php echo esc_attr( $this->username ); ?>” />
                    <input type=”submit” class=”button” value=”<?php esc_attr_e( ‘Get Favorites’ ); ?>” />
                </p>
            </form>
        <?php
    }
?>
Форма имени пользователя

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

Далее мы предоставляем текст, чтобы объяснить пользователям, для чего эта форма. В форме у нас есть скрытое поле для значения вкладки, поэтому при отправке мы возвращаемся на ту же вкладку. Остальное – поле ввода, поле имени пользователя и кнопка отправки.


Пользователи могут отправить форму со своим именем пользователя сейчас, но ничего не происходит … нам нужно сделать запрос к API плагина WordPress.org с именем пользователя, а затем отобразить результаты.

Снова нам нужно добавить строку в метод __construct нашего класса, чтобы добавить метод к действию WordPress. На этот раз это ловушка install_plugins_pre_{$tab} , которая запускается раньше при обработке страницы. Хорошее место для вызова API.

1
add_action( ‘install_plugins_pre_favorites’, array( $this, ‘get_favorites’ ) );

Я предполагаю, что если мы вызываем этот метод, нам лучше сделать его полезным:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function get_favorites() {
    // Someone wants to see what’s on the favorites tab, so we’d better get some stuff to show them
    global $wp_list_table;
 
    $this->username = isset( $_REQUEST[‘user’] ) ?
 
    if ( $this->username ) {
        $args = array( ‘user’ => $this->username );
        update_user_meta( get_current_user_id(), ‘wporg_favorites’, $this->username );
 
        $api = plugins_api( ‘query_plugins’, $args );
 
        $wp_list_table->items = $api->plugins;
        $wp_list_table->set_pagination_args(
            array(
                ‘total_items’ => $api->info[‘results’],
                ‘per_page’ => 24,
            )
        );
    } else {
        $args = false;
    }
}

Эта функция также проверяет, есть ли недавно отправленное имя пользователя, в противном случае возвращается к сохраненному. Затем мы проверяем, является ли имя пользователя пустым, потому что если это так, нет смысла делать запрос API. Если имя пользователя не было пустым, мы сначала обновляем мета-значение пользователя ключом ‘ wporg_favorites ‘, чтобы оно стало текущим именем пользователя.

Мы также установили переменную с именем $args в виде массива с ключом « user » и значением имени пользователя, для которого нужно найти избранное. Это передается в plugins_api() , которую мы затем, по существу, передаем возвращаемому значению в $wp_list_table , и также устанавливаем некоторые значения аргументов для этого. Мы устанавливаем total_items и per_page , что достаточно для того, что нам нужно.

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

Теперь, поскольку страница «Установка плагинов» уже готова и готова отобразить эти результаты, эта часть очень проста. Просто добавьте встроенную функцию WordPress display_plugins_table в действие install_plugins_{$tab} в нашем методе __construct , например так:

1
add_action( ‘install_plugins_favorites’, ‘display_plugins_table’);

Вуаля! Как по волшебству, у нас теперь есть довольно внушительная таблица, показывающая наши любимые плагины!

Таблица любимых плагинов

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

Это всего лишь вопрос добавления маленькой строки в метод __construct нашего класса:

1
$this->username = get_user_option( ‘wporg_favorites’ );

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

Поскольку мы до сих пор сохраняли его, но не использовали, даже просто обновив вкладку «Избранное», теперь будет использоваться последнее имя пользователя, которое вы указали в форме.

Итак, вот как должен выглядеть последний метод __construct :

01
02
03
04
05
06
07
08
09
10
function __construct() {
    // The constructor is used to kick things off, as it’s run when the object is created
 
    add_filter( ‘install_plugins_tabs’, array( $this, ‘add_favorites_tab’ ) );
    add_action( ‘install_plugins_favorites’, array( $this, ‘install_plugins_favorites’ ), 10, 1 );
    add_action( ‘install_plugins_pre_favorites’, array( $this, ‘get_favorites’ ) );
    add_action( ‘install_plugins_favorites’, ‘display_plugins_table’);
 
    $this->username = get_user_option( ‘wporg_favorites’ );
}

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

Всякий раз, когда вы работаете над проектами WordPress и добавляете функциональность администратора, думайте о принципе СУХОЙ: не повторяйте себя, или, в этом отношении, не повторяйте WordPress. Ищите возможности воспользоваться тем, что WordPress уже предоставляет для вас.

Дайте мне знать, что вы думаете об этом плагине в комментариях. Эта же функция появилась в WordPress в версии 3.5. Как вы думаете, она добавляет полезности функциональности WordPress.org?