WordPressでプラグインを自作してみる

はじめに

こんにちは!新人エンジニアの堀下です。今回の記事では、WordPressでプラグインを作成する方法について紹介します。
作成するプラグインは、ページが開かれるごとに閲覧数をカウントし、各記事の閲覧数をWordPress上に表示するものになります。

そもそもWordPressとは…

WordPressとは、ブログやWebサイトを簡単に作成・管理できるCMS(コンテンツ管理システム)です。管理画面から文章を入力するだけで記事を公開でき、個人ブログから企業サイトまで幅広く活用されています。この記事もWordPressの投稿機能を用いて公開されています。

プラグインの中身を実装する前に

プラグインを作成するためには、まずWordPressにプラグインであることを認識させる必要があります。

認識させる手順として、

  1. WordPressインストール先のwp-contentディレクトリに移動し、pluginsフォルダを開く
  2. 新しいディレクトリを作成し、プラグイン名(例: My-Post-Views-Counter)を付ける
  3. 新しいプラグインのディレクトリを開き、phpファイル(例: My-Post-Views-Counter.php)を作成する
  4. phpファイルを開き、プラグインヘッダーコメントを追加する

My-Post-Views-Counter.php

<?php
/**
 * Plugin Name: My Post Views Counter
 * Description: 各投稿ごとの閲覧数をカウントするプラグイン
 * Author: Hoge Hoge
 * License: GPL v2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Version: 1.0.0
 */

このプラグインヘッダーコメントが正しく記述されていれば、管理画面の「プラグイン一覧」に表示されます。あとはプラグインのコードを記述し、有効化すればプラグインを動作させることができます。プラグインヘッダーコメントには、プラグイン名や説明、作者、バージョンなどを記載できます。

少なくともプラグイン名を含める必要がありますが、WordPressのプラグイン一覧に表示される項目もあるため、他の人が見たときにも分かりやすいよう、できるだけ記述しておくことをおすすめします。ここでライセンスも記述できるのですが、せっかくなのでGPLについて少し触れようと思います。

[プラグインヘッダーコメントについて]

GPLとは

GPL(GNU General Public License)は、WordPressが採用しているオープンソースライセンスです。「誰でも自由に使えるが、その自由を次の人にも残す」ことを目的としています。GPLでは、次のことが認められています。

  • 自由に使用可能
  • 商用利用可能
  • ソースコードを改変可能
  • 改変したものを再配布可能

ただし重要な条件があります。それは再配布する場合、同じGPLライセンスのまま公開しなければならないという点です。これは「コピーレフト」と呼ばれる考え方(コピーライトの逆)で、著作権を利用し、自由を次の人にも引き継がせる仕組みです。つまり、GPLは「無料」であることではなく、「自由」であることを守るライセンスだという点がポイントです。ゲーム業界でも、エンジニアが書いたコードにライセンスが定められているのが一般的です。WordPressのGPLもその一つなので、プラグインを公開・配布する際はライセンスに気を付けましょう。

[GPLライセンスについて]

プラグインの中身を実装していく

まずは、投稿の閲覧数をカウント、取得する処理を実装します。
My-Post-Views-Counter.php


// 投稿ページ表示時に実行
function track_post_views() {
    if (!can_count_post_views()) return;

    $post_id = get_queried_object_id();
    if ( $post_id ) increment_post_views($post_id);
}
add_action('wp', 'track_post_views');

// Bot(クローラー)判定
function is_bot() {
    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) 
        ? sanitize_text_field($_SERVER['HTTP_USER_AGENT']) 
        : '';

    // User-Agentが空の場合はBot扱い
    if (empty($user_agent)) return true;
    
    $bot_list = array(
        'googlebot', 'bingbot', 'yahoo! slurp', 'duckduckbot', 'baiduspider', 'yandexbot',
        'facebookexternalhit', 'twitterbot', 'linkedinbot',
        'semrushbot', 'ahrefsbot', 'mj12bot', 
    );
   
    foreach($bot_list as $bot) {
      if (stripos($user_agent, $bot) !== false){
        return true;
      }
    }
   
    return false;
}

// 閲覧数カウント可否判定
function can_count_post_views() {

    // 管理画面除外
    if (is_admin()) return false;

    // 投稿ページ以外除外
    if (!is_singular('post')) return false;

    // プレビュー除外
    if (is_preview()) return false;

    // ログインユーザー除外
    if (is_user_logged_in()) return false;

    // Bot除外
    if (is_bot()) return false;

    return true;
}

