Удаление мета-ключей записей

18 нояб. 2016 г., 22:06:38
Просмотры: 16.4K
Голосов: 4

У меня есть множество мета-ключей записей, которые больше не используются, и я пытаюсь понять, как их удалить, чтобы они не отображались в списке произвольных полей в админ-панели.

Скриншот списка произвольных полей в WordPress

Этот код удаляет значения мета-полей записей:

function hp_batch_delete_post_meta(){

    // Получаем массив всех ID записей
    $post_ids = get_posts( array(
        'numberposts'   => -1,
        'fields'        => 'ids',
        'post_type'     => array('ad_upload','post', 'page'),
        'post_status'   => array('publish', 'auto-draft', 'trash', 'pending', 'draft'),
    ) );

    // Удаляем мета-данные для каждой записи
    foreach( $post_ids as $post_id ) { 
        delete_post_meta($post_id, 'my_postmeta_key_1');
        delete_post_meta($post_id, 'my_postmeta_key_2');
        delete_post_meta($post_id, 'my_postmeta_key_3');
    }
}
add_action('init', 'hp_batch_delete_post_meta');

Но я хотел бы полностью удалить мета-ключи, чтобы они не отображались в этом административном списке.

Буду благодарен за любую помощь.

1
Комментарии

Эти мета-ключи могут всё ещё существовать в базе данных. Вы можете попробовать выполнить следующий запрос и проверить, есть ли какие-либо "осиротевшие" мета-ключи SELECT * FROM {$wpdb->postmeta} as pm LEFT JOIN {$wpdb->posts} as p ON pm.post_id = p.ID WHERE p.ID IS NULL

czerspalace czerspalace
18 нояб. 2016 г. 23:06:06
Все ответы на вопрос 3
1

Это довольно старая запись, но есть гораздо лучший способ сделать это.

В ядре WordPress есть функция, которая позволяет удалять все метаданные по ключу.

delete_metadata( string $meta_type, int $object_id, string $meta_key, mixed $meta_value = '', bool $delete_all = false );

https://developer.wordpress.org/reference/functions/delete_metadata/

Используйте её следующим образом:

delete_metadata( 'post', 0, 'meta_key_to_delete', false, true );

Это будет применено ко всем типам записей, статусам публикации и т.д. Таким образом, чтобы удалить примеры мета-ключей, как указано выше:

$deletable = array( 'my_postmeta_key_1', 'my_postmeta_key_2', 'my_postmeta_key_3' );
foreach( $deleteable as $to_delete ) {
  delete_metadata( 'post', 0, $to_delete, false, true );
}
8 апр. 2020 г. 21:42:12
Комментарии

Не могу поверить, что этот ответ не получает больше голосов!

Daan van den Bergh Daan van den Bergh
27 мая 2021 г. 16:41:37
0

Если вам нужно удалить ключи по критерию с использованием подстановочных знаков (как это делал я), то можно сделать это напрямую через SQL.

DELETE FROM `wp_postmeta` WHERE `meta_key` LIKE 'weather_%'
1 нояб. 2017 г. 19:38:28
0

Я нашел это в результате обычного поиска в Google (Источник)

Вам необходимо изменить ключи мета-значений по своему усмотрению. Однако настоятельно рекомендуется сделать резервную копию базы данных перед запуском этого кода.

<?php
function delete_useless_post_meta() {
   global $wpdb;
   $table = $wpdb->prefix.'postmeta';
   $wpdb->delete ($table, array('meta_key' => '_edit_last'));
   $wpdb->delete ($table, array('meta_key' => '_edit_lock'));
   $wpdb->delete ($table, array('meta_key' => '_wp_old_slug')); }
add_action('wp_logout','delete_useless_post_meta');
?>
19 нояб. 2016 г. 04:00:21