Статьи

Использование HighCharts в WP-Admin

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

Хотя есть некоторые плагины, которые интегрируют Google Analytics с WordPress, но они излишни, если вы хотите получить только часть этих данных.

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


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

Мы подготовим наш основной плагин, добавим для него страницу в wp-admin, а затем поставим в очередь JavaScript нашего плагина только на этой странице. Затем мы передадим данные, которые мы получили, во внешний скрипт с помощью wp_localize_script . В свою очередь, скрипт будет отображать наши данные графически.

Статистика, которую мы планируем показать:

  1. Самые популярные посты
  2. Лучшие пять категорий по количеству постов
  3. Разбивка категорий по постам

По данным их сайта:

Highcharts — это библиотека диаграмм, написанная на чистом HTML5 / JavaScript и предлагающая интуитивно понятные интерактивные диаграммы для вашего веб-сайта или веб-приложения. В настоящее время Highcharts поддерживает типы линий, сплайнов, площадей, областей, столбцов, столбцов, столбчатых, круговых, угловых датчиков, диапазонов, областей, столбцов, пузырьков, прямоугольников, столбцов ошибок, воронок, водопадов и полярных диаграмм.

Вы можете взять себе копию с их сайта .

Тем не менее, давайте начнем работать над нашим плагином.


Сначала мы создадим каталог внутри нашей папки wp-content / plugins с именем « admin-charts ». Внутри этого давайте создадим исходную структуру каталогов для нашего плагина.

Скопируйте файл highcharts.js из каталога в ZIP-файле, который вы скачали с официального сайта, в папку js :

В корневом каталоге мы создадим файл index.php и внутри него добавим первоначальное объявление для нашего плагина:

01
02
03
04
05
06
07
08
09
10
11
<?php
/*
Plugin Name: Admin Charts
Plugin URI: http://dev.imbilal.com/wpadmincharts
Description: JavaScript charts for WordPress admin.
Version: 1.0
Author: Bilal Shahid
Author URI: http://www.imbilal.com
License: GPLv2 or later
*/
?>

Теперь, если вы зайдете в WP-Admin> Плагины, вы заметите, что там показывается плагин, но он пока не функционирует.

1

Мы также добавим несколько стилей внутри нашего admin_charts.css :

1
2
3
4
5
6
7
8
#admin_chart_form {
    margin: 30px 0;
}
 
#admin_chart_form label {
    display: inline-block;
    width: 250px;
}

Нашим следующим шагом будет добавление страницы для плагина внутри администратора, где мы будем выполнять все операции. Для этого мы будем использовать действие WordPress admin_menu . Это действие запускается после создания базовой структуры меню панели администратора и, следовательно, может использоваться для добавления дополнительных меню или подменю администратора. Основное использование заключается в следующем:

1
<?php add_action( ‘admin_menu’, ‘function_name’ );

Мы добавили бы функцию chart_add_admin_page в наш index.php и затем подключили ее к этому действию:

1
add_action( ‘admin_menu’, ‘chart_add_admin_page’ );

Внутри нашей функции chart_add_admin_page мы будем вызывать встроенную функцию WordPress add_plugins_page :

1
2
3
4
5
6
7
8
9
function chart_add_admin_page() {
    add_plugins_page(
        ‘Charts For WordPress’,
        ‘Admin Charts’,
        ‘administrator’,
        ‘admin-charts’,
        ‘render_admin_charts_page’
    );
}

Первый аргумент — это заголовок страницы, который будет отображаться в тегах <title></title> страницы. Второй аргумент — заголовок меню. Третий и четвертый аргументы — это пользовательская возможность и уникальный слаг для ссылки на это меню. Последний аргумент — это имя функции обратного вызова, которая будет использоваться для визуализации содержимого этой страницы.

Теперь, если вы активируете плагин и наводите курсор мыши на меню «Плагины», вы заметите, что мы успешно добавили меню для нашего плагина:

2

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

В нашем предыдущем вызове add_plugins_page мы ссылались на функцию обратного вызова render_admin_charts_page . Это функция, которую мы запланировали выводить весь контент, который мы хотим иметь на нашей странице. Итак, давайте напишем функцию.

Ниже функции chart_add_admin_page добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
function render_admin_charts_page() {
    ?>
    <div class=»wrap»>
        <h2>Admin Charts</h2>
        <form action=»#» method=»post» name=»admin_chart_form» id=»admin_chart_form»>
            <p>
                <label for=»chart_data_type»>What type of data do you want to show?</label>
                <select name=»chart_data_type» id=»chart_data_type»>
                    <option value=»chart_most_popular»>Most Popular Post</option>
                </select>
            </p>
            <input type=»submit» class=»button-primary» value=»Display Data» id=»show_chart» name=»show_chart» />
        </form>
        <div id=»chart-stats» class=»chart-container» style=»width:900px; height:500px;»></div>
    </div>
    <?php
}
?>

