プラグインやテーマを追加したり切り替えたりしてもどんどん蓄積されるカスタムフィールドのデータ。
WordPressの仕組みでは、データベース内の「post_meta」テーブルに保存されるようになっていて、ほとんどのプラグインやテーマでは、トラブル防止のため?なのか、それらを停止・削除してもこのデータを消すという作業は行いません。
でも、投稿や固定ページを表示するたびにこの「post_meta」テーブルにある情報を検索して必要なデータを使うという処理をするわけですから、必要のないデータは、サーバーの負荷軽減、表示速度への影響などを考えると整理しておきたいところですね。
そこで本ページでは、「サイトでカスタムフィールドキーと値が保存されているカスタムフィールドキーを見つける」「特定のカスタムフィールドキーに値が保存されているコンテンツを見つける」ためのコード例を紹介します。
どちらも有効化しているテーマのfunctions.phpへ追加することで機能します。
このページで紹介するコードは、ACFやSCFのような1つのカスタムフィールドキーに対して複数の値を配列で保存するようなタイプのデータでは正確に機能しない場合がありますのでご注意ください
サイトでカスタムフィールドキーと値が保存されているカスタムフィールドキーを見つける
まず、WordPressではカスタムフィールドを使う場合、編集画面で直接カスタムフィールド欄にキー(名前)と値を設定することは少なく、画面外に入力フォームを作って、そこに入力されたものをキーと値というセットで保存していくという使い方がほとんどでしょう。
ただそのようなケースでも、フォームに何も入力せずに保存すればキーも値も保存されないので、データベースには何も保存されることはありません。
以下のコードでは、キーが登録されていても(使える状態になっていても)値のないものは除外し、データベースにキーと値が存在するキーのみを一覧表示させることができます。
/**
* カスタムフィールドキー一覧ページを作成
*/
function pwcn_add_custom_keys_list_menu() {
add_menu_page(
'カスタムフィールドキー一覧',//$page_title
'CFキー一覧',//$menu_title
'manage_options',//$capability
'cf-keys-list',//$menu_slug
' pwcn_render_custom_keys_list_page',//$callback
'dashicons-search', // アイコン
100 // メニューの位置
);
}
add_action('admin_menu', ' pwcn_add_custom_keys_list_menu');
/**
* カスタムフィールドキー一覧ページの内容をレンダリングする
*/
function pwcn_render_custom_keys_list_page() {
global $wpdb;
// wp_postmeta テーブルからユニークな meta_key を取得
// 値が空ではないという条件 (meta_value != '') を追加
$keys = $wpdb->get_col("SELECT DISTINCT meta_key FROM {$wpdb->postmeta} WHERE meta_value != ''");
?>
<div class="wrap">
<h1>カスタムフィールドキー一覧</h1>
<?php if (!empty($keys)) : ?>
<p>このサイトで使用されているカスタムフィールドキー(値が保存されているもの)の一覧です。WordPressコアで使用されていると思われるものは背景色がグレーになっています。</p>
<p>※キーに値があるもの(投稿メタ行として存在するもの)のみを抽出するようにしていますが完全に正確なものではありませんのでご注意ください</p>
<style>
.is-core-key {
background-color: #f3f3f3;
}
</style>
<table class="wp-list-table widefat">
<thead>
<tr>
<th>カスタムフィールドキー</th>
</tr>
</thead>
<tbody>
<?php foreach ($keys as $key) :
// アンダースコアで始まるかチェック
$is_core = (substr($key, 0, 1) === '_');
$class = $is_core ? 'is-core-key' : '';
?>
<tr class="<?php echo esc_attr($class); ?>">
<td><?php echo esc_html($key); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else : ?>
<p>カスタムフィールドキーは見つかりませんでした。</p>
<?php endif; ?>
</div>
<?php
}
コードを追加すると、管理画面のメニューに「CFキー一覧」というメニューが追加され、クリックすると、1件でもキーと値がセットで保存されているキーの一覧が表示されます。
一覧ではWordPressのコア(本体)で使用されているキーはグレー背景で表示するようにしています。
WordPressのコアではキーの接頭辞に隠しフィールドであると示す「__」が付いていることが多いので、それでコアのフィールドかどうかを判断していますが、プラグインやテーマによってはその接頭辞を使っている(隠しフィールドにしている)こともあるので100%正確な判別ではありません
この一覧から「ん?このキー何に使われてる?」というものがあれば、次項の検索機能を使って使われているコンテンツ(投稿や固定ページなどすべてのコンテンツ)を見つけ、直接メンテナンスすることができます。
特定のカスタムフィールドキーに値が保存されているコンテンツを見つける
以下のコードを追加することで、特定のカスタムフィールドキーと値がセットで保存されているコンテンツを見つけることができます。
/***** 特定のカスタムフィールドを含むコンテンツを列記 *****/
/*** メニュー画面を追加 ***/
function pwcn_add_custom_cf_list_menu() {
add_menu_page(
'カスタムフィールド検索',// ページのタイトル
'CFキー検索',// メニューのタイトル
'manage_options', // 権限レベル
'pwcn-cf-key-search-menu',// メニューのスラッグ
' pwcn_render_custom_cf_list_page', // コンテンツ表示用関数
'dashicons-search', // アイコン
100 // メニューの位置
);
}
add_action('admin_menu', ' pwcn_add_custom_cf_list_menu');
/*** カスタムページの内容 ***/
function pwcn_render_custom_cf_list_page() {
// 検索キーワードを取得し、サニタイズ
$search_key = isset($_GET['cf_search_key']) ? sanitize_text_field($_GET['cf_search_key']) : '';
// WP_Queryの引数を設定
$args = array(
'post_type' => 'any',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => $search_key,
'compare' => 'EXISTS', // まずキーが存在することを確認
),
array(
'key' => $search_key,
'value' => '', // 値が空のものを指定
'compare' => '!=', // そして、それと等しくないものを検索
),
),
);
// 検索キーワードがある場合、meta_queryに条件を追加
if (!empty($search_key)) {
$args['meta_query'][] = array(
'key' => $search_key,
'compare' => 'EXISTS',
);
}
// 投稿を検索
$query = new WP_Query($args);
?>
<div class="wrap">
<h1>カスタムフィールドキーで検索</h1>
<form method="get" class="search-form">
<input type="hidden" name="page" value="pwcn-cf-key-search-menu">
<input type="text" name="cf_search_key" placeholder="カスタムフィールドキー名" value="<?php echo esc_attr($search_key); ?>">
<input type="submit" class="button" value="検索">
</form>
<br>
<?php if ($query->have_posts()) : ?>
<p><strong>検索結果:<?php echo $query->post_count; ?>件</strong></p>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>タイトル</th>
<th>投稿タイプ</th>
<th>編集</th>
</tr>
</thead>
<tbody>
<?php while ($query->have_posts()) : $query->the_post();
$post_type_obj = get_post_type_object(get_post_type());
$post_edit_link = get_edit_post_link(get_the_ID());
?>
<tr>
<td><?php the_title(); ?></td>
<td><?php echo esc_html($post_type_obj->labels->singular_name); ?></td>
<td><a href="<?php echo esc_url($post_edit_link); ?>" target="_blank">編集</a></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<?php elseif( empty($search_key )) : ?>
<p><strong>キーを入力してください</strong></p>
<?php else: ?>
<p><strong>「<?php echo esc_html($search_key); ?>」</strong>というキーを持つ投稿は見つかりませんでした。</p>
<?php endif; ?>
</div>
<?php
wp_reset_postdata();
}
コードを追加すると、管理画面のメニューに「CFキー検索」というのが追加され、クリックすると以下のような画面に遷移します。

この画面の入力窓にカスタムフィールドキーを入力して検索ボタンをクリックすると、値とセットで保存されているコンテンツの一覧が下図のようにずらっと表示されます。

一覧の一番右にそのコンテンツを編集する画面のリンクがありますので、クリックしてメンテナンスを行っていきます。
例えば不要なキーと値を削除して、再び同じキーで検索すれば、検索結果からそのコンテンツが消えていることが確認できる(この検索機能が機能していることが確認できる)でしょう。
手っ取り早くプラグインを使ってこの機能を実装したい方は
コードを追加してもうまくいかなかった方、コードを追加することに不安がある方、もっと手軽に機能を使いたい方などのために、以下のページでプラグイン化したものをダウンロードいただけますので、ぜひご利用ください。
コメントを残す