delete_post_meta () для целых CPT / нескольких сообщений?

Я очищаю тему, и у одного из Custom Post Types есть некоторые странные, давно прошедшие пользовательские поля.

Я хочу удалить их, к сожалению, delete_post_meta () принимает post-> ID для аргумента, в то время как я хочу выполнить это действие на всех сообщениях не только один.

Как мне это сделать? Использование цикла? Скажем, CPT называется «custom_photos», и каждый отдельный пост имеет эти настраиваемые поля.

Solutions Collecting From Web of "delete_post_meta () для целых CPT / нескольких сообщений?"

Насколько мне известно, в Core отсутствует функция для такого типа массового удаления. Самое безопасное, что нужно сделать, это выполнить Loop над сообщениями в вашем CPT и удалить поля.

$del = array( 'list', 'of', 'keys', 'to', 'delete' ); $args = array( 'post_type' => 'book', 'posts_per_page' => -1, 'ignore_sticky_posts' => true, 'fields' => 'ids', 'no_found_rows' => true ); $q = new WP_Query($args); if (!empty($q->posts)) { foreach ($q->posts as $pid) { foreach ($del as $d) { delete_post_meta($pid,$d); } } } 

Если у вас нет действительно впечатляющего количества сообщений в этом CPT или очень перегруженном сервере, это должно отлично работать для периодической очистки.

Если эти поля относятся к вашему типу сообщений, и вы не беспокоитесь о потере данных, которые могут быть связаны с другими типами сообщений, вы можете сделать то же самое с SQL .

 $del = array( 'list', 'of', 'keys', 'to', 'delete' ); $sql = "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN ('".implode("','",$del)."')"; $wpdb->query($sql); 

Это, конечно, несколько меньше «будущего доказательства», поскольку структура базы данных может измениться, хотя в этом случае я сомневаюсь.