Commit 5873f023 authored by Vadim's avatar Vadim

Version 0.7

1. Настройка "Просматривают сейчас"
parent 9ddccc4a
......@@ -21,7 +21,13 @@
Для вставки HTML-кода на страницу используйте шорт-код `[bg_counter type='post' id='1234' now='true']` или php-функцию `bg_az_counter_views ($type, $id, $now);` в шаблоне записи (поста).
Параметры ***type*** и ***ID*** описаны выше, если задан параметр ***now*** с любым значением, то будут отображаться количество пользователей, просматривающих в данный момент страницу и общее количество просмотров страницы. В противном случае - только общее количество просмотров страницы.
Параметры ***type*** и ***ID*** описаны выше, если задан параметр ***now*** с значением ***true*** (или любое значение кроме null, false, 0, ""), то будут отображаться количество пользователей, просматривающих в данный момент страницу и общее количество просмотров страницы.
В случае ***now=false** (или 0, "") - только общее количество просмотров страницы.
Если этот параметр не задан (или задан как ***now=null***), то используется значение, заданное в настройках плагина.
Задавайте функцию `bg_az_counter_views` в шаблоне страниц так:
`<?php if (function_exists('bg_az_counter_views')) {echo bg_az_counter_views ('post', $post->ID);} ?>`
Эти две основные функции плагина реализованы на JavaScript, работают только на стороне клиента в реальном времени и не зависят от наличия и способа кеширования страниц.
......@@ -46,6 +52,7 @@
Для вывода списка популярных постов в боковую панель используйте **виджет "Популярные записи"**, который работает аналогично соответствующему шорт-коду.
Плагин позволяет загрузить на сервер данные из плагина **WP Popular Posts**, а также ежедневно сохраняет архив данных в файле `wp-content/uploads/bg_az_counter.json`, которые при необходимости можно также загрузить на сервер.
В случае возникновения проблем при сохранении архива ошибки фиксируются в логе плагина: `wp-content/plugins/bg-az-counter/bg_counter.log`.
**Внимание!** После удаления плагина файл `wp-content/uploads/bg_az_counter.json` **НЕ будет удален**! При необходимости, удалите его вручную.
......@@ -3,7 +3,7 @@
Plugin Name: Bg Az-Counter
Plugin URI: https://bogaiskov.ru
Description: Подсчет количества посещений страниц на базе stat.azbyka.ru
Version: 0.4
Version: 0.7
Author: VBog
Author URI: https://bogaiskov.ru
License: GPL2
......@@ -38,7 +38,7 @@ if ( !defined('ABSPATH') ) {
die( 'Sorry, you are not allowed to access this page directly.' );
}
define('BG_COUNTER_VERSION', '0.4.2');
define('BG_COUNTER_VERSION', '0.7.0');
define('BG_COUNTER_LOG', dirname(__FILE__ ).'/bg_counter.log');
define('BG_COUNTER_STAT_COUNTERS','https://stat.azbyka.ru/counters');
define('BG_COUNTER_STAT_RAITING','https://stat.azbyka.ru/rating');
......@@ -57,12 +57,19 @@ function bg_counter_deinstall() {
delete_option('bg_archive_status');
delete_option('bg_counter_period');
}
//delete_option('bg_wppp_loaded'); // Снять комментарий, чтобы сбросить флаг загрузки из WP Popular Posts
if (!isset($project)) {
$project = wp_parse_url( site_url(), PHP_URL_PATH );
if (!$project) $project = '/main'; // Главный сайт
$project = '/project'.$project;
}
// Таблица стилей для плагина
function bg_counter_enqueue_frontend_styles () {
wp_enqueue_style( "bg_counter_styles", plugins_url( '/css/styles.css', plugin_basename(__FILE__) ), array() , BG_COUNTER_VERSION );
}
add_action( 'wp_enqueue_scripts' , 'bg_counter_enqueue_frontend_styles' );
// Настройки плагина
include_once ("inc/options.php");
// Виджеты
......@@ -109,7 +116,7 @@ function bg_counter_daily_action () {
// Сохраняем архив результатов
$result = bg_counter_saveStatictics();
if ($result !== false) update_option( 'bg_archive_status', "<div class='notice notice-info'><p><b>".date("Y-m-d H:i:s", time())."</b> сохранено <b>". $result ."</b> записей в файле архива статистики: <code>". BG_COUNTER_ARCHIVE ."</code></p></div>" );
else update_option( 'bg_archive_status', "<div class='notice notice-error'><p><b>".date("Y-m-d H:i:s", time())."</b> Ошибка при сохранении данных статистки</p></div>" );
else update_option( 'bg_archive_status', "<div class='notice notice-error'><p><b>".date("Y-m-d H:i:s", time())."</b> Ошибка при сохранении данных статистки. См. журнал ошибок: <code>". BG_COUNTER_LOG ."</code></p></div>" );
}
......@@ -149,7 +156,17 @@ function getPopularPosts ($limit, $offset=0) {
$option = get_option('bg_counter_options');
$result = wp_remote_get (BG_COUNTER_STAT_RAITING.$project."?limit=".$limit."&offset=".$offset."&type=post");
if( is_wp_error( $result ) ) return false;
if( is_wp_error( $result ) ) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." РЕЙТИНГ. Ошибка при получении данных с сервера: ".$result->get_error_message(), 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .$result->get_error_code(), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
if (($code = wp_remote_retrieve_response_code( $result )) != 200) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." РЕЙТИНГ. Сервер вернул код ошибки: ".$code, 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .wp_remote_retrieve_response_message( $result ), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
$json = wp_remote_retrieve_body($result);
......@@ -171,7 +188,10 @@ function getPopularPosts ($limit, $offset=0) {
set_transient( $the_key, $quote, $option['period'] );
}
return $quote;
} else return false;
} else {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." РЕЙТИНГ. Сервер вернул ответ неудачи: ".print_r($response, true), 3, BG_COUNTER_LOG );
return false;
}
}
/*****************************************************************************************
POST /set-counter/<path>
......@@ -189,22 +209,50 @@ POST /set-counter/project/test/author/1/book/3
{"success": true}
******************************************************************************************/
function setCounts ($path, $counter) {
// Установить 1 счетчик
function setCount ($path, $counter) {
global $project;
$result = wp_remote_post (BG_COUNTER_STAT_SET.$project.$path, array('body' => '{"counter": '.$counter.'}'));
if( is_wp_error( $result ) ) {
echo "<br>".$result->get_error_message(); // сообщение ошибки
echo "<br>".$result->get_error_code(); // ключ ошибки
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." СЧЁТЧИК. Ошибка при получении данных с сервера: ".$result->get_error_message(), 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .$result->get_error_code(), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
$json = wp_remote_retrieve_body($result);
$response = json_decode($json, false);
if ($response->success) return true;
else echo $json;
else {
echo $json;
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." СЧЁТЧИК. Сервер вернул ответ неудачи: ".print_r($response, true), 3, BG_COUNTER_LOG );
return false;
}
}
// Установить ВСЕ счетчики проекта
function setAllCounts ($request) {
global $project;
$result = wp_remote_post (BG_COUNTER_STAT_SET, array('body' => $request));
if( is_wp_error( $result ) ) {
echo "<br>".$result->get_error_message(); // сообщение ошибки
echo "<br>".$result->get_error_code(); // ключ ошибки
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." ВСЕ СЧЁТЧИКИ. Ошибка при получении данных с сервера: ".$result->get_error_message(), 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .$result->get_error_code(), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
$json = wp_remote_retrieve_body($result);
$response = json_decode($json, false);
if ($response->success) return true;
else {
echo $json;
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." ВСЕ СЧЁТЧИКИ. Сервер вернул ответ неудачи: ".print_r($response, true), 3, BG_COUNTER_LOG );
return false;
}
}
......@@ -213,7 +261,7 @@ function setCounts ($path, $counter) {
Отображает разметку текста для отображения кол-ва просмотров
и кол-ва читающих пост пользователей
******************************************************************************************/
function bg_az_counter_views ($type='', $id='', $now='') {
function bg_az_counter_views ($type='', $id='', $now=null) {
if (is_single() || is_page()) {
if (empty($id)) {
......@@ -224,9 +272,13 @@ function bg_az_counter_views ($type='', $id='', $now='') {
$type='post';
}
}
if (is_null($now)) {
$option = get_option('bg_counter_options');
$now = $option['now'];
}
if (!empty($type) && !empty($id)) {
$views = '<i title="Просмотры страницы" class="fa fa-eye"></i> <span class="bg-az-counter-views"></span>';
$users = ' <i title="Сейчас читают страницу" class="fa fa-users"></i> <span class="bg-az-counter-now"></span>';
$users = ' <i title="Сейчас читают страницу" class="fa fa-user"></i> <span class="bg-az-counter-now"></span>';
$quote = '<span class="bg-az-counter" data-type="'.$type.'" data-ID="'.$id.'">'.$views.($now?$users:'').'</span>';
return $quote;
} else return "";
......@@ -248,7 +300,7 @@ function bg_counter_shortcode( $atts ) {
extract( shortcode_atts( array(
'type' => '',
'id' => '',
'now' => ''
'now' => null
), $atts ) );
$quote = bg_az_counter_views ($type, $id, $now);
return "{$quote}";
......@@ -272,16 +324,27 @@ function bg_counter_top_posts_shortcode( $atts ) {
******************************************************************************************/
function bg_counter_getWPPopularPosts() {
global $wpdb;
global $project;
// Получить данные из таблицы
// postid(bigint(20)), day(datetime), last_viewed(datetime), pageviews(bigint(20))
$data = $wpdb->get_results("SELECT postid,pageviews FROM wp_popularpostsdata", ARRAY_A);
// Отправить данные на сервер
$old_data = $wpdb->get_results("SELECT postid,pageviews FROM wp_popularpostsdata", ARRAY_A);
// Формируем запрос
$i = 0;
foreach ($data as $row) {
if (!setCounts ('/post/'.$row['postid'], $row['pageviews'])) return false;
$data = array();
$point = array();
foreach ($old_data as $row) {
$point['path'] = $project.'/post/'.$row['postid'];
$point['counter'] = (int)$row['pageviews'];
$data[] = $point;
$i++;
}
$json = json_encode($data, JSON_UNESCAPED_SLASHES);
echo $json."<br>";
// Отправить данные на сервер
if (!setAllCounts ($json)) return false;
return $i;
}
......@@ -301,24 +364,31 @@ function bg_counter_saveStatictics() {
while ($count >= $limit) {
$result = wp_remote_get (BG_COUNTER_STAT_RAITING.$project."?limit=".$limit."&offset=".$offset."&type=post");
if( is_wp_error( $result ) ) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time()).$result->get_error_message(), 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." АРХИВ. Ошибка при получении данных с сервера: ".$result->get_error_message(), 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .$result->get_error_code(), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
if (($code = wp_remote_retrieve_response_code( $result )) != 200) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." АРХИВ. Сервер вернул код ошибки: ".$code, 3, BG_COUNTER_LOG ); // сообщение ошибки
error_log( " " .wp_remote_retrieve_response_message( $result ), 3, BG_COUNTER_LOG ); // ключ ошибки
return false;
}
$json = wp_remote_retrieve_body($result);
$response = json_decode($json, false);
if (!$response->success) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time()).print_r($response, true), 3, BG_COUNTER_LOG );
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." АРХИВ. Сервер вернул ответ неудачи: ".print_r($response, true), 3, BG_COUNTER_LOG );
return false;
}
$count = count($response->data);
if ($count) $data = array_merge($data, $response->data);
$offset += $limit;
}
$json = json_encode($data);
$json = json_encode($data, JSON_UNESCAPED_SLASHES);
if (file_put_contents ( ABSPATH.BG_COUNTER_ARCHIVE, $json ) === false) {
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())."Ошибка записи в файл ".BG_COUNTER_ARCHIVE, 3, BG_COUNTER_LOG );
error_log( PHP_EOL .date("Y-m-d H:i:s ", time())." АРХИВ. Ошибка записи в файл: ".BG_COUNTER_ARCHIVE, 3, BG_COUNTER_LOG );
return false;
}
return ($offset-$limit+$count);
......@@ -329,20 +399,30 @@ function bg_counter_saveStatictics() {
******************************************************************************************/
function bg_counter_sendArchiveData() {
global $project;
// Получить данные из файла архива
$json = file_get_contents ( ABSPATH.BG_COUNTER_ARCHIVE);
if (!$json) {
echo "<br>" ."Ошибка чтения файла ".BG_COUNTER_ARCHIVE;
echo "<br>" ."Ошибка чтения файла: ".BG_COUNTER_ARCHIVE;
return false;
}
$data = json_decode($json, true);
// Отправить данные на сервер
$old_data = json_decode($json, true);
// Формируем запрос
$i = 0;
foreach ($data as $row) {
if (!setCounts ('/'.$row['type'].'/'.$row['id'], $row['value'])) return false;
$data = array();
$point = array();
foreach ($old_data as $row) {
$point['path'] = $project.'/'.$row['type'].'/'.$row['id'];
$point['counter'] = $row['value'];
$data[] = $point;
$i++;
}
$json = json_encode($data, JSON_UNESCAPED_SLASHES);
echo $json."<br>";
// Отправить данные на сервер
if (!setAllCounts ($json)) return false;
return $i;
}
.widget-item .bg-az-top-posts {
margin: 5px;
padding: 0;
}
.widget-item .bg-az-top-posts li {
padding: 5px;
list-style-type: none;
}
.widget-item .bg-az-top-posts>li:before {
content: '';
display: inline-block;
width: 4px;
height: 4px;
margin-right: 5px;
vertical-align: middle;
background: #90694a;
border: none;
border-radius: 50%;
}
.widget-item li a {
color: black;
}
.widget-item li .bg-az-count {
color: #999;
}
.widget-item li:hover {
background: #fff;
color: #e88f57;
transition: all .4s ease;
}
\ No newline at end of file
......@@ -4,13 +4,16 @@
*******************************************************************************************/
// Начальные значения
add_option('bg_counter_options', array('period'=>DAY_IN_SECONDS, 'debug'=>0, 'archive'=>0, 'wppp'=>0));
add_option('bg_counter_options', array('period'=>DAY_IN_SECONDS, 'now'=>0, 'debug'=>0, 'archive'=>0, 'wppp'=>0));
add_option('bg_wppp_loaded', '');
$val = get_option('bg_counter_options');
if (!isset($val['period'])) {
$val['period'] = DAY_IN_SECONDS;
update_option( 'bg_counter_period', $val['period'] );
}
if (!isset($val['now'])) {
$val['now'] = 0;
}
if (!isset($val['debug'])) {
$val['debug'] = 0;
}
......@@ -95,6 +98,7 @@ function bg_counter_settings(){
// параметры: $id, $title, $callback, $page, $section, $args
add_settings_field('bg_counter_period', 'Периодичность обработки данных', 'fill_bg_counter_period', 'bg_counter_page', 'section_1' );
add_settings_field('bg_counter_now', 'Просматривают сейчас', 'fill_bg_counter_now', 'bg_counter_page', 'section_1' );
add_settings_field('bg_counter_debug', 'Включить отладку', 'fill_bg_counter_debug', 'bg_counter_page', 'section_1' );
add_settings_field('bg_counter_archive', 'Загрузить данные из архива на сервер', 'fill_bg_counter_sendArchive', 'bg_counter_page', 'section_1' );
add_settings_field('bg_counter_wppp', 'Загрузить данные из WP Popular Posts на сервер', 'fill_bg_counter_wppp', 'bg_counter_page', 'section_1' );
......@@ -119,6 +123,15 @@ function fill_bg_counter_period(){
}
## Заполняем опцию 2
function fill_bg_counter_now(){
$val = get_option('bg_counter_options');
$val = $val ? $val['now'] : null;
?>
<label><input type="checkbox" name="bg_counter_options[now]" value="1" <?php checked(1, $val ); ?>/> (отображать количество пользователей, просматривающих запись в данный момент)</label>
<?php
}
## Заполняем опцию 3
function fill_bg_counter_debug(){
$val = get_option('bg_counter_options');
$val = $val ? $val['debug'] : null;
......@@ -163,9 +176,15 @@ function bg_counter_sanitize_callback( $options ){
if( $name == 'period' )
$val = intval( $val );
if( $name == 'now' )
$val = intval( $val );
if( $name == 'debug' )
$val = intval( $val );
if( $name == 'archive' )
$val = intval( $val );
if( $name == 'wppp' )
$val = intval( $val );
}
......
<?php
class bg_counter_TopPostsWidget extends WP_Widget {
/*
* создание виджета
*/
// создание виджета
function __construct() {
parent::__construct(
'bg_counter_top_widget',
......@@ -12,9 +10,7 @@ class bg_counter_TopPostsWidget extends WP_Widget {
);
}
/*
* фронтэнд виджета
*/
// фронтэнд виджета
public function widget( $args, $instance ) {
$title = apply_filters( 'widget_title', $instance['title'] ); // к заголовку применяем фильтр (необязательно)
$posts_per_page = $instance['posts_per_page'];
......@@ -37,9 +33,7 @@ class bg_counter_TopPostsWidget extends WP_Widget {
echo $args['after_widget'];
}
/*
* бэкэнд виджета
*/
// бэкэнд виджета
public function form( $instance ) {
if ( isset( $instance[ 'title' ] ) ) {
$title = $instance[ 'title' ];
......@@ -59,9 +53,7 @@ class bg_counter_TopPostsWidget extends WP_Widget {
<?php
}
/*
* сохранение настроек виджета
*/
// сохранение настроек виджета
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
......@@ -70,9 +62,7 @@ class bg_counter_TopPostsWidget extends WP_Widget {
}
}
/*
* регистрация виджета
*/
// регистрация виджета
function bg_counter_top_posts_widget_load() {
register_widget( 'bg_counter_TopPostsWidget' );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment