• Как сделать счётчик просмотров статьёй?

    Я делал через куки на 1 час, чтобы не считать несколько раз.
    Далее к каждой статье создается поле количества просмотров.
    Если куки есть - пропускам, если нет - прибавляем 1.
    Функция подсчета:
    # Подсчет количества посещений страницы
    function set_postviews() {
    
      $count_key    = 'post_views_count';  // Имя поля для записи количества просмотров
    	$who_count    = 1;	// 0 - считать всех, 1 - только гостей, 2 - только зарегистрированных пользователей
    	$exclude_bots = 1;	// 0 - считать всех, 1 - исключить из подсчета ботов
    
    	global $user_ID, $post, $cookie_test;
    
    	# Проверка, что не было просмотра страницы в течение часа
    	if( is_singular() && $cookie_test) {
    
    		$id = (int)$post->ID;
    		static $post_views = false;
    		if( $post_views ) return true; // чтобы 1 раз за поток
    
    		$post_views = (int)get_post_meta( $id, $count_key, true );
    
    		# Проверка пользователя: гость или зарегистрирован
    		$should_count = false;
    		switch( (int)$who_count ) {
    			case 0: $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;
    		}
    
    		# Проверка на браузер или не бот, иначе false
    		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;
    		}
    
    		# Обновляем счетик, если поля нет, то создаем со значением 1
    		if( $should_count )
    			if( !update_post_meta( $id, $count_key, ($post_views+1)) ) add_post_meta( $id, $count_key, 1, true );
    	}
    	return true;
    }
    add_action('wp_head', 'set_postviews');


    Куки так:
    /*
    * Создаем куки, чтобы дважды не считать один и тот же пост в течение 1 часа
    *
    *			в самое начало single.php пропишем:
    *			<?php
    *				global $cookie_test;
    *				$cookie_test = false;
    *
    *				# Определяем имя файла (поста)
    *				$url = parse_url($_SERVER['REQUEST_URI']);
    *				$path = pathinfo($url['path']);
    *				$basename = $path['basename'];
    *
    *				if( $basename && !isset($_COOKIE[$basename]) ) {
    *					$cookie_test = true;
    *					setcookie( $basename, '1', time()+3600 );
    *				}
    *			?>
    **/
    Ответ написан
    6 комментариев
  • Почему не работает крипт для сворачивания переходов?

    @Daskus
    Вы пытаетесь навесить слушатель на коллекцию (на массив элементов). Нужно на каждый по отдельности, если используете querySelectorAll.

    let els = document.querySelectorAll('[role="group"]');
    for(let i = 0; i < els.length; i++){
      els[i].onclick = function(){
        document.querySelector('[role="treeitem"]').classList.toggle("expand");
      }
    }
    Ответ написан
    Комментировать