WordPressでサイト内検索のキーワードをデータベースに保存する方法
カテゴリ:WEB制作
オウンドメディアサイトのSEOを最適化を行う上でユーザーがサイト内でどのようなキーワードを検索しているのかということは把握することは重要です。
基本的に『検索キーワード = ユーザーが求めているコンテンツ』です。
SEO対策だけでなくオウンドメディアにおいてはコンテンツの『ネタ切れ』があった場合にも、サイト内の検索キーワードからコンテンツを設計することもできます。
検索文字列を把握する方法としてはGA(グーグルアナリティクス)を使用するのもいいですが、データベースに保存しておけば見やすい形式で表示したり、CSVで出力したりといったこともできるので使い勝手が良い場合もあります。
そこで今回は『WordPressでサイト内検索のキーワードをデータベースに保存する方法』を紹介します。
保存したデータベースからサイトに出力する方法は『PHPでデータベース内のテーブルをHTMLで出力する方法』を参考にしてください。
コードを紹介
今回はユーザーが検索した日時、検索キーワード、IPアドレスをデータベースに保存します。
functions.php
以下はfunctions.phpに記載してください。
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(); ?>』で呼び出し、もしくはテンプレートファイルなどに直書きでも構いません。
<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』でデータベースに接続、データを取得します。
global $wpdb;
次にデータベースのプレフィックス、それ以降の命名したいテーブル名を結合してテーブル名の実際に登録してあるテーブル名を代入します。デフォルトの場合は『wp_○○○○』になっているはずです。
$table_name = $wpdb->prefix . 'search_query';
次にテーブルが存在するかどうかの確認を行います。
ない場合はテーブルを作成します。
まずは『$charset_collate = $wpdb->get_charset_collate();』でWordPressに設定してある文字コードを取得します。次に『CREATE TABLE』で変数にテーブルを作る命令文を設定します。
$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()』を呼び出すためのディレクトリの読み込みです。セットになると考えてください。
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';
保存する内容を変数に設定していきます。
以下は現在の日時、、検索キーワード、ユーザーIPですが、UserAgentやClientHintsからデバイス情報、言語情報、ブラウザ情報などさまざまなデータが取得できますので必要なものを設定してください。
※データの種類を追加する場合はカラムの追加も必要になります。
// 現在の日時 $current_time = current_time('mysql'); // 検索キーワード $search_keyword = get_search_query(); // ユーザーのIPアドレス $user_ip = $_SERVER['REMOTE_ADDR'];
『$wpdb->insert{}』でデータベースに挿入します。
// データベースに挿入 $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');
まとめ
以上、『WordPressでサイト内検索のキーワードをデータベースに保存する方法』でした。
GAでも検索文字列は確認できますが絞り込みするのが面倒な場合もあるでしょう。また、今回の方法にデバイス情報、言語情報、ブラウザ情報などを加えれば、ユーザーのことをもっと深掘りできるでしょう。
また、保存したデータベースからサイトに出力する方法は『PHPでデータベース内のテーブルをHTMLで出力する方法』を参考にしてください。