WEB制作、マーケティングに関する情報をお届けします。ホームページ制作会社、テラのブログ

WordPressでサイト内検索のキーワードをデータベースに保存する方法

タグ:

オウンドメディアサイトのSEOを最適化を行う上でユーザーがサイト内でどのようなキーワードを検索しているのかということは把握することは重要です。
基本的に『検索キーワード = ユーザーが求めているコンテンツ』です。

SEO対策だけでなくオウンドメディアにおいてはコンテンツの『ネタ切れ』があった場合にも、サイト内の検索キーワードからコンテンツを設計することもできます。

検索文字列を把握する方法としてはGA(グーグルアナリティクス)を使用するのもいいですが、データベースに保存しておけば見やすい形式で表示したり、CSVで出力したりといったこともできるので使い勝手が良い場合もあります。

そこで今回は『WordPressでサイト内検索のキーワードをデータベースに保存する方法』を紹介します。
保存したデータベースからサイトに出力する方法は『PHPでデータベース内のテーブルをHTMLで出力する方法』を参考にしてください。

コードを紹介

今回はユーザーが検索した日時、検索キーワード、IPアドレスをデータベースに保存します。

functions.php

以下はfunctions.phpに記載してください。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function create_search_query_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'search_query';
// テーブルが存在しない場合にのみ作成
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
search_keyword text NOT NULL,
user_ip varchar(55) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
}
add_action('after_setup_theme', 'create_search_query_table');
// 検索クエリを保存する
function save_search_query($query) {
if (!is_admin() && $query->is_search() && $query->is_main_query()) {
global $wpdb;
$table_name = $wpdb->prefix . 'search_query';
// 現在の日時
$current_time = current_time('mysql');
// 検索キーワード
$search_keyword = get_search_query();
// ユーザーのIPアドレス
$user_ip = $_SERVER['REMOTE_ADDR'];
// データベースに挿入
$wpdb->insert(
$table_name,
array(
'search_date' => $current_time,
'search_keyword' => $search_keyword,
'user_ip' => $user_ip,
)
);
}
}
add_action('pre_get_posts', 'save_search_query');
function create_search_query_table() { global $wpdb; $table_name = $wpdb->prefix . 'search_query'; // テーブルが存在しない場合にのみ作成 if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, search_keyword text NOT NULL, user_ip varchar(55) DEFAULT '' NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } } add_action('after_setup_theme', 'create_search_query_table'); // 検索クエリを保存する function save_search_query($query) { if (!is_admin() && $query->is_search() && $query->is_main_query()) { global $wpdb; $table_name = $wpdb->prefix . 'search_query'; // 現在の日時 $current_time = current_time('mysql'); // 検索キーワード $search_keyword = get_search_query(); // ユーザーのIPアドレス $user_ip = $_SERVER['REMOTE_ADDR']; // データベースに挿入 $wpdb->insert( $table_name, array( 'search_date' => $current_time, 'search_keyword' => $search_keyword, 'user_ip' => $user_ip, ) ); } } add_action('pre_get_posts', 'save_search_query');
function create_search_query_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'search_query';

    // テーブルが存在しない場合にのみ作成
    if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
        $charset_collate = $wpdb->get_charset_collate();

        $sql = "CREATE TABLE $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
            search_keyword text NOT NULL,
            user_ip varchar(55) DEFAULT '' NOT NULL,
            PRIMARY KEY (id)
        ) $charset_collate;";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}
add_action('after_setup_theme', 'create_search_query_table');

// 検索クエリを保存する
function save_search_query($query) {
    if (!is_admin() && $query->is_search() && $query->is_main_query()) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'search_query';

        // 現在の日時
        $current_time = current_time('mysql');
        // 検索キーワード
        $search_keyword = get_search_query();
        // ユーザーのIPアドレス
        $user_ip = $_SERVER['REMOTE_ADDR'];

        // データベースに挿入
        $wpdb->insert(
            $table_name,
            array(
                'search_date' => $current_time,
                'search_keyword' => $search_keyword,
                'user_ip' => $user_ip,
            )
        );
    }
}
add_action('pre_get_posts', 'save_search_query');

検索フォーム

seachform.phpに以下を登録して『<?php get_search_form(); ?>』で呼び出し、もしくはテンプレートファイルなどに直書きでも構いません。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<form role="search" method="get" action="<?php echo home_url() ?>" >
<div class="s-box fle_l">
<input type="hidden" name="post_type" value="post">
<input type="text" value="" name="s" class="search-text" placeholder="キーワードで検索">
<button type="submit" class="search_btn" value="" aria-label="キーワード検索ボタン" >検索</button>
</div>
</form>
<form role="search" method="get" action="<?php echo home_url() ?>" > <div class="s-box fle_l"> <input type="hidden" name="post_type" value="post"> <input type="text" value="" name="s" class="search-text" placeholder="キーワードで検索"> <button type="submit" class="search_btn" value="" aria-label="キーワード検索ボタン" >検索</button> </div> </form>
<form role="search" method="get" action="<?php echo home_url() ?>" >
    <div class="s-box fle_l">
        <input type="hidden" name="post_type" value="post">
        <input type="text" value="" name="s" class="search-text" placeholder="キーワードで検索">
        <button type="submit" class="search_btn" value="" aria-label="キーワード検索ボタン" >検索</button>
    </div>
