「WP Cloud」は新規受付を終了しております

WordPress向けレンタルサーバーをご検討の方は、Z.com WPをぜひご利用ください

WordPress(ワードプレス)のデータベースを操作する「wpdb クラス」で、WP上級者はこんなことをしています

いつもGMO WP Cloudをご利用いただき、ありがとうございます。当ブログでは、WordPress(ワードプレス)運営者や設置者が多く取り組まれている「WordPress(ワードプレス)カスタマイズ」に関しても、ささやかながら主要なTIPSをご提供させていただき、WordPress(ワードプレス)業界を少しでも盛り上げていければと思っております。

なお私達「GMO WP Cloud」は、WordPress(ワードプレス)に最適なサーバを月900円ご提供しています。制作会社様の納品に。WEB担当者様のお供に。ぜひ、ご検討くださいませ。

WordPress(ワードプレス)のデータベースは知っていますか?

r10

本日は少し難易度の高いWordPress(ワードプレス)のお話を致します。ただ、初心者の方においても、「WordPress(ワードプレス)を使いこなしている人は、こんな使い方もしている!」というアイデアや知見は、きっと参考になるはず。本日取り上げさせていただく「wpdb」というクラスは、取っ付きにくいのも確かなのですが、覚えておいて損はないですよ。

ところで、WordPress(ワードプレス)は、記事情報や固定ページ、カテゴリからブログ設定内容まで、すべてデータベースに保存しているのはご存知ですか。

WordPress(ワードプレス)を設定する時に一番最初に「MySQLのホスト名、ユーザーIDやパスワード」を設定した記憶のある方もいると思いますが、それのことです。WordPress(ワードプレス)を設置したい初心者の方がまず最初につまづくところですね。 ※なおGMO WP Cloudでは、申し込んだ瞬間にWordPress(ワードプレス)の設置が完了するので、このような手間すら必要ないのですけどね!

ホームページを作る時に「FTP」ソフトを用いてサーバに接続し、そこからファイルのやりとりを通じてページを作ることを覚えた初心者の方も、このデータベースの存在には違和感を覚えるようです。例えばこのページも、

https://www.wpcloud.jp/wordpress-tips/database-wpdb-class/

上記のようなURLですが、一般的なHTMLコーディングの感覚からすると「database-wpdb-class」のディレクトリの中にindex.htmlが存在することで、このページが存在しますよね。

ところがWordPress(ワードプレス)では、物理的なタグがあるわけではなく、最初に設定されたURL構造に基づいて、この例ですとwordpress-tipsの配下のdatabase-wpdb-classと名付けられた投稿をデータベースから探し、表示しているだけなのです。

物理的にファイルがないことが初心者にとっては取っ付きにくいかもしれませんが、大型のウェブアプリケーションやCMS=コンテンツ・マネージドサービスは、合理的ないくつかの理由からほぼこうした形式をとっているように思います。

この記事を読んだ後に出来ること

本記事をご覧になったあと、データベースを操作する「wpdbクラス」をご利用いただく方法やメリット、実装アイデアの概要をご理解頂き、制作の選択肢を広げることが出来ます。

WordPress(ワードプレス)のデータベース構造を把握

本日の記事のゴールとしては、WordPress(ワードプレス)のデータベースを直接操作する関数を学び、またこの関数を用いたいくつかの実装方法を学ぼうということですが、まずはWordPress(ワードプレス)そのものはどういったデータベース構造をしているのか学んでみましょう。

→WordPress(ワードプレス)のデータベースに入ってみましょう

WordPress(ワードプレス)のデータベース構造を把握し、具体的にイメージするために、データベースの内部に潜入してみましょう。通常、高度なエンジニアが「データベースに入る」というようなときは、黒い画面(コマンドプロンプト)を取り出して呪文を唱えるのですが、WordPress(ワードプレス)が設置可能な初心者向けのサーバの多くは「phpmyadmin」と呼ばれるデータベース閲覧ソフトが入っています。

db1

↑上記はGMO WP Cloudの管理パネルでのイメージ。「サイト」→操作したいホームページを選んで→「phpmyadmin」と進むことで、phpmyadminにたどり着きます。他のサーバでも、サーバ管理パネルからphpmyadminを探すことは難しくないと思いますが、phpmyadminのログイン画面でIDやパスワードを要求される場合がほとんどですので、注意です。

※GMO WP Cloudならシームレスにログインできるため、そのような複数のややこしいログイン情報を意識する必要もありません。

db2

↑上記が、phpmyadminの中身であり、WordPress(ワードプレス)のデータベースの全容です。飛行機で言うと、管理パネルがコックピットのようなものですが、このデータベースは、さらに深部の、電力系統や内部統制を司る部分のようなイメージでしょうか。

