人気記事のカウントが更新されない時の対処法

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

原因

Cocoonのアクセス情報は、データベースのwp_cocoon_accessesテーブルに保存されます。
以下のような状態になると、カウントが更新されなくなります。

  • idがAUTO_INCREMENTになっていない
  • id=0が存在している

通常は発生しませんが、何らかのデータベース操作の影響が考えられます。

対策

phpMyAdminでSQLを実行

参照リンクにも書かれている通り、phpMyAdminにログインして、以下を実行すると改善できます。

SET @n:=0;
UPDATE wp_cocoon_accesses SET id=@n:=@n+1;
ALTER TABLE wp_cocoon_accesses AUTO_INCREMENT = 1;

管理画面ダッシュボード「wp_cocoon_accesses修復」ウィジェット を追加

管理画面ダッシュボードに「wp_cocoon_accesses修復」ウィジェット を追加します。
ウィジェット内のボタンを押すことで、データベースの修復を行うことができます。
直接SQLを実行するのが不安な場合でも、このウィジェットを使えば安全に修復可能です。

完成イメージ

実装手順

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

SQL 操作に不安がある場合は、こちらのウィジェットをご利用ください。

// ダッシュボードウィジェットを追加
add_action('wp_dashboard_setup', function () {
  wp_add_dashboard_widget(
    'reset-cocoon-ids',
    'wp_cocoon_accessess修復',
    'render_reset_cocoon_ids'
  );
});


/**
 * ダッシュボードにウィジェットを出力
 *
 * @return void
 */
if (!function_exists('render_reset_cocoon_ids')):
function render_reset_cocoon_ids() {
  ?>
  <div class="reset-cocoon-ids">
    <form method="post" class="reset-cocoon-ids__form">
      <?php wp_nonce_field('reset_cocoon_ids_action', 'reset_cocoon_ids_nonce'); ?>
      <input type="hidden" name="reset_cocoon_ids" value="1">
      <button type="submit" class="button button-primary reset-cocoon-ids__button">
        修復
      </button>
    </form>
  </div>
  <?php
}
endif;


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

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

  // 権限チェック
  if (!current_user_can('manage_options')) {
    return;
  }

  global $wpdb;
  $table = ACCESSES_TABLE_NAME;

  // リセット
  $wpdb->query("SET @n:=0");
  $wpdb->query("UPDATE {$table} SET id=@n:=@n+1");
  $wpdb->query("ALTER TABLE {$table} AUTO_INCREMENT = 1");

  set_transient('my_admin_notice', 'wp_cocoon_accessesの修復が完了しました。', 30);

  wp_safe_redirect(admin_url('index.php'));
  exit;
});


// 通知メッセージを出力
add_action('admin_notices', function () {
  if ($notice = get_transient('my_admin_notice')) {
    echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($notice) . '</p></div>';
    delete_transient('my_admin_notice');
  }
});

さいごに

以前、Cocoonのアクセス集計が正しく動作しないとの問い合わせがありました。


当事者は、曖昧な情報しかなく、情報を言語化して、正しく第三者に伝える技術がないと、何も分かりません。

また、対面ではないので実際のデータベースの状態を確認できるわけではありません。
単に「うまくいかない」「昨日は動いていた」とか言われても、その場で見ているわけではありません。
その回答に対して、不満があったようです。

フォーラムは対面ではありません、できるだけ、情報提示を願います。
回答しなくても、私は何も困りませんし、時間を無駄にすることはあっても、得はありません。
それでもと思い有志が時間を割いて回答していることに配慮願います。

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