楽天セール開催中!ポイント最大11倍! セール会場へ

WordPress│GA4の人気記事をSWELL風に表示する例とキャッシュの確認

サーバー負荷はPV数だけでは判断できず、同時アクセス、キャッシュ、データベース更新の実測で確認します。

負荷が大きいと契約しているレンタルサーバーが使えなくなるケースもあります。

たとえば人気記事ランキングの表示です。

WordPress側でアクセスを集計する構成では、集計処理とランキング表示それぞれの負荷を確認します。

Simple GA4 Rankingは、GA4のデータを利用してランキングを表示するプラグインです。

キャッシュを利用する構成ですが、導入だけで負荷が減るとは断定できません。

本記事では負荷軽減の実測は行っていません。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

Simple GA4 Rankingの設定方法

以下の配布元の記事は、2022年公開の移行・設定案内です。

利用する版の対応条件と変更内容は、配布元のリポジトリでも確認してください。

ランキングが表示されない場合は、Google認証の状態に加え、対象のGA4プロパティと取得条件を確認します。

トークンの有無だけで正常と判断せず、表示されたエラーと標準ショートコードの結果を確認します。

ランキングが計測できない際に確認するGoogle認証の項目やアクセストークンの発行状況。

キャッシュと標準表示を確認する

キャッシュは管理画面のSimple GA4 RankingのCacheメニューから確認できます。

掲載画面にはDELETEボタンがありますが、削除前に対象のキャッシュと利用箇所を確認します。

管理画面のメニューからキャッシュの確認や削除ができる画面。

後述の独自ショートコードは既存キャッシュを読み取るだけで、GA4からの取得やキャッシュの再生成を行いません。

独自表示へ進む前に、標準ショートコードでランキングを表示できるか確認します。

確認に使う標準ショートコードは[sga_ranking]です。

表示するだけで必ず再取得に成功するとは限らないため、結果とキャッシュの状態を確認します。

Simple GA4 RankingのSWELL人気記事ランキング風の表示

[sga_ranking]の表示はただのリストなので、SWELL人気記事ランキング風の表示をするカスタマイズしてみました。

SWELLのクラスを利用するため、テーマのバージョンやウィジェットの設定によって見た目が異なります。

サンプル

カスタマイズによってSWELL人気記事ランキングと同じ表示形式にしたサンプルの表示例。

子テーマのfunctions.phpをバックアップし、複製環境で以下のコードを確認してから適用します。

PHPスニペット管理プラグインを使う場合は、functions.phpと重複登録せず、停止して戻す方法を確認します。

表示するショートコードは以下になります。

[sga_swell_popular_posts]


function sga_swell_popular_posts_shortcode($atts) {
    // キャッシュキーを取得
    $cache_data = get_transient('sga_ranking_result_keys');
    if (!is_array($cache_data) || !isset($cache_data['results']) || !is_array($cache_data['results']) || empty($cache_data['results'])) {
        return '集計中です。';
    }

    // キャッシュキーを検索
    if (count($cache_data['results']) !== 1) return '対象ランキングのキャッシュを1種類に限定してください。';
    $period_cache_key = '';
    foreach ($cache_data['results'] as $key => $result) {
        $period_cache_key = $key;
        break;  // 最初のキーを使用
    }

    if (!is_string($period_cache_key) || $period_cache_key === '') {
        return 'No cached data found.';
    }

    $post_ids = get_transient($period_cache_key);

    // NO IMAGE画像を取得
    $noimg_url = '';   // デフォルトのNO IMAGE画像のパスを指定してください

    if (!$post_ids) {
        return '集計データを確認してください。';
    }

    if (!is_array($post_ids) || empty($post_ids)) {
        return 'No posts found in cache';
    }

    ob_start();

    $rank = 1;
    $seen = array();
    echo '<ul class="p-postList -type-card -w-ranking">';
    foreach ($post_ids as $post) {
        if ($rank > 6) {  // 記事数が6を超えたらループを終了
            break;
        }
        $my_id = is_array($post) ? ($post[0] ?? null) : $post;
        if ((!is_int($my_id) && !is_string($my_id)) || !ctype_digit((string) $my_id)) {
            continue;
        }
        $my_id = (int) $my_id;
        if ($my_id < 1 || isset($seen[$my_id])) continue;
        $seen[$my_id] = true;
        if ($my_id && get_post_type($my_id) === 'post' && get_post_status($my_id) === 'publish' && get_post_field('post_password', $my_id) === '') {
            ?>
            <li class="p-postList__item">
                <a href="<?php echo esc_url(get_permalink($my_id)); ?>" class="p-postList__link">
                    <div class="p-postList__thumb c-postThumb">
                        <figure class="c-postThumb__figure">
                            <?php if (has_post_thumbnail($my_id)) : ?>
                                <img class="c-postThumb__img u-obf-cover" src="<?php echo esc_url(get_the_post_thumbnail_url($my_id, 'medium')); ?>" alt="<?php echo esc_attr(get_the_title($my_id)); ?>">
                            <?php elseif ($noimg_url) : ?>
                                <img class="c-postThumb__img u-obf-cover" src="<?php echo esc_url($noimg_url); ?>" alt="<?php echo esc_attr(get_the_title($my_id)); ?>">
                            <?php endif; ?>
                        </figure>
                    </div>
                    <div class="p-postList__body">
                        <div class="p-postList__title"><?php echo esc_html(get_the_title($my_id)); ?></div>
                        <div class="p-postList__meta"></div>
                    </div>
                </a>
            </li>
            <?php
            $rank++;
        }
    }
    echo '</ul>';

    return ob_get_clean();
}