赤く囲ってあるところがデータベースの個別の「テーブル」なのですが、WordPress(ワードプレス)では11個のテーブルを使って、WordPress(ワードプレス)基本設定や記事内容、ユーザー情報などを格納しています。個別にみてみましょう。

→WordPress(ワードプレス)データベースのテーブル一覧

wp_commentmeta コメント・トラックバックのデータ一式に付随するメタデータが格納されています。
wp_comments コメント・トラックバックに関するデータ一式
wp_links 「リンク」機能で作成した情報が格納されています。
wp_options 「設定」で入力した情報。WordPress(ワードプレス)のサイト名やURLなどが格納されています。
wp_postmeta 投稿のデータ一式に付随するメタデータが格納されています。主にカスタムフィールド。
wp_posts 投稿記事やページが全てここに格納されています。「カスタムポストタイプ」で増やした投稿タイプもここに格納。リビジョン、メディアなども。
wp_terms カテゴリ・タグが収納されています。カスタムタクソノミーで増やしたカテゴリもここに。
wp_term_relationships 記事情報とカテゴリ情報を紐付けているテーブルです。
wp_term_taxonomy カテゴリ・タグの付随する情報が格納されています。
wp_usermeta 各ユーザのデータ一式に付随するメタデータが格納されています。
wp_users 登録ユーザIDなど主要情報です。

このテーブル群を上手に使いこなすことで、「wpdbクラス」を用いたカスタマイズが可能になっています。今はまだこういったテーブルを見てもピンとこない方も多いと思いますが、この中で特に使うのが「wp_posts」「wp_postmeta」であることは覚えておきましょう。

「wpdb クラス」でこんな風にカスタマイズできます

それでは、「wpdb クラス」を使っている人はどのようにして活用しているのでしょうか。テーマを改造するにあたり、具体的にどう記述しているのでしょうか。いくつか事例をピックアップしたいと思います。

※本事例は、wpdbクラスの魅力を伝えるために実際に実装されているWordPress(ワードプレス)を調査した後、似た事例を構築した架空の事例になります。一部抽象化している箇所もありますので、ご了承下さい。

→特定の文字を含む記事だけを、一覧で表示!

WordPress(ワードプレス)はいろいろな関数が揃っているので、テーマの改造にも事欠きません。しかし、ある程度初心者にも出来るようになっているため、完全に縦横無尽ということでもありません。

例えばこの事例のWordPress(ワードプレス)ユーザーで言うと、WordPress(ワードプレス)を通販サイトとして活用されており、大量の「お客様の声」を、投稿記事として保有している”恋人へのプレゼント通販サイト”です。

そして、集められた大量の「お客様の声」を、様々なページで自由に露出させたいニーズがあります。

この様々なページで様々な意図のなかで、お客様の声を露出させるということは、意外と難しい点があります。例えば「彼氏への誕生日プレゼント」というランディングページに、「彼氏へのプレゼントをご購入されたお客様の声」を抽出して表示させるには、どうしたら良いでしょうか。また同じく、「彼女への誕生日プレゼント」というランディングページに、「彼女へのプレゼントをご購入されたお客様の声」を抽出して表示したいですね。

ここでは、運営方法にもよるのですが、事前に「彼女」「彼氏」というタグを記事に設定しておけば、「wpdbクラス」の出番はありません。しかし、事前にそうした用途を想定したタグの運用ができるところも、稀です。あとから「ペア商品を買った人」の声を抽出したい、と目的が増えるかもしれませんね。

ここで「wpdbクラス」の出番です。記事の中に「彼氏」という文字列を含む投稿を一覧で表示させることで、「彼氏への誕生日プレゼント」というランディングページに、「彼氏へのプレゼントをご購入されたお客様の声」を抽出して表示させることを目指してみましょう。

「wpdbクラス」を用いて、「彼氏への誕生日プレゼント」というランディングページに設定したテーマPHPに以下の記述を行います。

$results = $wpdb->get_results(”
SELECT *
FROM `wp_post`
WHERE `post_status` = ‘publish’
AND `post_content` LIKE ‘%彼氏%’
ORDER BY RAND()
LIMIT 5
“);
foreach ($results as $value) {
print(‘<li><a href=”‘.get_permalink($value->ID).'”>’.$value->post_title.'</a></li>’);
}

上記は、PHPではなく「SQL」という言語が登場するためこの点で高度な技術になるのですが、「wpdbクラス」のシンプルな使い方として上記がまずミニマムな用途ではないでしょうか。こちらの記述について解説をさせていただきます。

