はじめに
以下の記事では、Cocoonでプラグインを使わずに、アクセスカウンターを設置する方法を紹介しています。
しかし、掲載されているコードをそのまま使用すると、フッターなどに設置した際にPV数が期待通りとならず、0件で表示されてしまうという問題が発生します。
そこで、サイト全体のPV数を正しく表示されるように修正します。
この記事では、この方法について説明します。
問題点
原因
もともとget_todays_pv()などのCocoon標準関数は、投稿ごとのアクセス数を集計(サイト全体のPV数ではありません)することを目的としています。
そのため、内部でglobal $post->IDを無条件に参照している点にこの不具合の根本原因があります。
フッターやメインループ外でショートコードが実行された場合、取得される$post->IDが0となるため、指定IDが存在しない扱いとなり0件として出力されてしまいます。
対策
Cocoon 2.9.4で新たに追加されたアクセス集計機能(cocoon_analytics_total_pv)を活用し、サイト全体の期間それぞれのPV数を取得します。
完成イメージ
本日:
103
昨日:
81
週:
565
月:
4,466
全体:
58,837
使用方法
以下にショートコードを示します。
[my_access_pv]
実装手順
以下のコードをfunctions.phpに追加します。
add_shortcode('my_access_pv', function () {
$today = current_time('Y-m-d');
// 表示項目と取得条件の配列定義
$pv_items = [
[
'key' => 'today',
'label' => '本日:',
'from' => $today,
'to' => $today,
],
[
'key' => 'yesterday',
'label' => '昨日:',
'from' => date('Y-m-d', strtotime($today . ' -1 day')),
'to' => date('Y-m-d', strtotime($today . ' -1 day')),
],
[
'key' => 'week',
'label' => '週:',
'from' => date('Y-m-d', strtotime($today . ' -6 days')),
'to' => $today,
],
[
'key' => 'month',
'label' => '月:',
'from' => date('Y-m-01', strtotime($today)),
'to' => $today,
],
[
'key' => 'all',
'label' => '全体:',
'from' => '2000-01-01',
'to' => $today,
],
];
ob_start();
?>
<div class="admin-pv site-access-pv">
<span class="fa fa-bar-chart fa-fw" aria-hidden="true"></span>
<?php foreach ($pv_items as $item): ?>
<?php $pv = cocoon_analytics_total_pv($item['from'], $item['to']); ?>
<span class="<?= esc_attr($item['key']); ?>-pv">
<span class="<?= esc_attr($item['key']); ?>-pv-label"><?= esc_html($item['label']); ?></span>
<span class="<?= esc_attr($item['key']); ?>-pv-count"><?= number_format_i18n($pv); ?></span>
</span>
<?php endforeach; ?>
</div>
<?php
return ob_get_clean();
});
さいごに
今回紹介した方法を使えば、フッターやサイドバーといった共通ウィジェットエリアに設置しても、PV数が「0」にならず正しいアクセス数を表示させることができます。
Cocoon標準のデザインを活用して実装できるため、Webサイトの統一感の維持にも効果的です。

