Используем HightCharts в панели администратора WordPress
Диаграммы – прекрасный способ визуализировать данные. Благодаря диаграммам вся информация становится более удобоваримой, понятной и привлекательной. В WordPress отсутствуют какие-либо встроенные методы для того, чтобы выводить данные о записях и страницах в графической форме. Несмотря на то, что имеются некоторые плагины, позволяющие интегрировать Google аналитику к WordPress, они излишни, если вы желаете получить лишь часть этих данных. Ничто не должно мешать вашему обучению новым методам, а самый лучший способ научиться – сразу же приступить к работе с предметом.
Что мы будем делать
Данное руководство нацелено в первую очередь на тех разработчиков WordPress, которые являются новичками и желают получить понимание полезных техник, применимых впоследствии в процессе разработки. В этом руководстве мы собираемся реализовать свой собственный простой плагин, который предоставит нам все данные в графическом виде в пределах панели администратора WordPress. Мы будем использовать стандартные WordPress классы и функции, чтобы получить данные и затем вывести их в графическом виде в консоли WordPress с помощью jQuery-плагина под названием HighCharts.
Мы подготовим наш базовый плагин, добавим страницу для него в wp-admin, и затем подключим JavaScript-файл плагина только для этой страницы. Затем полученные нами данные мы передадим внешнему скрипту через wp_localize_script. В свою очередь, скрипт представит наши данные в графическом виде.
Мы планируем показать:
- Самые популярные записи.
- Топ пять рубрик по количеству постов.
- Распределение записей по рубрикам.
HighCharts
Согласно сайту плагина:
«Highcharts – библиотека для составления диаграмм, написанная на чистом HTML5/JavaScript, предлагающая интуитивные, интерактивные диаграммы для вашего веб-сайта или веб-приложения. Highcharts в настоящее время поддерживает линии, сплайны, области, области-сплайны, столбцы, строки, круговые диаграммы и т.д.»
Скачать копию Highcharts можно с официального сайта.
Однако давайте для начала начнем работу с нашим плагином.
Подготавливаем наш плагин
Базовая настройка
Для начала мы создадим папку внутри wp-content/plugins под названием admin-charts. Внутри нее мы сделаем базовую структуру папок для нашего плагина.
Скопируем файл adminchart.js, полученный с официального сайта, в нашу папку js.
В корневой директории мы создадим файл index.php, внутри которого будет содержаться базовое объявление нашего плагина:
<?php /* Plugin Name: Admin Charts Plugin URI: http://dev.imbilal.com/wpadmincharts Description: JavaScript charts for WordPress admin. These charts show different statistics in the WordPress admin. Version: 1.0 Author: Bilal Shahid Author URI: http://www.imbilal.com License: GPLv2 or later */ ?>
Теперь переходим в WP-Admin – Plugins и видим, что наш плагин появился там, но пока он не способен функционировать.
Также мы добавим некоторые стили в admin_charts.css:
#admin_chart_form {
margin: 30px 0;
}
#admin_chart_form label {
display: inline-block;
width: 250px;
}
Добавляем страницу плагина
На этом шаге нам понадобится добавить страницу плагина в панели администратора, на которой будут производиться все операции. Для этого мы воспользуемся действием admin_menu. Это действие вызывается после создания базовой структуры меню в панели администратора, потому оно может использоваться для добавления дополнительных меню или подменю. Основное использование admin_menu выглядит следующим образом:
<?php add_action( 'admin_menu', 'function_name' ); ?>
Мы добавим к нашему файлу index.php функцию chart_add_admin_page, после чего подцепим ее к данному действию:
add_action( 'admin_menu', 'chart_add_admin_page' );
Внутри функции chart_add_admin_page мы будем вызывать родную для WordPress функцию add_plugins_page:
function chart_add_admin_page() {
add_plugins_page(
'Charts For WordPress',
'Admin Charts',
'administrator',
'admin-charts',
'render_admin_charts_page'
);
}
Первый аргумент – это заголовок страницы, который будет выводиться в TITLE страницы. Второй аргумент – это заголовок меню. Третий и четвертый аргумент – пользовательские возможности и уникальный слаг для обращения к данному меню. Последний аргумент – название функции обратного вызова, которая используется для обработки контента на данной странице.
Теперь если вы активируете плагин и наведете мышкой на меню Plugins, то вы увидите новую страницу, которую мы добавили к нашему плагину.
Обработка контента на странице плагина
На данном этапе мы успешно добавили пустую страницу к нашему плагину. Пора сделать ее более функциональной путем вывода некоторого контента.
В нашем предыдущем вызове add_plugins_page мы обращались к функции обратного вызова render_admin_charts_page. С помощью данной функции мы планируем выводить на экран весь контент, который мы хотим иметь на указанной странице. Давайте напишем эту функцию.
Под функцией chart_add_admin_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">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-код. Мы задали заголовок и форму внутри родного для WordPress CSS-класса wrap.
Внутри форму мы добавили раскрывающийся список, который на данный момент содержит только одну опцию, отвечающую за отображение самых популярных записей по кол-ву комментариев. Под формой мы добавили контейнер div для наших графиков.
Теперь наша страница сформирована:
Самое время приступить к регистрации необходимых скриптов и стилей, чтобы мы могли подключить их позже. Для этого мы будем использовать функции wp_register_script и wp_register_style, которые должны работать совместно с хуком admin_enqueue_scripts, если нам нужно подключить их на стороне администратора.
Однако перед этим давайте добавим константу для корневой директории нашего плагина, чтобы мы могли обращаться к ней позже, когда мы определим пути для наших скриптов и стилей. Таким образом, в самом верху страницы под описанием плагина давайте добавим следующий код:
define( 'ROOT', plugin_dir_url( __FILE__ ) );
Теперь мы можем определить нашу функцию для регистрации скриптов и стилей:
add_action( 'admin_enqueue_scripts', 'chart_register_scripts' );
function chart_register_scripts() {
wp_register_script(
'highCharts',
ROOT . 'js/highcharts.js',
array( 'jquery' ),
'3.0',
true
);
wp_register_script(
'adminCharts',
ROOT . 'js/admin_charts.js',
array( 'highCharts' ),
'1.0',
true
);
wp_register_style(
'adminChartsStyles',
ROOT . 'css/admin_chart.css'
);
}
Сначала мы зарегистрировали скрипт HighCharts, скачанный нами ранее. Мы присвоили ему хэндл highCharts. В качестве следующего аргумента мы определили путь, по которому можно найти скрипт.
Затем мы передали массив скриптов, от которых зависит наш скрипт. В данном случае это jQuery, поскольку мы будем управлять DOM. Таким образом, нам не нужно думать о подключении jQuery, он будет подключаться автоматически всякий раз, когда мы подключаем скрипт highCharts.
В качестве третьего аргумента мы определили номер версии, а в качестве четвертого – сообщили wp_register_script о том, что нужно подключить скрипт в футере страницы после основного содержания. Аналогичным образом мы зарегистрировали наш второй скрипт, в котором мы будем добавлять весь необходимый нам JS-код.
Теперь мы можем фактически подключить наши скрипты и стили к странице плагина, однако нам не нужно, чтобы они подключались ко всем отдельным страницам в панели администратора.
По этой причине мы выполним проверку условия перед подключением наших скриптов:
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. Вы можете всегда проверить данный параметр путем вывода его с помощью echo во время процесса разработки.
Теперь, когда мы подготовили базу для нашего плагина, мы можем приступать к работе над нашей основной целью, т.е. над получением данных и вывода статистики.
Получение и вывод статистики
Мы хотим получить три типа данных:
- Самые популярные записи (гистограмма)
- Топ из пяти рубрик по количеству записей (гистограмма)
- Разбиение записей по рубрикам (круговая диаграмма)
Самые популярные записи
Для представленного типа данных мы будем использовать класс WP_Query, позволяющий получить пять записей, которые имеют больше всего комментариев. Класс WP_Query очень удобен, когда нам нужно получить записи на базе различных критериев. Используя данный класс, мы можем выводить список записей любым желаемым образом. Запрос для получения записей с максимальным числом комментариев может иметь следующий вид:
$posts = new WP_Query(
array(
'post_type' => 'post',
'orderby' => 'comment_count',
'order' => 'DESC',
'posts_per_page' => 5
)
);
Теперь у нас есть пять записей, которые обладают максимальным количеством комментариев и которые представлены в виде объектов внутри массива $posts. Вы можете всегда вызвать через echo переменную, которую вы хотите проверить.
Мы должны передать этот объект вместе с другими необходимыми данными в JS. Для этого мы сначала должны подготовить массив, который будет содержать тип данных, тип графика, который нам нужен, и сами записи, которые были отобраны через WP_Query.
$data = array(
'data_type' => 'chart_most_popular',
'chart_type' => 'column',
'post_data' => $posts->posts
);
Мы можем передать переменную в JS через wp_localize_script:
wp_localize_script( 'adminCharts', 'data', $data );
Первый аргумент в вызове функции – это хэндл скрипта, которому мы должны передать данные. Мы зарегистрировали этот скрипт ранее. Второй аргумент – это название объекта, которое будет доступно для JS, и третий аргумент – это сами данные, которые мы должны передать. Финальный index.php будет иметь следующий вид:
<?php
/*
Plugin Name: Admin Charts
Plugin URI: http://dev.imbilal.com/wpadmincharts
Description: Javascript charts for wordpress admin. These charts graphically show different statistics in the 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'); ?>>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
}
/********************************* Adding necessary scripts/styles needed *********************************/
add_action( 'admin_enqueue_scripts', 'chart_register_scripts' );
function chart_register_scripts() {
wp_register_script(
'highCharts',
ROOT . 'js/highcharts.js',
array( 'jquery' ),
'3.0',
true
);
wp_register_script(
'adminCharts',
ROOT . 'js/admin_charts.js',
array( 'highCharts' ),
'1.0',
true
);
wp_register_style(
'adminChartsStyles',
ROOT . 'css/admin_chart.css'
);
}
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 вызываются только тогда, когда мы отправляем форму; поэтому мы вкладываем их в еще одно if-условие, которое будет проверять, отправлена ли форма:
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 добавим следующий код:
(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. Мы можем работать с ним, как и с любым другим JS-объектом.
Поначалу мы проверяем получаемый тип данных:
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 ) );
});
Теперь пришло время изобразить график, используя полученные данные. Для этого мы будем использовать HighCharts API:
$('#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
}
]
});
Переходим обратно к Plugins – Admin Charts и после выбора опции из выпадающего списка щелкаем по кнопке Отправить. Вы должны увидеть работающую гистограмму.
Вы можете вернуться обратно к вашим записям, добавить некоторые комментарии и затем посмотреть уже обновленную статистику:
Теперь мы добавим к плагину поддержку большего количества типов данных.
Топ пять рубрик по количеству записей
Все, что нам нужно теперь сделать – это получить пять рубрик, в которых находится наибольшее число записей. Однако перед этим давайте добавим опцию для нашего типа данных в выпадающем списке. Вернемся обратно к функции render_admin_charts_page, которую мы определили ранее, и обновим ее:
<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 и передать ей несколько аргументов:
$categories = get_categories(
array(
'orderby' => 'count',
'order' => 'desc'
)
);
Затем мы получаем наши данные тем же способом, как мы делали это раньше:
$data = array(
'data_type' => 'chart_top_cat',
'chart_type' => 'column',
'post_data' => $categories
);
Итоговый код будет выглядеть следующим образом:
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:
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
}
]
});
}
Мы делаем практически все то же самое, что и раньше. Правда, в данном случае нам понадобится изменить название диаграммы и подписи для осей. Нам теперь понадобится дополнительный график, выводящий топ пять рубрик с наибольшим числом постов:
Распределение записей по рубрикам
Наш последний тип данных – это распределение записей по рубрикам. Для представленного типа данных мы будем использовать круговую диаграмму как самую подходящую. Заметьте также, что одна и та же запись может относиться к нескольким рубрикам.
Мы будем использовать ту же самую функцию get_categories, однако в данном случае мы не будем ограничивать количество получаемых рубрик – нам нужны все рубрики, чтобы показать распределение записей по ним.
Начнем мы с того, что проверим, была ли выбрана опция для данного типа записей, затем вызовем нашу функцию для получения рубрик, подготовим наш массив и передадим его в JS:
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:
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
}]
});
}
Обратите внимание, что мы форматировали сноски, чтобы выводить процентное соотношение вместо целых чисел. Мы почти закончили, за исключением одной небольшой полезной функции, которую мы можем добавить к каждой из наших опций, чтобы она сохранялась даже при обновлении страницы после отправки формы.
Добавим следующий код в index.php после функции render_admin_charts_page:
function selected_option( $option ) {
if ( $otpion == $_POST['chart_data_type'] ) {
echo 'selected="selected"';
}
}
Затем следует вызов функции внутри каждой из выбранных нами опций:
<select name="chart_data_type" id="chart_data_type">
<option value="chart_most_popular" <?php selected_option( 'chart_most_popular' ); ?>>Most Popular Post</option>
<option value="chart_top_cat" <?php selected_option( 'chart_top_cat' ); ?>>Top 5 Categories by Posts</option>
<option value="chart_cat_breakup" <?php selected_option( 'chart_cat_breakup' ); ?>>Breakup of Categories by Posts</option>
</select>
Теперь наш плагин полностью завершен. Вы можете выводить три рабочих графика для разных типов данных. Попробуйте самостоятельно добавить дополнительные графики для других типов данных.
Источник: wp.tutsplus.com






