6ответ(ов) в теме
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
1
10:18

Доброго времени суток.

Это не готовый адон, а только общее направление для написания своего адона-виджента.
Ибо выкладываемые решения ограничены некоторыми условиями, как, например, обязательное включение в плагине WP-Recall адонов

Вы не можете просматривать опубликованные ссылки

и

Вы не можете просматривать опубликованные ссылки

Результат всех действий:

Вы не можете просматривать опубликованные ссылки

Материалы по теме:

Вы не можете просматривать опубликованные ссылки

***

Итак, STEP 1 - создаем структуру адона:

(DIR) user-statistic
|_(DIR) css
   |_(FILE) style.css
|_(DIR) js
   |_(FILE) stat.js
|_(FILE) index.php
|_(FILE) info.txt

P.S. Если не предполагается как-то кастомизировать сам виджет, то директории css и js (как и вложенные файлы) - не обязательны.

В файле info.txt вставляем информацию о нашем адоне:

Name: User statistic (Статистика активности пользователей);
Version: 1.0.0;
Description: Supplement for Wp-Recall, show statistical analysis of user activity.;
Support Core: 15.0.0;
Author: Myname;
Author Uri: http://mysite.com/;
Add-on Uri: http://codeseller.ru/products/addon-page;

1
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
2
10:49

STEP 2 - создаем структуру своего виджета и активируем его

В файл index.php вставляем разметку наших будущих функций:

<?php

/**
 * [myaddon_stat_dashboard_widgets 	Add statistic widget dashboard to $meta_boxes]
 * @return [array] 						[All dashboard]
 */
function myaddon_stat_dashboard_widgets() {
    // тут мы подключаем виджет к Wordpress
}
add_action('wp_dashboard_setup', 'myaddon_stat_dashboard_widgets' );

/**
 * [myaddon_stat_dashboard_widget_show 	Generated statistics widget block]
 * @return [string] 						[Prints HTML widget code]
 */
function myaddon_stat_dashboard_widget_show() {
    // тут мы формируем HTML структуру виджета
}

/**
 * [myaddon_stat_dashboard_widget_handle 	Get statistic data]
 * @return [array] 							[Processed statistics data]
 */
function myaddon_stat_dashboard_widget_handle() {
    // тут мы получаем необходимые данные для вывода в виджет
}

/**
 * [myaddon_stat_scripts     Add CSS and JS add-on files to back-office]
 */
function myaddon_stat_scripts() {
    // тут мы подключаем кастомные стили и javascript
}
add_action( 'admin_enqueue_scripts', 'myaddon_stat_scripts' );

0
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
3
11:03

STEP 3 - формируем HTML структуру (функция myaddon_stat_dashboard_widget_show)

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

итак, в предыдущем коде меням строку "// тут мы формируем HTML структуру виджета" на код:

// Display widget
	$statistics_chat = myaddon_stat_dashboard_widget_handle();  // эта функция будет нам возвращать массив с данными, полученными из БД
	if( !is_array( $statistics_chat ) ) {
		return;
	}

	foreach ($statistics_chat as $key => $value) {
		if ( is_array( $value ) ) {
			$table .= '	<tr>
							<th>' . ucfirst( __( $key ) ) . ':</th>
							<th class="th-center"><span class="blue-stat">' . $value['client'] . '</span></th>
							<th class="th-center"><span class="blue-stat">' . $value['shop'] . '</span></th>
						</tr>';
		}
	}
	$output = '
			<table width="100%" class="widefat table-stats">
				<tbody>
					<tr>
						<th>' . __( 'Активные чаты' ) . ':</th>
						<th colspan="2"">
							<span class="blue-stat">' . $statistics_chat['active'] . '</span>
						</th>
					</tr>
					<tr>
						<th width="60%"></th>
						<th class="th-center">' . __( 'Клиенты' ) . '</th>
						<th class="th-center">' . __( 'Магазины') . '</th>
					</tr>'
					. $table .
				'</tbody>
			</table>';

	echo '	<div id="statistic_widget">
				<label style="background:#ccc;">' . $output . '</label>
			</div>';

0
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
4
11:21

STEP 4 - получаем нужные данные из БД (функция myaddon_stat_dashboard_widget_handle)

Пару слов о логике.
Данные из БД можно плучить как одним запросом, а потом разобрать их PHP интерпретатором, так и поэтапно получать несколькими запросами конкретные данные.
Я пошел вторым путем - сформировал для каждого блока свой SQL запрос. Хоть это и противоречит чувству прекрасного программиста 🙂 Но данный подход позволит в дальнейшем (если потребуется) маштабировать вывод данных в виджете. Например администратору показывать всю статистику, а редактору - только текущую и за сутки...

Меняем строку "// тут мы получаем необходимые данные для вывода в виджет" на код:

global $wpdb, $rcl_options;

	$statistics_chat = array(
			'active'	=> 0,
			'today'		=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 ),
			'yesterday'	=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 ),
			'week'		=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 ),
			'month'		=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 ),
			'year'		=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 ),
			'total'		=> array(
					'client'	=> 0,
					'shop' 		=> 0
				 )
		);
	$user_type = 'tip_polzovatelya'; // указать свой MetaKey поля профиля

    // Get today statistic
    $today_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= CURDATE()" );
	// Add time statistic to array (today)
	if ( is_array( $today_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $today_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['today']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['today']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
	}

    // Get yesterday statistic
    $yesterday_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= (CURDATE()-1) AND message_time < CURDATE()" );
	// Add time statistic to array (yesterday)
	if ( is_array( $yesterday_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $yesterday_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['yesterday']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['yesterday']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
	}

    // Get week statistic
    $week_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)" );
	// Add time statistic to array (week)
	if ( is_array( $week_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $week_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['week']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['week']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
	}

    // Get month statistic
    $month_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)" );
	// Add time statistic to array (month)
	if ( is_array( $month_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $month_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['month']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['month']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
	}

    // Get year statistic
    $year_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)" );
	// Add time statistic to array (year)
	if ( is_array( $year_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $year_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['year']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['year']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
	}

    // Get total statistic
    $total_chat = $wpdb->get_results( "SELECT user_id FROM " . RCL_PREF . "chat_messages" );
    // Add total statistic to array
	if ( is_array( $total_chat ) ) {
		$chat_s_id = array();
		$chat_c_id = array();
	    foreach ( $year_chat as $key => $value ) {
        	$role = get_user_meta( $value->user_id, $user_type, 1 );
            if ( $role == 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_s_id ) ) {
    				$chat_s_id[] = $value->user_id;
    				$statistics_chat['total']['shop']++;
    			}
            } elseif ( $role != 'магазин' ) {
    			if( !in_array( $value->user_id, $chat_c_id ) ) {
    				$chat_c_id[] = $value->user_id;
            		$statistics_chat['total']['client']++;
    			}
            }
	    }
		unset( $chat_s_id, $chat_c_id );
    }

    // Get active chats
    if ( $rcl_options['inactivity'] ) {
    	$stop_time = $rcl_options['inactivity'];
    } else {
    	$stop_time = 10;
    }
    $active_chat = $wpdb->get_results( "SELECT chat_id FROM " . RCL_PREF . "chat_messages WHERE message_time >= DATE_SUB(NOW() , INTERVAL " . $stop_time . " MINUTE)" );
	// Add active chats to array
	if ( is_array( $active_chat ) ) {
		$chat_id = array();
	    foreach ( $active_chat as $key => $value ) {
			if( !in_array( $value->chat_id, $chat_id ) ) {
				$chat_id[] = $value->chat_id;
				$statistics_chat['active']++;
			}
	    }
	}

	return $statistics_chat;

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

0
Rob Roy
не в сети 7 лет
На сайте с 15.07.2016
Участник
5
11:35

STEP 5 - подключаем виджет к Wordpress (функция myaddon_stat_dashboard_widgets)

Меняем строку "// тут мы подключаем виджет к Wordpress" на код:

	wp_add_dashboard_widget(
		'myaddon_stat_dashboard_widget',
		__( 'Статистика чатов' ),
		'myaddon_stat_dashboard_widget_show'
	);

	// Move widget statistics at the beginning of array
    global $wp_meta_boxes;
    $normal_dashboard = $wp_meta_boxes['dashboard']['normal']['core'];
    $base_widget_backup = array( 'myaddon_stat_dashboard_widget' => $normal_dashboard['myaddon_stat_dashboard_widget'] );
    unset( $normal_dashboard['myaddon_stat_dashboard_widget'] );
    $sorted_dashboard = array_merge( $base_widget_backup, $normal_dashboard );
    $wp_meta_boxes['dashboard']['normal']['core'] = $sorted_dashboard;

Тут в принципе используется штатный функционал Wordpress, поэтому всю информацию можно получить на кодексе 🙂

И осталось подключить кастомные стили и JavaScript - если будете кастомизировать виджет 🙂
Меняем строку "// тут мы подключаем кастомные стили и javascript" на код:

    wp_enqueue_style( 'rcl-stat-css', rcl_addon_url( 'css/style.css', __FILE__ ) );
    wp_enqueue_script( 'rcl-stat-js', rcl_addon_url( 'js/stat.js', __FILE__ ) );

Все, результат на скрине в первом посте.
Удачного кодинга всем 🙂

0
Вова (Otshelnik-Fm)
не в сети 3 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
6
11:47

Вместо wp_enqueue_*** используйте rcl_enqueue_script() и rcl_enqueue_style()

Вы не можете просматривать опубликованные ссылки

Тогда вам будет доступна минимизация и объединение скриптов и стилей от реколл плагина

1
Тема закрыта. Публикация новых сообщений запрещена.