// 閲覧数を取得
function get_post_views($post_id) {
    $count = get_post_meta($post_id, 'post_views_count', true);
    return $count ? (int) $count : 0;
}

// 閲覧数を加算
function increment_post_views($post_id) {
    $count = (int)get_post_meta($post_id, 'post_views_count', true);
    ++$count;
    update_post_meta($post_id, 'post_views_count', $count);
}

閲覧数カウントの処理の流れは次の通りです。

  1. 投稿ページにアクセスされる
  2. track_post_views()が実行される
  3. can_count_post_views()でカウント可能かどうかを判定する
  4. カウント可能であれば、increment_post_views()で閲覧数を+1する
  5. 投稿メタに保存する

では、それぞれの処理について詳しく見ていきます。

add_action('wp', 'track_post_views');

add_action関数とは、WordPressのフックシステムを使い、特定のタイミングで関数を実行するための関数です。ここでは wpフックを利用して、track_post_views()を実行しています。wpフックは、WordPressが現在表示するページを判定した後に実行されるため、is_singular関数is_page関数などの条件分岐タグを安全に使えます。今回のコードではcan_count_post_views関数内でis_singular(‘post’)を使用しているため、条件分岐タグが使えるタイミングであるwpフックを選択しています。

// クローラーかどうかを判別
function is_bot()

is_bot関数では、アクセスがクローラーかどうかを判定します。クローラーとは、Webページを自動で巡回して情報を収集するプログラムのことです。検索エンジンなどがサイトの情報を収集するために利用していますが、閲覧数に含めると実際のユーザー数よりも多くカウントされてしまう可能性があるため、HTTPリクエストヘッダに含まれるUser-Agentを確認して、Bot判定しています。

$count = (int)get_post_meta($post_id, 'post_views_count', true);
update_post_meta($post_id, 'post_views_count', $count);

閲覧数はWordPressの投稿メタ(post meta)に保存します。post_views_countという自作のメタキーを使い、get_post_meta()で取得して、閲覧があるたびにupdate_post_meta()で+1して保存します。

ここまでで、投稿の閲覧数をカウントして取得するコードを実装しました。最後に管理画面の投稿一覧で閲覧数を確認できるように、閲覧数の列を追加する処理を実装します。

// 閲覧数列を追加
function add_views_column($columns) {
    $columns['post_views_count'] = '閲覧数';
    return $columns;
}
add_filter('manage_posts_columns', 'add_views_column');

function show_views_column($column_name, $post_id) {
    if ($column_name === 'post_views_count') {
        echo get_post_views($post_id);
    }
}
add_action('manage_posts_custom_column', 'show_views_column', 10, 2);

add_filter関数とは、WordPressのフックシステムを使い、特定の処理結果を変更・カスタマイズするための関数です。ここではmanage_posts_columnsフィルターを利用して、投稿一覧のテーブル列をカスタマイズしています。add_views_column関数を通して「閲覧数」の列を追加しています。
列を追加しただけでは値は表示されないため、ここでadd_action関数を使います。今回は manage_posts_custom_columnフックを利用し、投稿一覧テーブルの各列が描画されるタイミングでshow_views_column関数を呼び出し、各投稿の閲覧数を表示しています。

これで、投稿一覧の表に閲覧数を確認できる列が追加され、実装は完了になります。
プラグインを有効化して確認してみましょう。
[WordPressの関数について]

動作確認

では実際に投稿を公開して何度か投稿ページを閲覧し、正しくカウントされるかを確認します。


投稿ページの表示も問題なく、閲覧数のカウントも正しく動作していそうですね。

まとめ

今回プラグインを作成することで、WordPressプラグイン開発の基本的な仕組みを学ぶことができました。ただし、今回の実装では、閲覧数のカウントでは同一ユーザーの重複が発生したり、Bot判定が完全ではなかったり、プラグインを有効化する前の過去の閲覧数を取得できなかったりと、まだ改善すべき点も残っています。そのため、より正確に閲覧数を取得したい場合は、GA4(Google Analytics)のAPIと連携したり、Apacheのアクセスログを利用したりする必要がありそうです。機会があれば、こうした方法にも挑戦してみたいですね。

最後までご覧いただきありがとうございました!