</form>

コードを解説

テーブルの作成

まずはDB内にテーブルがあるかどうかを確認して、テーブルがない場合は作成します。
『function create_search_query_table() {}』でテーブル確認のフックを設定していきます。
『$wpdb』でデータベースに接続、データを取得します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
global $wpdb;
global $wpdb;
global $wpdb;

次にデータベースのプレフィックス、それ以降の命名したいテーブル名を結合してテーブル名の実際に登録してあるテーブル名を代入します。デフォルトの場合は『wp_○○○○』になっているはずです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$table_name = $wpdb->prefix . 'search_query';
$table_name = $wpdb->prefix . 'search_query';
$table_name = $wpdb->prefix . 'search_query';

次にテーブルが存在するかどうかの確認を行います。
ない場合はテーブルを作成します。
まずは『$charset_collate = $wpdb->get_charset_collate();』でWordPressに設定してある文字コードを取得します。次に『CREATE TABLE』で変数にテーブルを作る命令文を設定します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
search_keyword text NOT NULL,
user_ip varchar(55) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
$sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, search_keyword text NOT NULL, user_ip varchar(55) DEFAULT '' NOT NULL, PRIMARY KEY (id) ) $charset_collate;";
$sql = "CREATE TABLE $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT,
    search_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
    search_keyword text NOT NULL,
    user_ip varchar(55) DEFAULT '' NOT NULL,
    PRIMARY KEY (id)
) $charset_collate;";

『dbDelta()』というテーブル名を更新する関数を使用します。
1行前の『require_once(ABSPATH . ‘wp-admin/includes/upgrade.php’);』は『dbDelta()』を呼び出すためのディレクトリの読み込みです。セットになると考えてください。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql);
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);

最後に『add_action(‘after_setup_theme’, ‘create_search_query_table’);』でフックを設定します。

テーブルに検索クエリを保存する

『function save_search_query($query) {}』で関数を作成します。
管理画面での発火を防ぐために以下で管理画面以外、メインクエリー、ホームの時に限定して処理を実行するようにします。ここは必要に応じて条件を書くと良いでしょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
if (!is_admin() && $query->is_search() && $query->is_main_query()) {}
if (!is_admin() && $query->is_search() && $query->is_main_query()) {}
if (!is_admin() && $query->is_search() && $query->is_main_query()) {}

データベースの情報を取得、テーブル名を設定します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
global $wpdb;
$table_name = $wpdb->prefix . 'search_query';
global $wpdb; $table_name = $wpdb->prefix . 'search_query';
global $wpdb;
$table_name = $wpdb->prefix . 'search_query';

保存する内容を変数に設定していきます。
以下は現在の日時、、検索キーワード、ユーザーIPですが、UserAgentやClientHintsからデバイス情報、言語情報、ブラウザ情報などさまざまなデータが取得できますので必要なものを設定してください。
※データの種類を追加する場合はカラムの追加も必要になります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 現在の日時
$current_time = current_time('mysql');
// 検索キーワード
$search_keyword = get_search_query();
// ユーザーのIPアドレス
$user_ip = $_SERVER['REMOTE_ADDR'];
// 現在の日時 $current_time = current_time('mysql'); // 検索キーワード $search_keyword = get_search_query(); // ユーザーのIPアドレス $user_ip = $_SERVER['REMOTE_ADDR'];
// 現在の日時
$current_time = current_time('mysql');
// 検索キーワード
$search_keyword = get_search_query();
// ユーザーのIPアドレス
$user_ip = $_SERVER['REMOTE_ADDR'];

『$wpdb->insert{}』でデータベースに挿入します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// データベースに挿入
$wpdb->insert(
$table_name,
array(
'search_date' => $current_time,
'search_keyword' => $search_keyword,
'user_ip' => $user_ip,
)
);
// データベースに挿入 $wpdb->insert( $table_name, array( 'search_date' => $current_time, 'search_keyword' => $search_keyword, 'user_ip' => $user_ip, ) );
// データベースに挿入
$wpdb->insert(
    $table_name,
    array(
        'search_date' => $current_time,
        'search_keyword' => $search_keyword,
        'user_ip' => $user_ip,
    )
);

最後にフックを設定して終了です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_action('pre_get_posts', 'save_search_query');
add_action('pre_get_posts', 'save_search_query');
add_action('pre_get_posts', 'save_search_query');

まとめ

以上、『WordPressでサイト内検索のキーワードをデータベースに保存する方法』でした。
GAでも検索文字列は確認できますが絞り込みするのが面倒な場合もあるでしょう。また、今回の方法にデバイス情報、言語情報、ブラウザ情報などを加えれば、ユーザーのことをもっと深掘りできるでしょう。

また、保存したデータベースからサイトに出力する方法は『PHPでデータベース内のテーブルをHTMLで出力する方法』を参考にしてください。

テラ合同会社(東京都)

テラは2014年に東京都でスタートアップしたホームページ制作会社です。ホームページ制作以外にも広告運用、マーケティング、ブランディング、印刷物など幅広い領域をサポートしています。
コーポレートサイトはこちらをご覧ください。