データベースとは
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オブジェクトで複数のテーブルを扱う