投稿一覧にPV数をリセットするボタン追加する方法

Cocoonカスタマイズ集
この記事は約9分で読めます。
記事内に広告が含まれています。

はじめに

Cocoonは、表1の設定を行うことで、独自のアクセス集計機能が有効になり、投稿一覧で各記事のPV数を確認できます。

Cocoon設定
設定大項目項目設定値
アクセス集計アクセス集計アクセス集計の有効化オン
管理者画面カラム表示PVを表示するオン

ただし、このアクセス数をリセットする機能はデフォルトでは搭載されていません。
アクセス数をリセットするには、プラグイン「WP-DBManager」などを使用する必要があります。

そこで、投稿一覧に「PV数リセット」ボタンを追加します。

この記事では、この方法について説明します。

投稿一覧のPVカラムに「リセット」ボタンを追加する方法

投稿一覧の PV 数がある投稿の PV カラムに「リセット」ボタンを追加します。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// 管理画面一覧のカラムにデータを表示
add_action('manage_posts_custom_column', function ($column_name, $post_id) {
  if ($column_name !== 'pv') {
    return;
  }

  // PV数を確認
  if (get_todays_pv() || get_last_7days_pv() || get_last_30days_pv() || get_all_pv()) {
    $raw_url   = admin_url("admin-post.php?action=reset_pv&id={$post_id}");
    $nonce_url = wp_nonce_url($raw_url, 'reset_pv_' . $post_id);

    echo '<a class="button button-small" href="' . esc_url($nonce_url) . '">リセット</a><br>';
  }
}, 10, 2);


// PV数をリセット
add_action('admin_post_reset_pv', function () {
  $post_id = isset($_GET['id']) ? absint($_GET['id']) : 0;

  if (!$post_id) {
    wp_die('無効な投稿IDです。');
  }

  // nonceチェック
  if (!check_admin_referer('reset_pv_' . $post_id)) {
    wp_die('セキュリティチェックに失敗しました。');
  }

  // 権限チェック
  if (!current_user_can('edit_post', $post_id)) {
    wp_die('この操作を行う権限がありません。');
  }

  // PV数を削除
  global $wpdb;
  $table_name = ACCESSES_TABLE_NAME;
  $wpdb->delete($table_name, ['post_id' => $post_id], ['%d']);

  // 元のページへ戻る
  $redirect_url  = wp_get_referer();
  $safe_redirect = wp_validate_redirect($redirect_url, admin_url('edit.php'));

  wp_safe_redirect($safe_redirect);
  exit;
});

投稿一覧の一括操作に「PV数をリセット」を追加する方法

投稿一覧の一括操作に「PV数をリセット」オプションを追加します。
これにより、複数の投稿を選択し、PV数をリセットできます。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// 一括操作にを追加
add_filter('bulk_actions-edit-post', function ($bulk_actions) {
  $bulk_actions['clear_pv'] = 'PV数をリセット';

  return $bulk_actions;
});


// 一括操作を実行
add_filter('handle_bulk_actions-edit-post', function ($redirect_url, $action, $post_ids) {
  if ($action !== 'clear_pv') {
    return $redirect_url;
  }

  // 権限のある投稿IDのみを抽出
  $valid_ids = array_filter($post_ids, function ($id) {
    return current_user_can('edit_post', $id);
  });

  if (empty($valid_ids)) {
    return $redirect_url;
  }

  global $wpdb;
  $table_name = ACCESSES_TABLE_NAME;

  // PV数を削除
  $ids_placeholder = implode(',', array_fill(0, count($valid_ids), '%d'));
  $wpdb->query(
    $wpdb->prepare(
      "DELETE FROM {$table_name} WHERE post_id IN ({$ids_placeholder})",
      $valid_ids
    )
  );

  return add_query_arg('cleared_pv', count($valid_ids), $redirect_url);
}, 10, 3);


// 通知メッセージを出力
add_action('admin_notices', function () {
  $screen = get_current_screen();

  if ($screen && $screen->id === 'edit-post' && isset($_GET['cleared_pv'])) {
    $count = absint($_GET['cleared_pv']);
    echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($count) . ' 件の投稿のPV数をリセットしました。</p></div>';
  }
});

全投稿のPV数をリセットする方法

Cocoon設定→アクセス集計に 「アクセス履歴リセット」 を追加します。
「全クリア」ボタンを押すことで、アクセス履歴をデータベースから削除します。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// 対象の処理を実行
add_action('admin_footer', function () {
  if (isset($_GET['page']) && $_GET['page'] === 'theme-access') {
    add_access_field();
  }
});


/**
 * アクセス集計(設定)のメニュー項目を追加
 *
 * @return void
 */
if (!function_exists('add_access_field')):
function add_access_field() {
  ob_start();
  ?>
  <tr>
    <th scope="row">アクセス履歴のリセット</th>
    <td>
      <form method="POST">
        <?php wp_nonce_field('clear_access_action', 'clear_access_nonce'); ?>
        <input type="hidden" name="clear_access" value="1">
        <input type="submit" class="button" value="リセット" onclick="return confirm('本当にアクセス履歴をリセットしますか?');">
      </form>
      <p class="tips">
        <span class="fas fa-info-circle"></span>
        投稿タイプpostのアクセス履歴をリセットします。
      </p>
    </td>
  </tr>
  <?php
  $html = ob_get_clean();
  ?>
  <script>
  jQuery(function ($) {
    $('#speed-up .form-table tbody').append(<?php echo wp_json_encode($html); ?>);
  });
  </script>
  <?php
}
endif;


// 管理画面からの設定データ更新
add_action('admin_init', function () {
  if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['clear_access'])) {
    return;
  }

  // nonceチェック
  if (!isset($_POST['clear_access_nonce']) || !wp_verify_nonce(wp_unslash($_POST['clear_access_nonce']), 'clear_access_action')) {
    return;
  }

  // 権限チェック
  if (!current_user_can('manage_options')) {
    wp_die('この操作を行う権限がありません。');
  }

  global $wpdb;
  $table = ACCESSES_TABLE_NAME;

  // アクセス履歴を削除
  $wpdb->delete($table, ['post_type' => 'post'], ['%s']);

  $redirect_url = admin_url('admin.php?page=theme-access&view=settings');
  wp_safe_redirect(add_query_arg('clear_access_done', '1', $redirect_url));
  exit;
});


// 通知メッセージを出力
add_action('admin_notices', function () {
  if (isset($_GET['clear_access_done']) && $_GET['clear_access_done'] === '1') {
    echo '<div class="notice notice-success is-dismissible"><p>アクセス履歴をリセットしました。</p></div>';
  }
});

参考:プラグイン「WP-DBManager」を用いた手順

WP-DBManager

以下の手順でアクセス集計をクリアします(2024年10月30日時点)。

  1. データベース→テーブルを空にする/ドロップするを選択します。
  2. wp_cocoon_accessesテーブルの空を選択します。
  3. 空にする/ドロップをクリックします。

投稿ごとではなく、全てのアクセス集計がクリアされます。

さいごに

今回紹介した方法を使えば、投稿一覧にPV数をクリアするボタンを簡単に追加できます。
これにより、個別にアクセス数のリセットが可能になります。

タイトルとURLをコピーしました