$results = $wpdb->get_results(“  /*←$resultsの中に、WordPress(ワードプレス)データベースで検索した結果を格納します*/
SELECT *   /*←格納するカラムを指定します。ここでは「全カラム」を意味します。*/
FROM `wp_post`  /*←どこのテーブルを検索するのか指定します*/
WHERE `post_status` = ‘publish’  /*←記事が公開されているものを指定。リビジョンや下書きもヒットしてしまうのを防止*/
AND `post_content` LIKE ‘%彼氏%’  /*←post_contentというカラム(記事本文)に彼氏という文字列が含まれているかどうかを確認する記述です*/
ORDER BY RAND()  /*←ランダム抽出にするためにこの記述を追加。日付の新しい順・古い順なども指定可能*/
LIMIT 5  /*←5件だけ抽出するための記述*/
“);
foreach ($results as $value) {  /*←wpdbクラスでとれた値を取り出すためにループを開始*/
print(‘<li><a href=”‘.get_permalink($value->ID).'”>’.$value->post_title.'</a></li>’);
/*↑記事IDからパーマリンクを取得し、記事タイトルにリンク。*/
}

これで、テーマPHPの任意の場所に「彼氏という文字列を含む記事」を表示させることに成功しました。

SQLプログラミングの観点からいうと、「SELECT *」という一文は、テーブルにある全ての情報を持ってくるため、重くなる原因になったり推奨されていない書き方です。厳密には使うカラムだけを指定する「SELECT ID,post_title」としたほうがベターではありますが、まずは分かりやすく記しています。

→テーブルを追加し、独自の情報を露出させる!

一つ目の事例では、既存のWordPress(ワードプレス)の記事に対しデータベースを検索するwpdbクラスを用いました。今回の事例では、新しくデータベースを追加して、そのデータベースを使って既存記事の付随情報を自動表示させるプログラムを作ってみましょう。

この事例では、通信会社のインターネット料金をまとめたアフィリエイトサイトとします。10の会社に、全80のプランがあり、会社名もプラン名もアフィリエイトサイトのあちこちに詳細を書く必要があるものの、会社名もプラン名も価格も頻繁に変わる!という場合には、その都度大量に増やした記事の全ての価格やプラン名を変えるわけにはいきません。

そのような場合にはデータベースに慣れているととても管理が楽ですね。

db4

まずはデータベースを追加。上記はGMO WP Cloudから遷移できるphpmyadminで、データベースを追加している様子です。慣れている人はローカルでCSVで表を作ってインポートしたり、手早く操作しますが、初心者にとっては見慣れぬ単語も多く、まだ取っ付きにくい印象はありそうですね。

例えば今回の「通信会社のインターネット料金をまとめたアフィリエイトサイト」ではこのようにテーブルを企画し、追加。

brand 通信会社名を格納。カラム名としては
id・・・データベースが自動で通番を付与するためのカラム
name・・・通信会社名
explain・・・会社の説明
link・・・アフィリエイトリンクを格納
plan プラン名を格納。カラム名としては
id・・・データベースが自動で通番を付与するためのカラム
brand・・・ブランドのIDを入力し紐付けるためのID
name・・・プラン名称
explain・・・プラン説明
price・・・価格を入力

※上記は架空設定のあくまで一例ですので、ご了承下さい。

上記のテーブルを準備し、データを挿入しましたら、次はWordPress(ワードプレス)側の設定。今回は「記事ごとに、ブランドとプランを登録し、記事ごとに表示させる」という改造になるため、まずは記事にカスタムフィールドを設定します。

db5

そして、single.phpのループ内に以下のような記述をしてあげることで、今回の目的が達成されます。

<?php
$brand = get_post_meta($post->ID , ‘brand’ ,true);
$plan = get_post_meta($post->ID , ‘plan’ ,true);
$brandresults = $wpdb->get_results(“SELECT * FROM brand WHERE id = ‘$brand’ LIMIT 1”);
$planresults = $wpdb->get_results(“SELECT * FROM plan WHERE id = ‘$plan’ LIMIT 1″);
?>
<h2>この記事で取り上げたブランド</h2>
<p>会社名:<?php echo $brandresults[0]->name; ?></p>
<p>会社説明:<?php echo $brandresults[0]->explain; ?></p>
<p><a href=”<?php echo $brandresults[0]->link; ?>”>申し込みはこちら</a></p><h2>この記事で取り上げたプラン詳細</h2>
<p>プラン名:<?php echo $planresults[0]->name; ?></p>
<p>プラン説明:<?php echo $planresults[0]->explain; ?></p>
<p>価格:<?php echo $planresults[0]->price; ?></p>

