web-dev-qa-db-ja.com

空白のpostmetaを削除しても安全ですか?

不正なカスタムフィールドがたくさんあります。空白の値を削除すれば、DB内のかなりの領域をクリアできると思います。次のようにデータベースに問い合わせたとします。

select * from wp_postmeta where meta_value = ''

871038(!)

私の質問は、これらを削除しても大丈夫ですか?これを行うことから生じる可能性のある問題はありますか?

2
psorensen

空のカスタムフィールドを削除しても大丈夫です。

主な理由は、フィールドが設定されていない場合、get_post_meta( $id, 'metakey', true )が空の文字列を返すため、空のレコードセットを設定するのと同じことです。

get_post_meta( $id, 'metakey', false )は、値が設定されていない場合は空の配列を返すので、問題ないはずです。

この呼び出しに戻るときに空の値が設定されますが、データベースにレコードがない場合は設定されないため、すべてのメタデータを一度に取得すること(get_post_meta( $id ))が唯一の問題となります。これはいくつかのPHP_WARNINGsを引き起こす可能性がありますが、大丈夫です。

4
fischi

@fischiが指摘したように、get_post_meta()は存在しない空のメタキーに対して同じ値を返すため、すべてのメタデータを一度に取得するときに設定されているキーに頼らない限り、空の値を削除しても安全です。

WP 3.1では、フィルターadd_{$meta_type}_metadataおよびupdate_{$meta_type}_metadataを導入しました。これらのフィルターを使用して、空の値をクリーンアップしたり、データベースに保存されないようにすることもできます。 https://codex.wordpress.org/ Plugin_API/Filter_Reference/update_(meta_type)_metadata

たとえば、次のように 'my_prefix'を含むすべてのキーの偽の値をインターセプトして削除できます。

add_filter('update_post_metadata', function($check, $object_id, $meta_key, $meta_value, $prev_value) {
    if(strpos($meta_key, 'my_prefix')) {
        if(empty($meta_value)) {
            delete_post_meta($object_id, $meta_key, $prev_value);
            return true; //stop update
        }
    }
    return null; //do update 
}, 10, 5);

これは、既存のレコードをクリーンアップしないことに注意してください。

0
NXPE3