Мы просто добавляем сюда простой HTML. Мы добавили заголовок и форму внутри собственного CSS-класса WordPress « wrap ».

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

Наша страница сейчас обретает форму:

3
Совет: вы всегда должны пытаться интегрироваться с собственным интерфейсом WordPress. У нас есть замечательная серия Стивена Харриса на эту тему.

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

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

1
define( ‘ROOT’, plugin_dir_url( __FILE__ ) );

Теперь мы можем определить нашу функцию для регистрации наших скриптов и стилей:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
add_action( ‘admin_enqueue_scripts’, ‘chart_register_scripts’ );
function chart_register_scripts() {
    wp_register_script(
        ‘highCharts’,
        ROOT .
        array( ‘jquery’ ),
        ‘3.0’,
        true
    );
    wp_register_script(
        ‘adminCharts’,
        ROOT .
        array( ‘highCharts’ ),
        ‘1.0’,
        true
    );
    wp_register_style(
        ‘adminChartsStyles’,
        ROOT .
    );
}

Сначала мы зарегистрировали скрипт HighCharts, который мы скачали ранее. Мы дали ему ручку » highCharts «. Для следующего аргумента мы определили путь, где он существует.

Далее мы передали массив скриптов, от которых зависит наш скрипт, в данном случае это jQuery, поскольку мы будем манипулировать DOM через jQuery. Таким образом, нам не нужно беспокоиться о постановке в очередь jQuery, он будет поставлен в очередь автоматически всякий раз, когда мы ставим в highCharts скрипт highCharts .

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

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

По этой причине мы проверим условие, прежде чем ставить в очередь наши сценарии:

01
02
03
04
05
06
07
08
09
10
add_action( ‘admin_enqueue_scripts’, ‘chart_add_scripts’ );
function chart_add_scripts( $hook ) {
 
    if ( ‘plugins_page_admin-charts’ == $hook ) {
 
        wp_enqueue_style( ‘adminChartsStyles’ );
        wp_enqueue_script( ‘adminCharts’ );
 
    }
}

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

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


Мы хотим получить три типа данных:

  1. Самые популярные посты (столбчатая диаграмма)
  2. Лучшие пять категорий по количеству сообщений (столбчатая диаграмма)
  3. Разбивка категорий по постам (круговая диаграмма)

Для данных этого типа мы можем использовать класс WP_Query чтобы получить пять сообщений с наибольшим количеством комментариев. Класс WP_Query удобен, когда нам нужно извлекать сообщения на основе различных критериев. Используя этот класс, мы можем перечислять сообщения любым удобным для нас способом. Запрос на выборку постов с наибольшим количеством комментариев можно записать так:

1
2
3
4
5
6
7
8
$posts = new WP_Query(
    array(
        ‘post_type’ => ‘post’,
        ‘orderby’ => ‘comment_count’,
        ‘order’ => ‘DESC’,
        ‘posts_per_page’ => 5
    )
);

Теперь у нас есть пять постов с наибольшим количеством комментариев в виде объектов внутри массива $posts . Вы всегда можете вызвать переменную, чтобы увидеть, с чем вы работаете.

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

1
2
3
4
5
$data = array(
    ‘data_type’ => ‘chart_most_popular’,
    ‘chart_type’ => ‘column’,
    ‘post_data’ => $posts->posts
);

Мы можем передать эту переменную в JavaScript через wp_localize_script :

1
wp_localize_script( ‘adminCharts’, ‘data’, $data );

Первый аргумент в вызове функции — это дескриптор скрипта, в который нам нужно передать данные. Мы зарегистрировали этот скрипт ранее. Второй аргумент — это имя объекта, который будет доступен в JavaScript, а последний аргумент — это сами данные, которые нам нужно передать. Конечный index.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
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
90
91
92
93
94
<?php
/*
Plugin Name: Admin Charts
Plugin URI: http://dev.imbilal.com/wpadmincharts
Description: Javascript charts for wordpress admin.
Version: 1.0
Author: Bilal Shahid
Author URI: http://www.imbilal.com
License: GPLv2 or later
*/
 
/********************************* Adding some constants for later use *********************************/
define( ‘ROOT’, plugin_dir_url( __FILE__ ) );
 
/********************************* Adding the admin page for the plugin *********************************/
add_action( ‘admin_menu’, ‘chart_add_admin_page’ );
function chart_add_admin_page() {
    add_plugins_page(
        ‘Charts For WordPress’,
        ‘Admin Charts’,
        ‘administrator’,
        ‘admin-charts’,
        ‘render_admin_charts_page’
    );
}
 