上記で、アフィリエイト記事ごとにプラン名・ブランド名を自動表示させることが可能になりました。アフィリエイトのようにレビュー記事や宣伝記事のあとに、決まったフォーマットでアフィリエイトリンクを貼りたい、ちょっと補足エリアを追加させたい、といった場合には、データベースで一括管理が可能なため有用でしょう。

こちらもプログラムの解説を記述させていただきます。

<?php
/* ↑PHPの開始 */
$brand = get_post_meta($post->ID , ‘brand’ ,true);
/* ↑投稿に記述されたカスタムフィールド「brand」を取得し格納します。 */
$plan = get_post_meta($post->ID , ‘plan’ ,true);
/* ↑投稿に記述されたカスタムフィールド「plan」を取得し格納します。 */
$brandresults = $wpdb->get_results(“SELECT * FROM brand WHERE id = ‘$brand’ LIMIT 1”);
/* ↑wpdb関数で、テーブル「brand」から、指定したブランド情報を取り出し、格納。 */
$planresults = $wpdb->get_results(“SELECT * FROM plan WHERE id = ‘$plan’ LIMIT 1”);
/* ↑↑wpdb関数で、テーブル「plan」から、指定したプラン情報を取り出し、格納。 */
?>
/* ↑PHPエリア終わり */
<h2>この記事で取り上げたブランド</h2>
/* ↑HTML記述 */
<p>会社名:<?php echo $brandresults[0]->name; ?></p>
/* ↑会社名を表示しています。今回は「LIMIT 1」と表示しているように取得しているのが1件ですので、ループせずに$brandresults[0]でとりだせます。 */
<p>会社説明:<?php echo $brandresults[0]->explain; ?></p>
/* ↑$brandresults[0]の中のexplainという配列に格納されているので、「->explain」と記述することで、説明文を取り出し。 */
<p><a href=”<?php echo $brandresults[0]->link; ?>”>申し込みはこちら</a></p>
/* ↑同じくテーブルの中のカラムを取得。 *//* ↑同じくテーブルの中のカラムを取得。 */
<h2>この記事で取り上げたプラン詳細</h2>
/* ↑同じくテーブルの中のカラムを取得。 */
<p>プラン名:<?php echo $planresults[0]->name; ?></p>
/* ↑同じくテーブルの中のカラムを取得。 */
<p>プラン説明:<?php echo $planresults[0]->explain; ?></p>
/* ↑同じくテーブルの中のカラムを取得。 */
<p>価格:<?php echo $planresults[0]->price; ?></p>
/* ↑同じくテーブルの中のカラムを取得。 */

記述だけ見てみると、wpdbクラスは独特かもしれませんが、とてもシンプルなものです。

※上記は記述をシンプルにするために表記を絞っていますが、カスタムフィールドにbrandの記述がある場合にのみwpdb関数を動かすなどif文で制御したり、wpdb関数の結果が得られた場合にのみ表示をする等のif文分岐を行うことも必要かと思われます。

WPCLOUDではphpmyadminも簡単に使えます。SQLと「wpdb クラス」をどんどん活用しよう

いかがでしたでしょうか。WordPress(ワードプレス)はそれ自体が非常にダイナミックで柔軟なシステムなため、その機能を使うだけでも十分に大規模なサイトを構築できます。しかし、wpdbクラスのようにデータベースを操作する術をマスターすること、またそれを活用する方法があることを把握することで、より選択肢が増えることも確かではないでしょうか。

gmo-wpcloud

GMO WP Cloudでは、phpmyadminも簡単に使えます。シームレスなパスワード連携により、一度ログインしたらMySQLだけのユーザー名やパスワード等を気にすること無く操作できます。またデータベースはとっつきにくい印象がありますが、phpmyadminで触るだけなら大事故もおきません。(SQL文を自分で書き始めると、データベース全消失や、無限ループでデータが増え続けてサーバクラッシュなどはあるのですが…)もし事故がおきても、1日毎に自動バックアップしてくれるGMO WP Cloudなら、簡単にリストア(復旧)もできるので、既存サイトを使いながら、またはテスト用サイトを作りながらいろいろいじり倒すには最適なサーバではないでしょうか。

AUTHER:GMO WP Cloudの中の人

以上、いかがでしたでしょうか。今回のTIPSを通じてあなたのWordPress(ワードプレス)に新しいアイデアが増えましたら幸いです。こちらの連載を続けられるよう、是非リクエストを頂けますと幸いです。尚、重ね重ねではありますが、私達「GMO WP Cloud」は、WordPress(ワードプレス)に最適なサーバを月900円でご提供しています。ぜひ一度ご覧下さい。

WordPress 専用高速サーバー GMO WP Cloud

関連した記事