WEBOPIXEL

WordPressで学ぶデータベース(MySQL)の基礎

Posted: 2017.11.29 / Category: WordPress, データベース 

WordPressはSQLを意識することなくデータベースを操作できる仕組みができてますので、普通に使用する分には困ることはありませんが、WordPressをきっかけにデータベースに興味を持った方もいるのではないでしょうか。
今回はWordPressの環境でMySQLの基礎を学んでいきたいと思います。

Sponsored Link

データベースとは

WordPressで使用されているMySQLはリレーショナルデータベース(RDB)という種類のデータベースです。
RDBは複数のテーブルの集まりになります。テーブルはExcelでいうシートのようなものです。
テーブルは列(カラム・フィールド)と行(レコード)で構成された表で成り立っています。

データベース説明図

WordPressのデータベース

WordPressのデータベースは下記11個のテーブルから構成されています。

WordPressテーブル一覧

wp_commentmeta コメント・トラックバックのメタデータ
wp_comments コメント・トラックバックのデータ
wp_links リンク作成で入力したデータ
wp_options 設定で入力したデータ
wp_postmeta カスタムフィールドなどのデータ
wp_posts 投稿記事およびページデータ
wp_terms カテゴリ・タグなどのデータ
wp_term_relationships 投稿記事・ページとカテゴリ・タグなどの関連情報
wp_term_taxonomy カテゴリ・タグなどの情報
wp_usermeta 各ユーザのメタデータ
wp_users 登録ユーザ情報

特に重要なのが記事の内容が入るwp_postsですね。
今回はこのwp_postsテーブルのみ使用します。
また、テーブルの名の先頭にあるwp_はデフォルトの接頭辞なので、変更している場合は置き換えてください。

wp_postsの主要なカラムは下記のようになっています。

wp_postsカラム一覧

ID 自動的に割り振られた投稿ID
post_date 投稿日時
post_content 本文
post_title タイトル
post_status 投稿ステータス
guid 記事のURL
post_type 投稿種別

その他カラムや詳細については下記サイトをご確認ください。

データベース構造 – WordPress Codex 日本語版

WordPressでSQLを記述する場所

素のPHPですと、データベースを利用するために初期設定をしてとかいろいろあるのですが、WordPressがインストールされている環境なら、すぐにSQLを書いてデータを取得することができます。
テンプレートの中ならどのファイルでも$wpdbが使用できますので下記のように記述します。

WordPress Template

$results = $wpdb->get_results('ここにSQL文を書きます。');
print_r($results);	// 結果を表示

テンプレート外ならwp-load.phpをインクルードすれば使用できます。

require_once('wp-load.php');
$results = $wpdb->get_results('ここにSQL文を書きます。');
print_r($results);	// 結果を表示

※以降のコードは「ここにSQL文を書きます。」の部分を置き換える形で記述します。

テーブルとカラムの指定(SELECT,FROM)

最初は扱うテーブルとカラムを指定するだけのSQL文を書いてみます。
データを取り出すSQLとしては一番シンプルな文ですね。

wp_postsテーブルのpost_titleカラムを取得してみましょう。

SELECT post_title
FROM wp_posts

SQL文は用意されたコマンドとカラム、テーブル名や条件式をセットにして記述します。
SELECTには取得するカラム名を、FROMにはテーブル名を指定します。

ブラウザで表示するとタイトルがずらっと表示されるはずです。これだけなら何も難しいことはないですね。

複数のカラムを選択

複数のカラムを選択する場合はSELECT,で区切り指定します。

SELECT post_title, post_date, post_status
FROM wp_posts

全てのカラムを選択

全てのカラムを選択したい場合*を指定します。

SELECT *
FROM wp_posts

レコード数を指定(LIMIT)

ブログの表示がメインの場合は表示数を指定することが多いと思います。
取得するレコード数を指定する場合はLIMIT句を指定します。
10件表示したい場合は、そのまま10を指定します。

SELECT * FROM wp_posts
LIMIT 10

先頭番号の指定

WordPressのアーカイブページは1ページ10件表示の場合、2ページ目に11~20番目のレコードが表示されます。
MySQLはOFFSET句を指定することで先頭から何番目のレコードから取得するか指定することができます。

SELECT * FROM wp_posts
LIMIT 10 OFFSET 10