function render_admin_charts_page() {
    ?>
    <div class=»wrap»>
        <h2>Admin Charts</h2>
        <form action=»#» method=»post» name=»admin_chart_form» id=»admin_chart_form»>
            <p>
                <label for=»chart_data_type»>What type of data do you want to show?</label>
                <select name=»chart_data_type» id=»chart_data_type»>
                    <option value=»chart_most_popular» <?php selected_option(‘chart_most_popular’);
                </select>
            </p>
            <input type=»submit» class=»button-primary» value=»Display Data» id=»show_chart» name=»show_chart»>
        </form>
        <div id=»chart-stats» class=»chart-container» style=»width:900px; height:500px;»></div>
    </div>
    <?php
}
 
/********************************* Adding necessary scripts/styles needed *********************************/
add_action( ‘admin_enqueue_scripts’, ‘chart_register_scripts’ );
function chart_register_scripts() {
    wp_register_script(
        ‘highCharts’,
        ROOT .
        array( ‘jquery’ ),
        ‘3.0’,
        true
    );
    wp_register_script(
        ‘adminCharts’,
        ROOT .
        array( ‘highCharts’ ),
        ‘1.0’,
        true
    );
    wp_register_style(
        ‘adminChartsStyles’,
        ROOT .
    );
}
 
add_action( ‘admin_enqueue_scripts’, ‘chart_add_scripts’ );
function chart_add_scripts( $hook ) {
    if ( ‘plugins_page_admin-charts’ == $hook ) {
 
        wp_enqueue_style( ‘adminChartsStyles’ );
        wp_enqueue_script( ‘adminCharts’ );
 
        // checking what type of data we are displaying
        if ( ‘chart_most_popular’ == $_POST[‘chart_data_type’] ) {
            $posts = new WP_Query(
                array(
                    ‘post_type’ => ‘post’,
                    ‘orderby’ => ‘comment_count’,
                    ‘order’ => ‘DESC’,
                    ‘posts_per_page’ => 5
                )
            );
            $data = array(
                ‘data_type’ => ‘chart_most_popular’,
                ‘chart_type’ => ‘column’,
                ‘post_data’ => $posts->posts
            );
            wp_localize_script( ‘adminCharts’, ‘data’, $data );
        }
    }
}
?>

Но нам нужно убедиться, что WP_Query и wp_localize_script только после wp_localize_script формы; поэтому мы заключаем их в другой оператор if который проверяет, была ли отправлена ​​форма:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if ( isset( $_POST[‘show_chart’] ) ) {
 
    if ( ‘chart_most_popular’ == $_POST[‘chart_data_type’] ) {
 
        $posts = new WP_Query(
            array(
                ‘post_type’ => ‘post’,
                ‘orderby’ => ‘comment_count’,
                ‘order’ => ‘DESC’,
                ‘posts_per_page’ => 5
            )
        );
 
        $data = array(
            ‘data_type’ => ‘chart_most_popular’,
            ‘chart_type’ => ‘column’,
            ‘post_data’ => $posts->posts
        );
 
        wp_localize_script( ‘adminCharts’, ‘data’, $data );
 
    }
 
}

Единственное, что осталось сейчас — это взять данные внутри нашего файла JavaScript и нарисовать диаграмму. Внутри файла js / admin_charts.js добавьте следующий код:

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
(function($){
 
    if ( ‘chart_most_popular’ == data.data_type ) {
 
        var post_titles = [],
        post_comment_count = [];
 
        $( data.post_data ).each(function() {
 
            post_titles.push( this.post_title );
            post_comment_count.push( parseInt( this.comment_count ) );
 
        });
 
        $(‘#chart-stats’).highcharts({
            chart: {
                type: data.chart_type
            },
            title: {
                text: ‘Most Popular Posts (by number of comments)’
            },
            xAxis: {
                categories: post_titles
            },
            yAxis: {
                title: {
                    text: ‘Number of Comments’
                }
            },
            series: [
                {
                    name: ‘Comments Count’,
                    data: post_comment_count
                }
            ]
        });
    }
}(jQuery));

Массив $data мы передали через index.php , превратился в объект внутри JavaScript. Таким образом, мы можем манипулировать им как любым другим объектом JavaScript.

Сначала мы проверяем тип данных, который входит:

1
if ( ‘chart_most_popular’ == data.data_type ) {

Затем мы инициализировали два пустых массива для заголовков постов и количества комментариев постов соответственно:

1
2
var post_titles = [],
post_comment_count = [];

И, наконец, мы просмотрели посты и собрали заголовки и количество комментариев в массивах, которые мы инициализировали:

1
2
3
4
5
6
$( data.post_data ).each(function() {
 
    post_titles.push( this.post_title );
    post_comment_count.push( parseInt( this.comment_count ) );
 
});

Теперь пришло время на самом деле нарисовать диаграмму, используя полученные данные, для этого мы использовали API HighCharts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
$(‘#chart-stats’).highcharts({
    chart: {
        type: data.chart_type
    },
    title: {
        text: ‘Most Popular Posts (by number of comments)’
    },
    xAxis: {
        categories: post_titles
    },
    yAxis: {
        title: {
            text: ‘Number of Comments’
        }
    },
    series: [
        {
            name: ‘Comments Count’,
            data: post_comment_count
        }
    ]
});