add_shortcode('sga_swell_popular_posts', 'sga_swell_popular_posts_shortcode');

まとめ

このカスタマイズ例は、1種類のキャッシュをSWELL風の一覧へ表示する範囲に限定しています。

期間別の表示は、まず利用中の版の標準機能と指定できる条件を確認してください。

プラグイン本体の改修が必須とは限りません。

このコードは複数のキャッシュから期間を選択する機能を備えていないため、その用途にはそのまま使えません。

関連コードは、GitHubのMOTOKI-LLC/WAZA-codeにもまとめています。

コードの対象と検証範囲

旧版の同名関数を停止してから入れ替えます。

この例は旧記事が前提としたtransientの配列形式に依存し、キャッシュが複数あるときは任意の先頭を選ばず処理を止めます。

非公開・下書き・パスワード付き投稿を除外し、タイトルとURLをエスケープします。キャッシュの型を確認し、不正な投稿IDや重複IDは表示対象にしません。

NO IMAGEを使う場合は、自分が管理する画像の完全なURLをnoimg_urlへ指定します。

ローカルの模擬キャッシュで出力条件を検証しており、現行プラグインとGA4認証を組み合わせた取得は未検証です。

プラグインの内部形式が異なる場合はこの例を使わず、標準ショートコードと公式仕様を確認します。

戻す場合は追加した関数とショートコード登録を停止し、標準の表示へ戻します。

よくある質問:GA4の人気記事をSWELL風に表示するときの注意点

Simple GA4 Rankingを入れれば、サーバー負荷は下がりますか?

記事では、サーバー負荷はPV数だけでは判断できず、同時アクセス、キャッシュ、データベース更新の実測で確認するとしています。キャッシュを利用する構成ですが、導入だけで負荷が減るとは断定できません。本記事では負荷軽減の実測は行っていません。

ランキングが表示されないときは、何を確認しますか?

記事では、Google認証の状態に加え、対象のGA4プロパティと取得条件を確認します。トークンの有無だけで正常と判断せず、表示されたエラーと標準ショートコードの結果を確認します。

キャッシュは、どこで確認しますか?

記事では、管理画面のSimple GA4 RankingのCacheメニューから確認できます。掲載画面にはDELETEボタンがありますが、削除前に対象のキャッシュと利用箇所を確認します。

独自の表示に進む前に、何を確認しますか?

記事では、標準ショートコードでランキングを表示できるかを先に確認します。記事で紹介する独自の表示は、既存キャッシュを読み取るだけで、GA4からの取得やキャッシュの再生成は行いません。

コードを追加するときの注意点は何ですか?

記事では、子テーマのfunctions.phpをバックアップし、複製環境でコードを確認してから適用します。PHPスニペット管理プラグインを使う場合は、functions.phpと重複登録せず、停止して戻す方法を確認します。旧版の同名関数は、停止してから入れ替えます。

SWELLの人気記事ランキングと同じ見た目になりますか?

記事では、SWELLのクラスを利用するため、テーマのバージョンやウィジェットの設定によって見た目が異なるとしています。NO IMAGEを使う場合は、自分が管理する画像の完全なURLをnoimg_urlへ指定します。

期間別のランキングも、このコードで表示できますか?

そのまま使えません。記事では、このカスタマイズ例は1種類のキャッシュをSWELL風の一覧へ表示する範囲に限定していて、複数のキャッシュから期間を選択する機能を備えていないとしています。期間別の表示は、まず利用中の版の標準機能と指定できる条件を確認します。

記事のコードは、どこまで検証されていますか?

記事では、ローカルの模擬キャッシュで出力条件を検証しており、現行プラグインとGA4認証を組み合わせた取得は未検証です。プラグインの内部形式が異なる場合は、この例を使わず、標準ショートコードと公式仕様を確認します。戻す場合は、追加した関数とショートコード登録を停止し、標準の表示へ戻します。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次