Как сделать счетчик просмотров страниц в Coffee CMS

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

Чтобы решить эту проблему создадим шаблон .cms/baseBlog/post.php для страниц, посещение которых мы будем считать и отключим их запись на диск с помощью нижеприведенного php-кода. А так же добавим в базу данных в таблицу pages колонку counter, в которой и будем считать число посещений.

Файл .cms/baseBlog/post.php

<?php
    // Увеличить счетчик
    $n    = $cms["page"]["counter"] + 1;
    $q    = "UPDATE pages SET counter={$n} WHERE id={$cms['page']['id']}";
    $res  = mysqli_query( $cms["base"], $q );
    // Отключить запись страницы на диск
    $cms["stages"]["write"]["disabled"] = true;
?>
<main>
    <?php echo $cms["page"]["text"]; ?>
</main>

Если у вас имеется некая главная страница, на которой выводится количество постов, то измените ее и добавьте php-код для подсчета числа постов

Файл .cms/baseBlog/frontpage.php

<?php
    // Считаем количество постов
    $date = date( 'Y-m-d H:i:s' );
    $q    = "SELECT COUNT(*) FROM pages WHERE tpl = 'post' AND `created` < '{$date}'";
    $res  = mysqli_query( $cms["base"], $q );
    $row  = mysqli_fetch_assoc( $res );
    $n    = $row["COUNT(*)"];

    // Информация о последнем посте
    $q = "SELECT * FROM pages WHERE tpl = 'post' AND `created` < '{$date}' ORDER BY id DESC LIMIT 1";
    $res = mysqli_query( $cms["base"], $q );
    $page = mysqli_fetch_assoc( $res );

    // Отключить запись страницы на диск
    $cms["stages"]["write"]["disabled"] = true;

?>
<section class="section" id="posts">
  <div class="container">
    <div class="grid">
      <div class="for_post">
        <h4>Постов <?php echo $n; ?></h4>
        <span>Последний пост</span>
        <a href="<?php echo $page["url"]; ?>">
          <img src="/baseBlog/img/icons/time.svg" alt="Дата">
          <?php echo date( "d.m.y", strtotime( $page["created"] ) ); ?>
        </a>
      </div>
          
       
<?php
    $date = date( 'Y-m-d H:i:s' );
    $q = "SELECT * FROM pages WHERE tpl = 'post' AND `created` < '{$date}' ORDER BY id DESC LIMIT 7";

    if ( $res = mysqli_query( $cms["base"], $q ) ) {

        while ( $page = mysqli_fetch_assoc( $res ) ) {

            include( __DIR__ . "/post.teaser.php" );

        }

    }
?>
    </div>
  </div>
</section>

Файл .cms/baseBlog/post.teaser.php

<?php

if ( preg_match( '/<img[^>]+data-preview[^>]*>/s', $page['text'], $m ) ) {
    $preview_img = $m[0];
} else {
    $preview_img = '';
}

if ( preg_match( '/^(.*)(<!--[\s]*preview-start[\s]*-->)(.*)(<!--[\s]*preview-end[\s]*-->)(.*)$/s', $page['text'], $m ) ) {
    $preview = $m[3];
} else {
    $preview = preg_replace( "/<h1>(.*?)<\/h1>/", "", $page['text'] );
    $preview = mb_substr( strip_tags( $preview ), 0, 500 );
    $preview = preg_replace( '/\s\S*$/', ' ...', $preview );
    $preview = "<p>{$preview}</p>";
}

//echo $preview;

?>
<div class="item__grid">
  <div class="top">
    <span>ПОСТ</span>
  </div>
  <div class="bottom">
    <h1><?php echo $page["title"]; ?></h1>
    <div class="bottom_links">
      <span>
        <img src="/baseBlog/img/icons/eye.svg" alt="">
        <?php echo $page["counter"]; ?>
      </span>
      <span>
        <img src="/baseBlog/img/icons/time_mini_green.svg" alt="">
        <?php echo date( "d.m.y", strtotime( $page["created"] ) ); ?>
      </span>
    </div>
    <?php echo $preview; ?>
    <a href="<?php echo $page["url"]; ?>">
      <img src="/baseBlog/img/icons/read_more.svg" alt="Читать статью">
      Читать
    </a>
  </div>
</div>
Комментировать
Закрыть
Сумма:
0 ₽
После согласования условий заказа мы Вам отправим счёт или ссылку c удобным способом оплаты.
Оформить заказ