Теперь вернитесь к своим плагинам> Административные диаграммы и, выбрав опцию из выпадающего меню, нажмите кнопку «Отправить», у вас должна появиться рабочая диаграмма столбцов.

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

4

Теперь мы можем добавить поддержку большего количества типов данных в нашем плагине.

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

1
2
3
4
<select name=»chart_data_type» id=»chart_data_type»>
    <option value=»chart_most_popular»>Most Popular Post</option>
    <option value=»chart_top_cat»>Top 5 Categories by Posts</option>
</select>

Мы можем использовать встроенную функцию WordPress get_categories и передать несколько аргументов:

1
2
3
4
5
6
$categories = get_categories(
    array(
        ‘orderby’ => ‘count’,
        ‘order’ => ‘desc’
    )
);

Затем мы получаем наши данные так же, как и раньше:

1
2
3
4
5
$data = array(
    ‘data_type’ => ‘chart_top_cat’,
    ‘chart_type’ => ‘column’,
    ‘post_data’ => $categories
);

Итак, последний кусок кода должен быть таким:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
if ( ‘chart_cat_break’ == $_POST[‘chart_data_type’] ) {
 
    $categories = get_categories(
        array(
            ‘orderby’ => ‘count’,
            ‘order’ => ‘desc’
        )
    );
 
    $data = array(
        ‘data_type’ => ‘chart_cat_breakup’,
        ‘chart_type’ => ‘pie’,
        ‘post_data’ => $categories
    );
 
    wp_localize_script( ‘adminCharts’, ‘data’, $data );
 
}

В admin_charts.js вставьте этот код после оператора if :

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
else if ( ‘cart_top_cat’ == data.data_type ) {
 
    var cat_titles = [],
    cat_count = [];
 
    $( data.post_data ).each(function() {
 
        cat_titles.push( this.name );
        cat_count.push( parseInt( this.count ) );
 
    });
 
    $(‘#chart-stats’).highcharts({
        chart: {
            type: data.chart_type
        },
        title: {
            text: ‘Top 5 Categories by Posts’
        },
        xAxis: {
            categories: cat_titles
        },
        yAxis: {
            title: {
                text: ‘Number of Posts’
            },
            tickInterval: 5
        },
        series: [
            {
                name: ‘Post Count’,
                data: cat_count
            }
        ]
    });
}

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

5

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
if ( ‘chart_cat_breakup’ == $_POST[‘chart_data_type’] ) {
    $categories = get_categories(
        array(
            ‘orderby’ => ‘count’,
            ‘order’ => ‘desc’
        )
    );
    $data = array(
        ‘data_type’ => ‘chart_cat_breakup’,
        ‘chart_type’ => ‘pie’,
        ‘post_data’ => $categories
    );
    wp_localize_script( ‘adminCharts’, ‘data’, $data );
}

Относительно просто нарисовать круговую диаграмму. В admin_charts.js добавьте следующий код после существующего оператора else-if :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
else if ( ‘chart_cat_breakup’ == data.data_type ) {
    var number_posts = [];
    $( data.post_data ).each(function() {
        number_posts.push( [ this.name, parseInt( this.count ) ] );
    });
    $(‘#chart-stats’).highcharts({
        title: {
            text: ‘Breakup of Categories by Number of Posts’
        },
        tooltip: {
            pointFormat: ‘Number {series.name}: <b>{point.y}</b><br>{series.name} Share: <b>{point.percentage:.1f}%</b>’
        },
        series: [{
            type: ‘pie’,
            name: ‘Posts’,
            data: number_posts
        }]
    });
}
6

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

Добавьте этот бит кода в index.php после функции render_admin_charts_page :

1
2
3
4
5
function selected_option( $option ) {
    if ( $otpion == $_POST[‘chart_data_type’] ) {
        echo ‘selected=»selected»‘;
    }
}

А затем вызовите функцию внутри каждой из наших опций выбора:

1
2
3
4
5
<select name=»chart_data_type» id=»chart_data_type»>
    <option value=»chart_most_popular» <?php selected_option( ‘chart_most_popular’ );
    <option value=»chart_top_cat» <?php selected_option( ‘chart_top_cat’ );
    <option value=»chart_cat_breakup» <?php selected_option( ‘chart_cat_breakup’ );
</select>

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


В этом уроке мы создали собственный плагин с нуля и добавили отдельную страницу в wp-admin. Мы также рассмотрели некоторые из методов, которые могут быть полезны при разработке для WordPress.

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

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