指定したカラムで並び替えをする(ORDER BY)

指定したカラムで並び替えをしたい場合ORDER BY句を使用します。
作成日(post_date)で並び替える場合は下記のようにします。

SELECT * FROM wp_posts
ORDER BY post_date

並び順に関しては日付や数値などは問題ありませんが、漢字が含まれた文字列に関しては文字コードを基準にして並び替えられるので、日本語の場合は思った結果にならない場合があります。

降順で並び替え

ORDER BYはその後にASC(昇順)、DESC(降順)を指定することで並び順を制御します。
何も指定しないとデフォルトのASCになるので、基本的には降順にしたい場合のみ指定することになります。

SELECT * FROM wp_posts
ORDER BY post_date DESC

さまざまな条件で検索(WHERE)

WHERE句を使うとある文字列が含まれているとか、ある数値以上などさまざまな条件で検索できて一気にデータベース扱ってる感が出てきます。
WHERE句はさまざまな演算子を組み合わせることで複雑な条件で検索できるようになります。

WordPressでしたら表示される記事はpost_statusカラムにpublishの文字列のみが表示されます。
この条件でWHEREを指定してみましょう。

SELECT * FROM wp_posts
WHERE post_status = "publish"

WHERE句に演算子を追記することで、さまざまな条件で検索することができます。
次からは使用できる演算子についてみていきます。

複数の条件に合致したものだけ検索(AND)

WordPressは記事とページでコンテンツが分かれていて、記事の場合はpost_typeカラムにpostで指定されています。
これを先ほどの条件に追加する場合AND演算子で繋げて記述します。

SELECT * FROM wp_posts
WHERE post_status = "publish"
AND post_type = "post"

複数の条件でどちらかに合致したものだけ検索(OR)

先ほどは2つの条件に合致したものだけ検索しましたが、どちらかの条件に合致したものだけ検索したい場合OR演算子を使用します。
例えばpost_statusが公開と予約投稿の2つを取得したい場合は下記のようにします。

SELECT * FROM wp_posts
WHERE post_status = "publish"
OR post_status = "future"

条件に合致しないものだけ検索(NOT)

逆に指定した条件に合致しないものだけ検索したい場合は、条件式の前にNOT演算子を記述します。
公開されていない記事を検索する場合は下記のようになります。

SELECT * FROM wp_posts
WHERE NOT post_status = "publish"

指定した文字列で検索(LIKE)

post_contentカラムには記事の内容が入っています。
この中である特定の文字列が含まれている記事だけ検索したいときはLIKE演算子を使用します。

SELECT * FROM wp_posts
WHERE post_content LIKE "%WordPress%"

%は0以上の文字列というパターン文字になります。文字列の前後につけることで文章の途中に含まれていてもマッチするようになります。

複数指定した値のいずれかに合致(IN)

記事の状態が「予約投稿」と「下書き」のみ取得したいとします。
同じカラムで複数の値を検索させたい場合はIN演算子を使用します。

SELECT * FROM wp_posts
WHERE post_status IN ("future","draft")

逆に指定した値以外を取得したいときはNOT INを使用します。

SELECT * FROM wp_posts
WHERE post_status NOT IN ("future","draft")

範囲を指定して検索(BETWEEN)

ある数値の範囲内を検索したい場合はBETWEENを使用します。
WordPressでありそうなのは日付の検索ですね。例えば2015年(2015年1月1日〜2015年12月31日)に投稿された記事を検索したい場合BETWEENを使用します。

SELECT * FROM wp_posts
WHERE post_date
BETWEEN "2015-01-01" AND "2016-01-01"
ORDER BY post_date

この検索は上記のAND演算子をしてもできます。

以上です。今回はpostsテーブルしか使いませんでしたが、WordPressはその他にもカテゴリーやユーザーテーブルなどがあり、それらを組み合わせて扱うことで、複雑な検索もできるようになります。

だいぶ昔の記事ですがよかったらこちらも。
WordPressからデータベースに直接アクセスする
WordPressのwpdbオブジェクトで複数のテーブルを扱う


基礎からのMySQL 第3版 (基礎からシリーズ)


スッキリわかる SQL 入門 ドリル215問付き!

LEAVE A REPLY

コードを書く場合は<pre>で囲んでください。