Очищення бази даних WordPress

Привіт:) У цьому пості покажу, як очистити базу даних WordPress від зайвого сміття шляхом виконання SQL-запитів та PHP-коду.

Видалити всі тимчасові опції (транзієнти, transients)

DELETE FROM `wp_options` WHERE `option_name` LIKE ('_transient_%');
DELETE FROM `wp_options` WHERE `option_name` LIKE ('\_transient\_%');
DELETE FROM `wp_options` WHERE `option_name` LIKE ('_site_transient_%');

Видалити всі наявні ревізії

// Спосіб 1

DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');
DELETE FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%';

// Спосіб 2

DELETE a,b,c,d
	FROM wp_posts a
		LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
		LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
		LEFT JOIN wp_comments d ON (a.ID = d.comment_post_ID)
	WHERE a.post_type = 'revision'

Також видалити ревізії можна через код у functions.php:

/**
 * Manual cleanup of revisions (analog of SQL query)
 * Run once via: /wp-admin/?cleanup_revisions=1
 */
add_action( 'admin_init', function() {
    if (
        ! current_user_can( 'administrator' ) ||
        ! isset( $_GET['cleanup_revisions'] ) ||
        $_GET['cleanup_revisions'] != '1'
    ) {
        return;
    }

    global $wpdb;

    // Знайти всі revision ID
    $revision_ids = $wpdb->get_col( "
        SELECT ID
        FROM {$wpdb->posts}
        WHERE post_type = 'revision'
        AND post_name LIKE '%revision%'
    " );

    if ( empty( $revision_ids ) ) {
        wp_die( 'No revisions found.' );
    }

    $ids = implode( ',', array_map( 'intval', $revision_ids ) );

    // Видаляємо мета-дані
    $wpdb->query( "
        DELETE FROM {$wpdb->postmeta}
        WHERE post_id IN ($ids)
    " );

    // Видаляємо терм-звʼязки
    $wpdb->query( "
        DELETE FROM {$wpdb->term_relationships}
        WHERE object_id IN ($ids)
    " );

    // Видаляємо самі revision
    $wpdb->query( "
        DELETE FROM {$wpdb->posts}
        WHERE ID IN ($ids)
    " );

    wp_die( 'Revisions cleaned: ' . count( $revision_ids ) );
} );

Щоб запустити скрипт, відкрийте https://site.com/wp-admin/?cleanup_revisions=1. Після успішного видалення ревізій ви побачите щось подібне до Revisions cleaned: XXX. Далі скрипт потрібно видалити або закоментувати до наступного використання.

до змісту ↑

Видалити всі метаполя за вказаним ключем

Функція delete_post_meta() видаляє метаполя лише вказаного поста. Якщо потрібно видалити всі довільні поля всіх записів, додайте PHP-код у файл functions.php

global $wpdb;
$meta_key = 'meta_field_name';
$deleted_db_rows = $wpdb->query(
	$wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key )
);
echo $deleted_db_rows;

У коді значення meta_field_name замініть на назву метаполя, яке потрібно видалити. Після завершення роботи коду видаліть його або закоментуйте.

Також можна скористатися ще одним варіантом для видалення полів із назвою, наприклад "meta_name":

DELETE pm FROM wp_postmeta pm WHERE pm.meta_key = 'meta_name';
до змісту ↑

Видалити елементи таксономії, що не використовуються

Якщо видалити, наприклад, велику кількість записів WordPress, то у базі даних залишається багато сміття (наприклад, порожніх тегів (міток). Для цього використовуйте наступний SQL-запит:

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE `count` = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id NOT IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id NOT IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

Якщо потрібно видалити тільки порожні теги:

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy='post_tag' AND count=0 );

Для оптимізації таблиць методом очищення індексів і дефрагментації файлів даних, що не використовуються:

OPTIMIZE TABLE `wp_terms` , `wp_term_taxonomy` , `wp_term_relationships`;
до змісту ↑

Видалити мета дані, які не вже не існують

SELECT * FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;
Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, інтернет-магазини, блоги на WordPress. Надаю консультації з WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *