Intereting Posts
URL сайта всегда перед другими URL-адресами Как я могу сделать мою категорию блога необъявленной в Google? Как я могу автоматически удалять комментарии, содержащие китайские / российские знаки? Добавить интерфейс «Восстановить» Использовать заголовок сообщения в качестве аргумента для запроса Разрешения add_menu_page – что я делаю неправильно? Заказать виджеты на приборной панели Получать новые метаданные сообщения, когда (пользовательский) пост сохраняется Отзывчивый сайт на WordPress – Подавайте разные типы сообщений на каждое устройство Результаты поиска, отсортированные по типам сообщений Как разместить функцию из другого класса в аргументе add_action 2nde? выберите основное меню навигации для каждого типа пользователя из нескольких основных навигационных меню Пользовательская тема WordPress: опубликовать дату и дату показа для сообщений рядом друг с другом Номера изображений галереи? Что случилось с моей wp-галереей?

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); 

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