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.

[zip href="http://iworks.pl/wp-content/uploads/2011/01/iworks_revisions.zip"]wszystkie przykłady usuwania nadmiarowych wersji wpisów[/zip]

Poprzedni

Nowy rodzaj spamu

Następne

Nadmiar postów w feedach

2 komentarze

  1. Szukałem i szukałem, wreszcie znalazłem. Dzięki

  2. kurdupel

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

Oparte na WordPress & Theme by Anders Norén