WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

[В РАЗРАБОТКЕ] Вывод популярных категорий таксономии / Популярные элементы таксономии (термины)

Есть плагины для вывода популярных постов.

Ищу аналог только для кастомной 1 таксономии, чтобы выводились популярные дочерние таксономии.

0
kolshix
1 месяц назад 682
  • 0
    Andrew475 america-xix.ru

    Что значит "популярная дочерняя таксономия"? (решение зависит от того, что Вы понимаете под этим определением)

    kolshix 1 месяц назад

    я имею ввиду что создал таксономию "Средства передвижения" и у неё есть дочки Автомобили, Мотоциклы, самолеты, Сани, повозки, велосипеды, автобусы и тд более 30 видов.

    Нужно вывести самые популярные\просматриваемые за время "средства передвижения" (10шт) - к примеру сейчас это
    Автомобили, мотоциклы, Самолеты

    • в другой день может быть
      Сани, повозки, дельтапланы

    Я даже не знаю существуют ли такие плагины.

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

    Чисто суммирование просмотра таксономий (и крон очистка), создать не составит труда. Но люди не часто смотрят рубрики. По-этому этот вариант отставлю как запасной.

    Комментировать
  • 0
    Kama8394

    Kama Postviews считает просмотры терминов. В принципе с его помощью без проблем можно вывести популярные термины указанной таксономии. Правда платный он sorry

    kolshix 1 месяц назад

    пока что сделал тестовую версию для админа (себя ))

    /*  Script: Popular term
    		By: Kolshix
    
    		Заметка: 1. кукисы не добавлял, пусть и пагинация считается,
    				 если term популярен то и пагинацию нужно считать.
    				 2. стили так же не добавлял 
    
    		Не доделал: 1. cron отчистку таблицы populartermsdata
    					2. не определился с подсчетом постов за все время - сейчас обнуляется
    					   думаю добавить столбец в "wp_populartermsdata" - пусть все там обнуляется, а в termmeta будет подсчет за все время
    					3. не подключена возможность выбора нужного элемента таксономии для вывода
    					4. не подключена отчистка данных из таблицы при удаление термина
    	*/ 
    
    	/**** Таблица для подсчета популярных term "за день" */     
    		function create_table() {
    			global $wpdb;
    
    			require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    
    			$table_name = $wpdb->get_blog_prefix() . 'populartermsdata';
    			$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate}";
    			// // название - тип(количество символов) - не использовать отрицательные числа
    			$sql = "CREATE TABLE {$table_name} ( 
    			termid  bigint(20) unsigned NOT NULL auto_increment, 
    			termviews bigint(20) NOT NULL default '1',
    			PRIMARY KEY  (termid)
    			)
    			{$charset_collate};";
    
    			dbDelta($sql);
    		}
    
    		// create_table(); // нужно раскомментировать 
    		/* Создание таблицы - чтоб не засирать termmeta
    		 * таблица нужна чтоб не выводить много обновлений за короткий промежуток времени
    		 * пытался повторить рейтинг (обновлять поле при наличии числа 10-20-30... просмотров) 
    		 * из плагина wordpress popular post 
    		 * буду юзать пример отсюда
    		 ==> https://wp-kama.ru/id_101/funktsiya-vyivoda-zapisey-po-kolichestvu-prosmotrov.html
    		 */ 
    
    	/**** Подсчет количества посещений страниц term */
    		/* Это старый код от KAMA - новый тут 
    		   https://wp-kama.ru/id_55/schitaem-kolichestvo-posescheniy-stranits-na-wordpress.html
    		 */
    		add_action('wp_head', 'kolshix_catviews');
    		function kolshix_catviews() {           
    			$meta_key       = 'views_cat';      // Ключ мета поля, куда будет записываться количество просмотров.
    			$who_count      = 0;                // Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированных пользователей.
    			$exclude_bots   = 1;                // Исключить ботов, роботов, пауков и прочую нечесть :)? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
    			$term_view      = 'post_character'; // что считаем - настраиваем под себя
    			if ( current_user_can('manage_options')) { 
    				if ( is_tax( $term_view ) ) {
    					global $user_ID, $wp_query, $wpdb;
    
    					$cat_obj = $wp_query->get_queried_object();
    					$cat_id = $cat_obj->term_id;
    
    					$id = (int)$cat_id;
    					static $cat_views = false;
    
    					if($cat_views) return true; // чтобы 1 раз за поток
    
    					$cat_views = (int)get_term_meta( $id, $meta_key, true );
    					$should_count = false;
    					switch( (int)$who_count ) {
    						case 0: 
    							if( (int)$user_ID == 1 ) /* АДМИНа считать */
    							$should_count = true;
    							break;
    						case 1:
    							if( (int)$user_ID == 0 )
    								$should_count = true;
    							break;
    						case 2:
    							if( (int)$user_ID > 0 )
    								$should_count = true;
    							break;
    					}
    
    					if( (int)$exclude_bots==1 && $should_count ){
    						$useragent = $_SERVER['HTTP_USER_AGENT'];
    						$notbot = "Mozilla|Opera"; //Chrome|Safari|Firefox|Netscape - все равны Mozilla
    						$bot = "Bot/|robot|Slurp/|yahoo"; //Яндекс иногда как Mozilla представляется
    						if ( !preg_match("/$notbot/i", $useragent) || preg_match("!$bot!i", $useragent) )
    							$should_count = false;
    					}
    					if($should_count){  
    						// Рейтинг обновления вывода дневных постов выстовляется тут - сейчас обновления после 10 просмотров
    						if ( $cat_views+1 > 10 ){ // rate 
    							update_term_meta($id, $meta_key, 1 );   
    							$old_tv = $wpdb->get_results( "SELECT termid, termviews 
    												 FROM wp_populartermsdata
    												 WHERE termid = $id " );
    
    							if( !isset($old_tv[0]->termviews) ) {
    								$wpdb->insert( 'wp_populartermsdata',
    												array( 'termid' => $id, 'termviews' => 1 ),
    												array( '%d', '%d' )
    											);
    								$wpdb->update( 'wp_populartermsdata',
    												array( 'termviews' => 1  ),
    												array( 'termid' => $id )
    											);
    							} else {
    								$wpdb->update( 'wp_populartermsdata',
    												array( 'termviews' => $old_tv[0]->termviews+1  ),
    												array( 'termid' => $id )
    											);
    							}
    						} else {                                
    							if( !update_term_meta($id, $meta_key, ($cat_views+1)) ){
    								add_term_meta($id, $meta_key, 1, true);
    							}
    						}
    					}
    					return true;
    				} // end tax
    			}
    		}
    	/**** Вывод популярных term */
    		function kolshix_get_most_viewed_tax( $args = '' ){
    			global $wpdb, $post;
    			parse_str( $args, $i );
    			$num           = isset( $i['num'] )    ? preg_replace( '/[^0-9,\s]/', '', $i['num'] ) : 10; // 20,10 | 10
    			$out_before    = isset( $i['out_before'] )  ? $i['out_before'] : '';
    			$out_after     = isset( $i['out_after'] )   ? $i['out_after']  : '';
    
    			$pop_tax = $wpdb->get_results($wpdb->prepare("SELECT meta_value, term_id 
    														 FROM wp_termmeta 
    														 WHERE meta_key = 'views_cat'
    														 ORDER BY meta_value LIMIT $num"));
    
    			foreach( $pop_tax as $tax ){            
    				//  $term = get_term( $tax->term_id, 'post_character' );    // из wp_termmeta 
    					$term = get_term( $tax->termid, 'post_character' );     // из цз_populartermsdata       
    				//  $slug = $term->slug;                
    				//  $name = $term->name;
    					$pop_out .= $term->name . '<br>';
    			}
    
    			// simple kolshix_get_most_viewed_tax( 'num=3&out_before=<span>&out_after=</span>' );
    			return  $out_before. $pop_out . $out_after ;
    		}
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация