WordPress: usuń zbędne kopie wpisów

Jeżeli posiadasz w WordPressie dużo artykułów (niech będzie, że więcej niż 5000) i na dodatek często w trakcie pisania używasz klawisza „Zapisz szkic” żeby powrócić do tworzenia artykułu po pewnym czasie lub też, już po opublikowaniu, dokonujesz w nim wielu zmian, to musisz liczyć się z tym, że baza używana przez wordpressa spuchnie o poprzednie wersje wpisów.

Najprostszą metodą jest zmiana stałej WP_POST_REVISIONS, zgodnie ze specyfikacją: Revision Management, którą tutaj przytoczę:

  1. true (wartość domyślna), -1: przechowuj wszystkie wersje wpisu, co ciekawe, jeżeli chcemy użyć explicite tego ustawienia, należy ustawić „-1”, tak tak … minus jeden
  2. false, 0: nie przechowuj żadnej dodatkowej wersji (wyjątkiem, którego nie da się wyłączyć, jest automatycznie zapisywana kopia)
  3. dowolna liczba większa niż 0 (zero): przechowuj dokładnie tyle wersji wpisu oraz tą zapisywaną automatycznie

Po ustawieniu stałej WP_POST_REVISIONS na 3 w naszej bazie … nic się nie zmieni, ponieważ nowe ustawienie dotyczy tylko nowych edycji. Więc co zrobić z tą toną danych, która zalega w naszej bazie?

Jeżeli mamy dostęp do bazy danych, to za pomocą poniższego kodu usuwamy wszystkie kopie wpisu:

DELETE a,b,c 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)
WHERE a.post_type='revision';

oraz wersja PHP, która działa dla każdego prefiksu, bo pobierająca dane z konfiguracji, przy okazji podziękowania dla Łukasza za prezentacje na WordCamp na której prezentował wykorzystanie WP w poniższy sposób.

<?php
define('WP_USE_THEMES', false);
require('wp-load.php');
global $wpdb;
$query = '';
$query .= 'DELETE a,b,c FROM '.$wpdb->posts.' a ';
$query .= 'LEFT JOIN '.$wpdb->term_relationships.' b ON (a.ID = b.object_id) ';
$query .= 'LEFT JOIN '.$wpdb->postmeta.' c ON (a.ID = c.post_id) ';
$query .= 'WHERE a.post_type=\'revision\'';
$wpdb->query($query);

Jeżeli chcemy się pozbawić tylko starszych wersji, to dla standardowego prefixa pobierz plik SQL z kodem do kasowania starszych niż 28 dni wersji wpisu.

DELETE a,b,c 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)
WHERE a.post_type='revision'
AND a.post_date &lt; DATE_ADD(NOW(), INTERVAL -28 DAY);

i to samo w PHP

<?php
define('WP_USE_THEMES', false);
require('wp-load.php');
global $wpdb;
$query = '';
$query .= 'DELETE a,b,c FROM '.$wpdb->posts.' a ';
$query .= 'LEFT JOIN '.$wpdb->term_relationships.' b ON (a.ID = b.object_id) ';
$query .= 'LEFT JOIN '.$wpdb->postmeta.' c ON (a.ID = c.post_id) ';
$query .= 'WHERE a.post_type=\'revision\' AND a.post_date < DATE_ADD(NOW(), INTERVAL -28 DAY)'; $wpdb->query($query);

Wszystkie zapytania działają i powstały na potrzeby serwisu zawierającego prawie 20k wpisów i prawie 100k rewizji. Ubytek wielkości bazy danych był … znaczący.

pobierz plik: wszystkie przykłady usuwania nadmiarowych wersji wpisów

2 odpowiedzi do “WordPress: usuń zbędne kopie wpisów”

  1. Super sprawa. Miałem prawie 9000 rekordów. Teraz mam 500. Ile ten WordPress zostawiał „kurzu”.

Możliwość komentowania jest wyłączona.

Jeżeli chcesz skomentować, napisz mail na adres marcin w domenie strony na której jesteś. Dodam twoj komentarz.