Как сделать счетчик просмотров страниц в 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>
Комментировать