Как добавить свои собственные виджеты к странице консоли WordPress

Как добавить свои собственные виджеты к странице консоли WordPress

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

Базовый виджет консоли

Анатомия виджеты консоли очень проста. Сначала вам нужно использовать функцию wp_add_dashboard_widget() для регистрации виджета в WordPress. Затем вы создаете функцию, которая обрабатывает вывод контента. Вот код шаблона, который вы можете использовать для быстрого создания виджета:

add_action( 'wp_dashboard_setup', 'register_my_dashboard_widget' );
function register_my_dashboard_widget() {
	wp_add_dashboard_widget(
		'my_dashboard_widget',
		'My Dashboard Widget',
		'my_dashboard_widget_display'
	);
 
}
 
function my_dashboard_widget_display() {
    echo 'Hello, I am Mr. Widget';
}

Обратите внимание, что этот код должен быть помещен в плагин. Если вы хотите быстро его протестировать, вы можете также добавить код в файл functions.php вашей темы.

Первый шаг – это подцепление функции к wp_dashboard_setup. Контент этой функции – простой вызов wp_add_dashboard_widget() с тремя параметрами:

  • Слаг виджета
  • Заголовок виджета
  • Функция вывода

Второй шаг – создание функции вывода my_dashboard_widget_display() и заполнение ее контентом.

Вывод виджетов в верхнюю часть консоли

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

function register_my_dashboard_widget() {
 	global $wp_meta_boxes;
 
	wp_add_dashboard_widget(
		'my_dashboard_widget',
		'Publication Schedule',
		'my_dashboard_widget_display'
	);
 
 	$dashboard = $wp_meta_boxes['dashboard']['normal']['core'];
 
	$my_widget = array( 'my_dashboard_widget' => $dashboard['my_dashboard_widget'] );
 	unset( $dashboard['my_dashboard_widget'] );
 
 	$sorted_dashboard = array_merge( $my_widget, $dashboard );
 	$wp_meta_boxes['dashboard']['normal']['core'] = $sorted_dashboard;
}
add_action( 'wp_dashboard_setup', 'register_my_dashboard_widget' );
 
function my_dashboard_widget_display() {
	?>
 
	<p>
	Don't forget that there are three slots for publication each day. <strong>8am, 1pm and 6pm</strong> EDT. Posts must be finalized 12 hours before their publication time. This includes final checks and proofreading.
	</p>
 
	<p>
	For particularly time-sensitive posts please contact the editor in chief to make sure the required time does not conflict with any ongoing projects.
	</p>
 
	<?php
}

Семь дополнительных строк для простой реконструкции консоли – чрезвычайно много, однако других методов нет. На первом шаге нам нужно сделать глобальной переменную $wp_meta_boxes, которая содержит в себе информацию относительно всех зарегистрированных виджетов. Чтобы упростить понимание кода, я добавил виджеты, которые выводятся в консоли, в переменную $dashboard.

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

На следующем шаге мы объединяем контент $my_widget и $dashboard. Функция array_merge() добавляет второй массив к первому, таким образом, наш виджет теперь является первым в новом массиве $sorted_dashboard. На последнем шаге мы меняем оригинальный массив консоли на новый отсортированный массив.

Добавление функциональности

Основной способ улучшения виджетов консоли состоит в создании нескольких приятных стилей или применении некоторой JS-функциональности. Давайте создадим виджет, который будет показывать число комментариев на нашем сайте, полученных за каждую неделю в течение последних пяти недель. Это будет упрощенный пример, proof of concept, так сказать.

Comment-Trends

HTML структура

Мы создали пример выше с помощью одного лишь CSS, без JS. Для этого мы использовали следующую HTML структуру:

<div class="comment-stat-bars">
    <div class="comment-stat-bar"></div>
    <div class="comment-stat-bar"></div>
    <!-- etc... -->
</div>
<div class="comment-stat-labels">
    <div class="comment-stat-label">comment count here</div>
</div>
<div class='comment-stat-caption'>Comments in the past 5 weeks</div>

Стилизован виджет будет с помощью CSS-файла, а также некоторых встроенных стилей, которые позаботятся о высоте и ширине.

Стилизация столбцов

Высота всего контейнера (.comment-stat-bars) является фиксированной – 120 пикселей. Столбцы в высоту также составляют 120 пикселей. Разная высота столбцов достигается путем добавления рамок (border) с разной высотой. Таким образом, мы сможет гарантировать то, что столбцы будут начинаться с самого низа, и при помощи overflow:hidden для контейнера мы сможем скрыть все лишнее.

Стилевая таблица добавляется в обычной манере, при помощи поочередного подключения:

add_action( 'admin_enqueue_scripts', 'dashboard_widget_display_enqueues' );
function dashboard_widget_display_enqueues( $hook ) {
	if( 'index.php' != $hook ) {
		return;
	}
 
	wp_enqueue_style( 'dashboard-widget-styles', plugins_url( '', __FILE__ ) . '/widgets.css' );
}

Обратите внимание, что мы проверяем значение переменной $hook, чтобы убедиться в том, что стили используются только на странице консоли, ведь они больше нигде не требуются. Если вы добавите код к файлу functions.php темы, вам нужно будет использовать get_template_directory_uri() вместо plugins_uri().

