Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#2907: Jak ve WordPressu smazat velké množství příspěvků? Ideálně všechny?

V době kdy #tyden měl webovou verzi se na rychlofky.cz nashromáždilo dobrých 12 tisíc (velmi krátkých) příspěvků. Roky starých a také nenavštěvovaných, Google (vyhledávače) nemají rády krátké příspěvky a neumístí je do vyhledávání.

Z #tyden je navíc mezitím týdenní newsletter a web už dávno nemá smysl, takže jsem se konečně rozhoupal k tomu, že tu záplavu smetí (ano, dá se to tak nazvat) prostě smažu. 

Jak tedy smazat velké množství příspěvků ve WordPressu?

Není to tak jednoduché a sám WordPress nemá žádnou cestu jak to udělat. V administraci jde mazat po dávkách (můžete si změnit počet zobrazených na víc než ten malý základ), ale budete narážet na kapacitu serveru, omezení PHP (paměť a doba běhu). A při 12 tisících to mazat po sto kusech dost dobře nejde.

Komplikuje to i maličkost, že se mazané příspěvky pouze přemístí do Koše a pak ho budete muset vysypat – kde opět narazíte na omezení PHP a víc jak pár stovek se jich nepodaří smazat, prostě dorazí timeout.

Při mazání pozor i na používané cache, které je vhodné promazat ještě předtím, než začnete mazat. A pak finálně promazat poté co máte mazání hotovo. 

Pamatujte i na to, že mazání příspěvku nemaže v něm použitá média (obecně jakékoliv vložené věci), takže viz Jak z WordPressu smazat všechna média?

Přes plugin

Jedno z vhodných řešení je některý z pluginu – třeba WP Bulk Delete nebo Bulk WP – tam můžete mazat třeba po 500 příspěvcích (to běžně omezená PHP dávají) a rovnou zaškrtnout, že má jít o trvalé smazání (na což fakt nezapomeňte). 

Výhoda cesty před plugin je, že zpravidla smažou i transients a různé další věci, které příspěvky mohou mít někde jinde.

Mažte pomalu, ty (například) dávky 500 smazaných neuspěchejte.

Přímo v SQL

Pokud máte přístup k něčemu jako SQL Admin, tak můžete mazat přímo v SQL. Stačí použít následující příkaz:

DELETE FROM wp_posts WHERE post_type = 'post';

Nezapomeňte ale, že tohle nesmaže ony související věci, takže to také musíte udělat ručně:

DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT ID FROM wp_posts);

Přes WP-CLI

Alternativa je využít WP-CLI, tedy možnost ovládat váš WordPress přes příkazovou řádku. Tady můžete použít

wp post delete $(wp post list --post_type=post --format=ids) --force

To –force je důležité, jinak mazané skončí opět v Koši.