WordPressを使用することをやめたいという相談があったので、WordPressからデータを取り出す為の依頼があった。

最近、WordPress疲れの方からのお問い合わせが増えました


CMS問わず、CMS間の引っ越しにおいて最初に知りたい事といえば、データベースのスキーマをどのバージョンにすれば良いか?という事なので、WordPressのデータベースに関するコードを探してみることにした。

データベースの定義が頻繁に変わっているとなると、バージョンの対応が面倒だからね。


はじめにデータベースの自動設定から各テーブル名を探る為に、通常のインストールの手続きを進めてみる。


今回の記事の環境

OS:Ubuntu 20.04

MySQL:Ver 8.0.22-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))

WordPress:5.5.3



データベースの接続のための詳細の入力画面にて、テーブル接頭辞という項目がある。

もしかして、ソースコード内に、CREATEから始まるSQL構文がなくて、PHPでSQL構文を生成するのか?


しょうがないので、ソースコードを追うことにした。

最初にインストールに関するコードを探して、下記のファイルに辿り着いた。

/インストールディレクトリ/wp-admin/install.php

install.phpの45行目に下記のコードがあった。

/** Load wpdb */
require_once ABSPATH . WPINC . '/wp-db.php';

ABSPATHはおそらくWordPressのインストールディレクトリで、WPINCはwp-includesだろうということで、

/インストールディレクトリ/wp/wp-includes/wp-db.php

を開いてみたが、一旦ここで保留にする。




WordPressのインストールの手続きを進め、自動生成されたスキーマを確認してみる。

端末でMySQLに接続し、生成されているテーブルを確認してみると、

mysql> show tables;
+-----------------------+
| Tables_in_wptest      |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0.01 sec)

となっていた。


改めて、

/インストールディレクトリ/wp/wp-includes/wp-db.php

上記のファイルを確認してみると、255行目付近から

/**
	 * List of WordPress per-blog tables.
	 *
	 * @since 2.5.0
	 * @see wpdb::tables()
	 * @var array
	 */
	var $tables = array(
		'posts',
		'comments',
		'links',
		'options',
		'postmeta',
		'terms',
		'term_taxonomy',
		'term_relationships',
		'termmeta',
		'commentmeta',
	);

	/**
	 * List of deprecated WordPress tables.
	 *
	 * 'categories', 'post2cat', and 'link2cat' were deprecated in 2.3.0, db version 5539.
	 *
	 * @since 2.9.0
	 * @see wpdb::tables()
	 * @var array
	 */
	var $old_tables = array( 'categories', 'post2cat', 'link2cat' );

	/**
	 * List of WordPress global tables.
	 *
	 * @since 3.0.0
	 * @see wpdb::tables()
	 * @var array
	 */
	var $global_tables = array( 'users', 'usermeta' );

という記述があった。


@sinceはおそらくバージョンであるから、テーブルはWordPress 2.5.0から変わっていない事がわかった。




次に把握したいことは、各テーブルのカラムはどのバージョンから一緒なのか?を把握したい。

wp_postsがブログの記事に関するテーブルであるはずなので、wp_postsの構造を調べてみる。

mysql> show fields from wp_posts;
+-----------------------+-----------------+------+-----+---------------------+----------------+
| Field                 | Type            | Null | Key | Default             | Extra          |
+-----------------------+-----------------+------+-----+---------------------+----------------+
| ID                    | bigint unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint unsigned | NO   | MUL | 0                   |                |
| post_date             | datetime        | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime        | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext        | NO   |     | NULL                |                |
| post_title            | text            | NO   |     | NULL                |                |
| post_excerpt          | text            | NO   |     | NULL                |                |
| post_status           | varchar(20)     | NO   |     | publish             |                |
| comment_status        | varchar(20)     | NO   |     | open                |                |
| ping_status           | varchar(20)     | NO   |     | open                |                |
| post_password         | varchar(255)    | NO   |     |                     |                |
| post_name             | varchar(200)    | NO   | MUL |                     |                |
| to_ping               | text            | NO   |     | NULL                |                |
| pinged                | text            | NO   |     | NULL                |                |
| post_modified         | datetime        | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime        | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | longtext        | NO   |     | NULL                |                |
| post_parent           | bigint unsigned | NO   | MUL | 0                   |                |
| guid                  | varchar(255)    | NO   |     |                     |                |
| menu_order            | int             | NO   |     | 0                   |                |
| post_type             | varchar(20)     | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)    | NO   |     |                     |                |
| comment_count         | bigint          | NO   |     | 0                   |                |
+-----------------------+-----------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)

post_contentにアタリを付けて、WordPressのコードに対して検索をかけてみると、

/インストールディレクトリ/wp-admin/includes/schema.php

に辿り着いた。


上記ファイルの25行目付近に

/**
 * Retrieve the SQL for creating database tables.
 *
 * @since 3.3.0
 * ##以下省略##
 */

という記述があった。

データベースのスキーマはWordPress 3.3.0から変更がないということがわかった。


引っ越し用のコードを書く時は、3.3.0以降対応にして、それ以前のバージョンからの引っ越しの場合はWordPressの方で3.3.0以降にアップグレードしてから引っ越しを行って欲しいという条件を追加すれば良いか。