Контент стилевой таблицы приведет ниже. Остальные стили будут встроены:

.comment-stat-bars {
    overflow:hidden
}
 
.comment-stat-bar {
    margin:0 1%;
    background-color: #2ea2cc;
    border-top-color: #fff;
    border-top-style: solid;
    float:left;
}
 
.comment-stat-labels {
    overflow:hidden;
}
 
.comment-stat-label {
    float:left;
    margin:0 1%;
    padding:5px 0;
    text-align:center;
}
 
.comment-stat-caption {
    text-align:center;
    margin:11px 0;
    font-style:italic
}

Вычисление высоты

Вместо получения количества комментариев мы поработаем с числовым массивом:

$comment_counts = array( 20, 29, 40, 33, 17 );

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

В стилевой таблицы мы добавили поле (margin) в 1% с каждой стороны столбца. Это означает, что для каждого столбца, который у нас имеется, у нас на 2% меньше пространства, доступного для распределения между столбцами. Таким образом, если мы используем 100% как общую ширину, мы можем настроить процентную ширину каждого столбца:

// ( 100 / number of bars ) - 2
$data_points = count( $comment_counts );
$bar_width = 100 / $data_points - 2

Теперь переходим к высоте. Столбец с самым большим значением высоты будет всегда заполнять всю высоту контейнера. В нашем примере, третий столбец (со значением 40) является самым большим по значению, таким образом, он будет иметь максимальную высоту в 120 пикселей. К каждому следующему столбцу, который будет меньше по значению, мы будем добавлять верхний край (top margin).

Каким именно будет верхний край, зависит от отношения между размером столбца и самым большим столбцом в наборе. В нашем примере первый столбец – это ровно половина размера третьего столбца. Поэтому нам нужно будет добавить поле сверху в 60 пикселей, ровно половину от 120 пикселей. Вот как будет выглядеть код:

$highest_value = max( $comment_counts );
foreach( $comment_counts as $count ) :
	$count_percentage = $count/$highest_value;
	$bar_height = $total_height * $count_percentage;
	$border_width = $total_height - $bar_height;
}

Отображение статичного графика

Если мы объединим весь код вместе, то мы получим удобную столбиковую диаграмму, несмотря на то, что числа в ней жестко прописаны. Давайте посмотрим:

function dashboard_widget_display_enqueues( $hook ) {
	if( 'index.php' != $hook ) {
		return;
	}
 
	wp_enqueue_style( 'dashboard-widget-styles', plugins_url( '', __FILE__ ) . '/widgets.css' );
}
 
add_action( 'admin_enqueue_scripts', 'dashboard_widget_display_enqueues' );
 
function register_comment_stats_dashboard_widget() {
	wp_add_dashboard_widget(
		'comment_stats_widget',
		'Comment Stats',
		'comment_stats_dashboard_widget_display'
	);
 
}
add_action( 'wp_dashboard_setup', 'register_comment_stats_dashboard_widget' );
 
function comment_stats_dashboard_widget_display() {
 
	$comment_counts = array( 20, 29, 39, 33, 17 );
	$highest_value = max( $comment_counts );
	$data_points = count( $comment_counts );
 
	$bar_width = 100 / $data_points - 2;
 
	$total_height = 120;
 
	?>;
 
	<div class="comment-stat-bars" style="height:<?php echo $total_height ?>px;">
		<?php
			foreach( $comment_counts as $count ) :
				$count_percentage = $count/$highest_value;
				$bar_height = $total_height * $count_percentage;
				$border_width = $total_height - $bar_height;
		?>
		<div class="comment-stat-bar" style="height:<?php echo $total_height ?>px; border-top-width:<?php echo $border_width ?>px; width: <?php echo $bar_width ?>%;"></div>
		<?php endforeach ?>
	</div>
 
	<div class='comment-stat-labels'>
		<?php foreach( $comment_counts as $count ) : ?>
		<div class='comment-stat-label' style='width: <?php echo $bar_width ?>%;'><?php echo $count ?></div>
	<?php endforeach ?>
	</div>
 
	<div class='comment-stat-caption'>Comments in the past 5 weeks</div>
	<?php
}

Получение числа комментариев

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

global $wpdb;
for( $i=1; $i <= 5; $i++ ) {
	$this_week = 7 * $i;
	$last_week = 7 * ( $i - 1);
	$comment_counts[] =
	$wpdb->get_var( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_date > '" . date('Y-m-d H:i:s', strtotime('-' . $this_week . ' days')) . "' AND comment_date < '" . date('Y-m-d H:i:s', strtotime('-' . $last_week . ' days')) . "'" ) ;

Здесь мы получаем число комментариев из базы данных 5 раз. В каждой итерации цикла возвращается одна неделя. В первой итерации мы получаем все комментарии, которые были оставлены в промежутке, начиная с сегодняшнего дня и заканчивая семью днями назад. Во второй итерации – все комментарии между 7 и 14 днями назад, и так далее.

Заключение

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

Наряду с получением данных из WordPress вы можем также рассмотреть сторонние API для данных. Вы можете получать статистику из Mailchimp, Google Analytics, Twitter и т.д.

Источник: wpmu.org

Сохранено из oddstyle.ru

Добавить комментарий

%d такие блоггеры, как: