Очищення бази даних 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;
