【WordPress】データベース調査SQLメモ

テーブル名は環境によって異なる場合があるので、各自でお調べ下さい。

不要レコード調査

とあるサイトで、カスタムフィールドが大量にあるカスタム投稿に、大量の非公開または下書き投稿が残っており、どれほどのレコードが記録されているのか調査して驚愕したことがありました。

一般公開されていない投稿のレコード

自動保存を含む下書き・非公開・ごみ箱・リビジョン(過去の履歴)のレコードを取得します。

カスタムフィールドがある場合、後述するレコードも記録されています。

SELECT *
FROM wp_post
WHERE post_status = 'draft'
	OR post_status = 'auto-draft'
	OR post_status = 'private'
	OR post_status = 'trash'
	OR (
		post_status = 'Inherit'
		AND post_type = 'revision'
	)

上記の投稿に紐づくカスタムフィールドのレコード

カスタムフィールド1個につき1レコードのようで、リピーターフィールド等で大量のカスタムフィールドを持つ投稿を大量に作っていると凄いレコード数になるようです。

レコード数が多いと、MySQLの管理画面がフリーズしかねないので、とりあえずcountだけしています。カラムの値を一覧で見たいならLIMITで絞った方が良さそうです。

SELECT COUNT (*)
FROM wp_postmeta
WHERE post_id
IN (
	SELECT ID
	FROM wp_post
	WHERE post_status = 'draft'
		OR post_status = 'auto-draft'
		OR post_status = 'private'
		OR post_status = 'trash'
		OR (
			post_status = 'Inherit'
			AND post_type = 'revision'
		)
)

これらのレコードは、紐づいている投稿を管理画面やWP_CLIで削除すると、自動的に削除されるようです。

複数の投稿タイプがある場合は、投稿タイプ別かつ投稿ステータス別でカスタムフィールドのレコード数を調べます。

SELECT post.post_type, post.post_status, COUNT(*)
FROM `wp_postmeta` meta
INNER JOIN `wp_posts` post
ON post.id = meta.post_id
WHERE meta.post_id
IN (
	SELECT ID
	FROM `wp_posts`
	WHERE
		`post_status` = 'draft'
		OR `post_status` = 'auto-draft'
		OR `post_status` = 'private'
		OR `post_status` = 'trash'
		OR (`post_status` = 'inherit' AND `post_type` = 'revision')
)
GROUP BY post.post_type, post_status
ORDER BY post.post_type ASC

さらに、リビジョン(ヒストリー、履歴)の投稿に紐づくカスタムフィールドのレコード数も調べるなら下記のようになります。(投稿タイプ別です)

SELECT post2.post_type, COUNT(*)
FROM `wp_postmeta` meta
INNER JOIN `wp_posts` post
INNER JOIN `wp_posts` post2
ON post.id = meta.post_id AND post.post_parent = post2.id
WHERE `post_id`
IN (
	SELECT ID
	FROM `wp_posts`
	WHERE
		`post_status` = 'inherit' AND `post_type` = 'revision'

)
GROUP BY post2.post_type
ORDER BY post2.post_type ASC

過去のスラッグ書き換え履歴

同じ投稿のスラッグを書き換え続ける運用をしていると増えていきます。

SELECT *
FROM wp_postmeta
WHERE meta_key = 'wp_old_slus'

カスタム投稿の画像URL一覧(ACF画像フィールド使用)

Advanced Custom Fieldの画像フィールドで登録した画像のURLを、各投稿ごとに抽出したくて書いたSQLです。前提条件として、画像フィールドはURLを返す形式を指定しています。

SELECT
	pm1.post_id,
	p.post_title,
	pm1.meta_key AS 'FieldName',
	pm2.meta_value AS 'FileName,
	p.menu_order,
	p.post_name AS 'Slug'
FROM
	wp_postmeta pm1
INNER JOIN (
	SELECT post_id, meta_key, meta_value
	FROM wp_postmeta
	WHERE meta_value NOT LIKE '%{%'
) pm2
INNER JOIN (
	SELECT ID, post_title, menu_order, post_name
	FROM `wp_posts`
) p
ON
	pm1.meta_value = pm2.post_id
	AND pm1.post_id = p.ID
WHERE pm1.post_id
	IN (
		SELECT ID
		FROM `wp_posts`
		WHERE
			`post_type` = '<カスタム投稿タイプスラッグ>'
			AND `post_status` = 'publish' ORDER BY `menu_order`
	)
	AND pm1.meta_key LIKE '<フィールドラベル名>'
ORDER BY p.menu_order ASC
タイトルとURLをコピーしました