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ę:
- 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
- false, 0: nie przechowuj żadnej dodatkowej wersji (wyjątkiem, którego nie da się wyłączyć, jest automatycznie zapisywana kopia)
- 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 < 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]
Robert
Szukałem i szukałem, wreszcie znalazłem. Dzięki
kurdupel
Super sprawa. Miałem prawie 9000 rekordów. Teraz mam 500. Ile ten WordPress zostawiał „kurzu”.