はじめに
以下をCocoonで実現します。
CocoonはPV数をデータベースで管理しているのに対し、SWELLはカスタムフィールドで管理しています。
そのため、CocoonでデータベースからPV数を取得し、SWELL用のカスタムフィールドへ引き継ぐ必要があります。
また、SWELLは「全期間のPV数」」のみを管理する設計です。
そこで管理画面ダッシュボードに 「全期間PV数(Cocoon→SWELL)」ウィジェット を追加します。
Cocoonでウィジェット内のボタンを押すことで、Cocoon→SWELLにPV数を引き継ぎます。
この記事では、この方法について説明します。
完成イメージ

実装手順
以下のコードをfunctions.phpに追加します。
// ダッシュボードウィジェットを追加
add_action('wp_dashboard_setup', function () {
wp_add_dashboard_widget(
'sync-post-views',
'全期間PV数(Cocoon→SWELL)',
'render_sync_post_views'
);
});
/**
* ダッシュボードにウィジェットを出力
*
* @return void
*/
if (!function_exists('render_sync_post_views')):
function render_sync_post_views() {
?>
<form method="post">
<?php wp_nonce_field('sync_post_views_action', 'sync_post_views_nonce'); ?>
<input type="hidden" name="sync_post_views" value="1">
<button type="submit" class="button button-primary">PV同期</button>
</form>
<?php
if (!isset($_POST['sync_post_views'])) {
return;
}
// nonceチェック
check_admin_referer('sync_post_views_action', 'sync_post_views_nonce');
// 公開済み投稿IDを全件取得
$posts = get_posts([
'post_type' => 'post',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
]);
foreach ($posts as $post_id) {
global $post;
$post = get_post($post_id);
setup_postdata($post);
// 全期間PV数を取得
$views = intval(get_all_pv());
// PV数をSWELLカスタムフィールドに保存
update_post_meta($post_id, 'ct_post_views_byloos', $views);
}
wp_reset_postdata();
// 成功通知をTransientに保存
set_transient('my_admin_notice', 'PV数をカスタムフィールドに同期しました。', 30);
// ダッシュボードへリダイレクト
wp_safe_redirect(admin_url('index.php'));
exit;
}
endif;
// 通知メッセージを出力
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で蓄積したPV数をSWELLへスムーズに引き継ぐことができます。
テーマを変更しても閲覧データを無駄にせず、アクセス解析や関連記事の精度を保てるのは大きなメリットです。
移行作業の一環として取り入れてみてください。


