Виджет «популярные записи»
Забирайте виджет популярных записей за период времени.
Параметры:
$instance['title'] - Заголовок
$instance['cat_id'] - ID Категории
$instance['period'] - Период времени
$instance['quantity'] - Количество записей
<?php
if( ! defined('ABSPATH') ) exit;
// Регистрируем новый виджет
add_action( 'widgets_init', 'register_top_posts_widget' );
function register_top_posts_widget() {
register_widget( 'Popular_Post_Widget' );
}
// Добавляем новый виджет
class Popular_Post_Widget extends WP_Widget {
function __construct() {
parent::__construct(
'pop_widget',
'Популярные записи',
array( 'description' => 'Вывод популярных записей', )
);
// Активируем фукцию подсчета просмотров
add_action('wp_head', 'brilias_post_views');
function brilias_post_views() {
if( is_single() ) {
set_post_views( get_the_ID() );
}
}
// Функция подсчета просмотров
function set_post_views($postID) {
// Мета где будем хранить данные
$count_views = 'count_views'; // Количество просмотров
// Получаем данные из мета
$count = get_post_meta($postID, $count_views, true); // Количество просмотров
// Если $count не существует
if($count=='') {
$count = 0;
delete_post_meta($postID, $count_views);
add_post_meta($postID, $count_views, '0');
} else {
$count++;
update_post_meta($postID, $count_views, $count);
}
}
}
/** Вывод виджета популярных записей
*
* @param array $args аргументы виджета.
* @param array $instance сохраненные данные из настроек
*/
public function widget( $args, $instance ) {
global $today_date;
global $reset_val;
global $period_reset;
// Получим опции виджета
$title = apply_filters( 'widget_title', $instance['title'] ); // Узнаем заголовок виджета
$param_cat = $instance['cat_id']; // Узнаем ID категории
$param_quantity = $instance['quantity']; // Узнаем сколько записей выводить
$period_reset = $instance['period']; // Узнаем период сброса
$today_date = current_time('Y-m-d'); // Узнаем текущую дату
// Установим дату сброса
$reset_val = date ('Y-m-d', strtotime ($today_date .'+' .$period_reset .'days'));
// Аргументы для проверки даты сброса
$reset_args = array(
'post_status' => 'publish',
'category__in' => $param_cat,
'posts_per_page' => -1
);
// Получим все записи для проверки даты сброса
$reset_query = new WP_Query($reset_args);
while ($reset_query->have_posts()){ $reset_query->the_post();
global $today_date;
global $reset_val;
global $period_reset;
$meta_date_reset = $period_reset .'_date_reset'; // Мета даты сброса просмотров
// Получим мета сброса просмотров
$reset = get_post_meta($reset_query->post->ID, $meta_date_reset, true);
// Если $reset не существует создадим мету и запишем дату
if($reset == ''){
delete_post_meta($reset_query->post->ID, $meta_date_reset);
add_post_meta($reset_query->post->ID, $meta_date_reset, $reset_val);
}
// Если текущая дата больше или равно даты сброса
if($today_date >= $reset){
update_post_meta($reset_query->post->ID, 'count_views', 0); // Сбросим счетчик просмотров
update_post_meta($reset_query->post->ID, $meta_date_reset, $reset_val); // Установим овую дату сброса
}
} wp_reset_postdata();
// Аргументы вывода виджета
$args = array(
'post_status' => 'publish',
'category__in' => $param_cat,
'posts_per_page' => $param_quantity,
'meta_key' => 'count_views',
'orderby' => 'meta_value_num',
'order' => 'DESC',
); ?>
<div class="top-posts">
<?php
echo $instance['title'];
$result = new WP_Query($args);
while ($result->have_posts()) { $result->the_post(); ?>
<li class="popular-posts-item">
<i class="fas fa-circle popular-posts-circle"></i>
<a href="<?php the_permalink() ?>">
<?php
$excerpt = wp_trim_words( get_the_excerpt(), 15, '...' );
echo $excerpt;
?>
</a>
</li>
<?php } wp_reset_postdata(); ?>
</div>
<?php }
/**
* Админ-часть виджета
*
* @param array $instance сохраненные данные из настроек
*/
public function form( $instance ) {
$title = @ $instance['title'] ?: 'Заголовок';
$cat = @ $instance['cat_id'] ?: '1';
$period = @ $instance['period'] ?: '1';
$quantity = @ $instance['quantity'] ?: '1';
?>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Заголовок:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_html( $title ); ?>">
<label for="<?php echo $this->get_field_id( 'cat' ); ?>"><?php _e( 'ID Категории:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'cat_id' ); ?>" name="<?php echo $this->get_field_name( 'cat_id' ); ?>" type="text" value="<?php echo esc_attr( $cat ); ?>">
<label for="<?php echo $this->get_field_id( 'period' ); ?>"><?php _e( 'Период времени:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'period' ); ?>" name="<?php echo $this->get_field_name( 'period' ); ?>" type="text" value="<?php echo esc_attr( $period ); ?>">
<label for="<?php echo $this->get_field_id( 'quantity' ); ?>"><?php _e( 'Количество записей:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'quantity' ); ?>" name="<?php echo $this->get_field_name( 'quantity' ); ?>" type="text" value="<?php echo esc_attr( $quantity ); ?>">
<?php }
/**
* Сохранение настроек виджета. Здесь данные должны быть очищены и возвращены для сохранения их в базу данных.
*
* @see WP_Widget::update()
*
* @param array $new_instance новые настройки
* @param array $old_instance предыдущие настройки
*
* @return array данные которые будут сохранены
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? ( $new_instance['title'] ) : '';
$instance['cat_id'] = ( ! empty( $new_instance['cat_id'] ) ) ? strip_tags( $new_instance['cat_id'] ) : '';
$instance['period'] = ( ! empty( $new_instance['period'] ) ) ? strip_tags( $new_instance['period'] ) : '';
$instance['quantity'] = ( ! empty( $new_instance['quantity'] ) ) ? strip_tags( $new_instance['quantity'] ) : '';
return $instance;
}
}
?>