WP-Sweep

Descrición

WP-Sweep atopa as filas que WordPress deixa atrás e elimínaas. Revisións de entradas que editaches hai anos, meta pertencente a unha entrada que se eliminou, termos asociados a nada, relacións de termos que apuntan a entradas que xa non existen, datos transitorios caducados: nada diso é visible en ningures de wp-admin, e todo está na túa base de datos.

Usa as funcións de eliminación propias de WordPress sempre que poden chegar á fila, en vez de executar consultas de eliminación directas, para que os hooks nos que se apoian outros plugins sigan activándose. Só as filas que a API se nega a tocar — meta orfa cuxo ID de obxecto é 0 — elimínanse directamente.

Características

  • Revisións
  • Borradores automáticos
  • Entradas eliminadas
  • Comentarios sen aprobar
  • Comentarios spam
  • Comentarios eliminados
  • Meta de entradas orfa
  • Meta de comentarios orfa
  • Meta de usuarios orfa
  • Meta de termos orfa
  • Relacións de termos orfas
  • Termos sen usar
  • Meta de entradas duplicada
  • Meta de comentarios duplicada
  • Meta de usuarios duplicada
  • Meta de termos duplicada
  • Opcións de datos transitorios
  • Cachés de oEmbed na meta de entradas
  • Optimiza as táboas da base de datos

Funcións de eliminación usadas

  • wp_delete_post_revision()
  • wp_delete_post()
  • wp_delete_comment()
  • delete_post_meta()
  • delete_comment_meta()
  • delete_user_meta()
  • delete_term_meta()
  • wp_remove_object_terms()
  • wp_delete_term()
  • delete_transient()
  • delete_site_transient()

Incompatibilidades coñecidas

Estes plugins gardan datos en lugares que WP-Sweep le como orfos. Protexe as súas claves meta cos filtros de Usage antes de limpar.

Doazóns

Dediquei a maior parte do meu tempo libre a crear, actualizar, manter e dar soporte a estes plugins. Se che gustan de verdade e podes axudarme cun par de euros, agradecereino moito. Se non, sénteste libre de usalos sen ningunha obriga.

Uso

Toda limpeza é irreversible, así que fai primeiro unha copia de seguranza da túa base de datos.

A pantalla lista cada limpeza cunha breve descrición do que elimina, cantos elementos son e que proporción da táboa representan. Marca as que queiras e usa a acción en lote Sweep, ou usa os botóns Sweep e Details de cada fila un a un. Nada na pantalla precisa JavaScript: os botóns son ligazóns normais e a acción en lote é un formulario normal.

Non hai pantalla de axustes. O único que vale a pena axustar — cantos elementos lista Details, 500 por defecto — é o filtro wp_sweep_limit_details. O límite existe porque toda a mostra se garda en memoria e se escribe na páxina.

WP-CLI

wp sweep --all
wp sweep revisions
wp sweep revisions auto_drafts deleted_posts

API REST

As tres vías precisan a capacidade activate_plugins.

GET    /wp-json/sweep/v1/count/<name>
GET    /wp-json/sweep/v1/details/<name>
DELETE /wp-json/sweep/v1/sweep/<name>

Nomes dos elementos

revisions, `auto_drafts`, `deleted_posts`, `unapproved_comments`, `spam_comments`, `deleted_comments`, `transient_options`, `orphan_postmeta`, `orphan_commentmeta`, `orphan_usermeta`, `orphan_termmeta`, `orphan_term_relationships`, `unused_terms`, `duplicated_postmeta`, `duplicated_commentmeta`, `duplicated_usermeta`, `duplicated_termmeta`, `optimize_database`, `oembed_postmeta`.

Filtros

  • wp_sweep_postmeta_whitelist (array) — claves de meta de entrada que nunca se deben eliminar, nin pola limpeza de meta de entrada orfa nin pola de duplicada. * coincide con calquera serie de caracteres. Por defecto: baleiro.
  • wp_sweep_commentmeta_whitelist (array) — o mesmo, para a meta de comentarios.
  • wp_sweep_usermeta_whitelist (array) — o mesmo, para a meta de usuarios.
  • wp_sweep_termmeta_whitelist (array) — o mesmo, para a meta de termos.
  • wp_sweep_excluded_taxonomies (array) — taxonomías que quedan fóra da limpeza de relacións de termos orfas. Por defecto: array( 'link_category' ).
  • wp_sweep_excluded_termids (array) — IDs de termos que quedan fóra da limpeza de termos sen usar. Por defecto: o termo por defecto de cada taxonomía, máis calquera termo que sexa pai doutro.
  • wp_sweep_limit_details (int) — cantos elementos amosa unha lista de Details. Por defecto: 500.
  • wp_sweep_defer_counts (bool) — indica se a pantalla de Sweep se mostra primeiro e obtén despois os seus contos, un a un. Devolve false para calcular todos os contos coa páxina, como facían sempre as versións anteriores á 2.0.1. Por defecto: true.
  • wp_sweep_capability (string $capability, string $context) — a capacidade requirida. $context é un de sweep, ajax ou rest.
  • wp_sweep_total_count (int $count, string $name) — o número total de filas respecto ao cal se mide a porcentaxe dunha limpeza.
  • wp_sweep_count (int $count, string $name) — cantos elementos eliminaría unha limpeza.
  • wp_sweep_details (array $details, string $name) — a lista de mostra que amosa Details.
  • wp_sweep_sweep (string $message, string $name) — a mensaxe que se mostra despois de executar unha limpeza.

Accións

wp_sweep_admin_post_sweep, `wp_sweep_admin_comment_sweep`, `wp_sweep_admin_user_sweep`, `wp_sweep_admin_term_sweep`, `wp_sweep_admin_option_sweep` and `wp_sweep_admin_database_sweep` all fire below the sweep table, in that order.

Protexe claves de meta de entrada específicas para que non se limpen:

add_filter( 'wp_sweep_postmeta_whitelist', function ( $meta_keys ) {
    $meta_keys[] = '_my_plugin_setting';
    $meta_keys[] = '_acme_*';
    return $meta_keys;
} );

Exclúe unha taxonomía adicional da limpeza de relacións de termos orfas:

add_filter( 'wp_sweep_excluded_taxonomies', function ( $taxonomies ) {
    $taxonomies[] = 'product_type';
    return $taxonomies;
} );

Capturas

Instalación

  1. Instala e activa o plugin. A pantalla aparece en WP-Admin -> Ferramentas -> WP-Sweep.
  2. Fai unha copia de seguranza da túa base de datos antes de limpar nada. Toda limpeza é irreversible e non hai desfacer.

Preguntas frecuentes

A pantalla Ferramentas -> Sweep ten un novo enderezo

Segue en Ferramentas, pero o enderezo cambiou de tools.php?page=wp-sweep/admin.php a tools.php?page=wp-sweep. Actualiza os teus marcadores.

O enderezo antigo era a forma herdada de «arquivo do plugin como slug do menú», que metía o nome do directorio de instalación do plugin na URL da páxina. Por iso a pantalla fallaba para quen instalaba WP-Sweep baixo outro nome de directorio — renomeado a man, ou descomprimido como wp-sweep-2.0.0. Agora ningunha das dúas cousas ocorre.

Onde foi Sweep All?

Cada fila ten unha caixa de verificación e a táboa ten unha acción en lote Sweep, así que marcar a caixa da cabeceira e aplicala fai o que facía Sweep All — e permíteche deixar fóra as que non queiras.

O meu fragmento de código que chama a WPSweep::get_instance() deixou de funcionar

As clases cambiaron de nome na 2.0.0:

  • WPSweep agora é WP_Sweep
  • WPSweep_Api agora é WP_Sweep_API
  • WPSweep_Command agora é WP_Sweep_Command

Así, WPSweep::get_instance()->sweep( 'revisions' ) pasa a ser WP_Sweep::get_instance()->sweep( 'revisions' ). Non hai alias de compatibilidade, polo que o nome antigo provoca un erro fatal en vez de fallar en silencio.

Todos os filtros e todas as accións wp_sweep_admin_*_sweep manteñen o nome que tiñan.

Que filtros podo usar para protexer datos da limpeza?

Catro filtros por tipo reciben unha lista de claves meta que nunca se deben eliminar, e cada un admite * como comodín:

add_filter( 'wp_sweep_postmeta_whitelist', function ( $keys ) {
    $keys[] = '_my_plugin_setting';
    $keys[] = '_acme_*';
    return $keys;
} );

O mesmo aplícase a wp_sweep_commentmeta_whitelist, wp_sweep_usermeta_whitelist e wp_sweep_termmeta_whitelist. Os termos protéxense con wp_sweep_excluded_termids, e as taxonomías quedan fóra da limpeza de relacións de termos orfas con wp_sweep_excluded_taxonomies.

Na 2.0.0 estas listas tamén protexen as limpezas de meta duplicada, algo que a documentación sempre dixo que facían e o código nunca fixo.

Unha clave que protexín foi limpada igualmente, ou conservouse moito de máis

Antes da 2.0.0 a exclusión era unha cláusula SQL LIKE, e LIKE trata un guion baixo como comodín dun só carácter. Un padrón de _my_key tamén coincidía con Xmy!key, e con bastantes máis. Agora a coincidencia faise en PHP, así que un guion baixo é un guion baixo e só * é un comodín. Revisa a túa lista se dependías do comportamento antigo.

Deixa WP-Sweep algo atrás cando o elimino?

Nada. WP-Sweep non garda filas de opcións, non crea táboas na base de datos, non rexistra capacidades nin programa eventos. uninstall.php execútase igualmente e limpa todo nunha rede enteira en vez de só nos primeiros cen sitios.

Comentarios

26 de Marzo de 2025
WP-Sweep is a simple yet powerful plugin that helps keep your WordPress site running smoothly. It cleans up unnecessary data like post revisions, trashed posts, spam comments, unused terms, and more — all using native WordPress functions, which makes it safer than many alternatives. We've used WP-Sweep on multiple websites and it's never caused any issues. It's lightweight, user-friendly, and does exactly what it promises. The interface is clear and makes it easy to choose what to clean. Highly recommended for anyone looking to optimize their WordPress database without the risk of breaking anything.
22 de Xaneiro de 2025
great and simple plugin, no licence shit – it just works, thanks!
Ler todas as 139 opinións

Colaboradores e desenvolvedores

“WP-Sweep” é un software de código aberto. As seguintes persoas colaboraron con este plugin.

Colaboradores

“WP-Sweep” foi traducido a 25 idiomas. Grazas aos desenvolvedores polas súas contribucións.

Traduce “WP-Sweep” ao teu idioma.

Interesado no desenvolvemento?

Revisa o código, bota unha ollada aorepositorio SVN, ou subscríbete ao log de desenvolvemento por RSS.

Rexistro de cambios

2.0.1

  • NEW: Unha ligazón Sweep na fila do plugin na pantalla de Plugins, que abre Ferramentas -> Sweep.
  • FIXED: A pantalla de Sweep esgotaba o tempo en bases de datos grandes. A 2.0.0 calculaba todos os contos antes de imprimir un só byte — e pedía o total de filas de cada táboa unha vez por fila en vez de unha soa, así que SELECT COUNT(*) executábase catro veces por carga contra a táboa postmeta. Agora a pantalla móstrase ao momento e obtén os contos despois, unha petición cada vez, de modo que ningunha petición supera o límite de tempo de PHP. Sen JavaScript, unha ligazón calcúlaos coa páxina como sempre fixo a 2.0.0, e o novo filtro wp_sweep_defer_counts restaura ese comportamento por completo.
  • FIXED: Contar as limpezas de meta duplicada obtiña en PHP os ids de todas as filas duplicadas mediante GROUP_CONCAT, só para sumalos. Nunha táboa postmeta con millóns de duplicados isto só podía esgotar a petición. Agora o conto le só os totais por clave; os ids lense onde se necesitan, na limpeza que os elimina.

2.0.0

  • FIXED: Termos sen usar lía «sen usar» na columna de conto, e o contador do propio núcleo conta entradas publicadas — así que un termo usado só por borradores, entradas pendentes, privadas ou na papeleira amosaba un conto de cero e eliminábase, levándose as súas relacións. Esas entradas volvían sen etiquetas e sen nada que dixese por que. Agora un termo ten que estar asociado a nada en absoluto
  • FIXED: Limpar os termos dunha taxonomía que xa non rexistra nada rematou con DELETE FROM wp_terms WHERE term_id NOT IN ( SELECT term_id FROM wp_term_taxonomy ), que son todas as filas soltas da táboa en vez das que a limpeza acababa de deixar orfas. Elimináronse con elas filas que a pantalla nin contara nin listara. Agora nomea os termos que deixou orfos
  • FIXED: Relacións de termos orfas decidía que unha fila era orfa buscando o seu object_id en wp_posts — o que só fai a pregunta correcta cando a taxonomía pertence a entradas. Para unha taxonomía rexistrada para usuarios ou comentarios, object_id é un ID de usuario ou comentario, así que se eliminaba toda relación cuxo ID superase o das entradas mentres o usuario seguía aí. link_category excluíase a man exactamente por este motivo; agora a exclusión dedúcese do que cada taxonomía ten rexistrado
  • FIXED: A limpeza de oEmbed coincidía con %_oembed_%, e nun padrón LIKE un guion baixo coincide con calquera carácter único — así que significaba «calquera clave meta que conteña oembed cun carácter a cada lado», e era unha coincidencia de contido en vez de de prefixo. As claves doutros plugins eliminábanse definitivamente xunto coas cachés. WordPress escríbeas como _oembed_{hash}, así que agora o padrón ancórase ao principio cos seus guións baixos escapados
  • FIXED: A limpeza de oEmbed era a única limpeza de meta que nunca consultaba a lista de claves protexidas, así que unha clave que un sitio engadira expresamente a wp_sweep_postmeta_whitelist eliminábase igualmente — a lista mesmo se lía para ela e despois ignorábase
  • FIXED: Optimizar a base de datos executaba SHOW TABLES sen prefixo, que son todas as táboas do esquema. Nunha base de datos compartida entre instalacións — un aloxamento habitual — a vista de detalles listaba as táboas de todos os demais inquilinos, e a limpeza executaba OPTIMIZE TABLE en instalacións que este administrador non administra. Agora limítase ao prefixo desta instalación, con wp_sweep_optimize_tables para un sitio que queira máis
  • BREAKING: Require WordPress 6.8 e PHP 8.2.
  • BREAKING: A pantalla segue en Ferramentas pero o seu enderezo cambiou, de tools.php?page=wp-sweep/admin.php a tools.php?page=wp-sweep. A forma antiga metía o nome do directorio de instalación na URL.
  • BREAKING: As clases cambiaron de nome: WPSweep -> WP_Sweep, WPSweep_Api -> WP_Sweep_API e WPSweep_Command -> WP_Sweep_Command. Todos os filtros e accións manteñen o seu nome.
  • BREAKING: WP_Sweep::$limit_details desapareceu. Lémolo con limit_details() e cámbiase co filtro wp_sweep_limit_details.
  • BREAKING: As seis accións wp_sweep_admin_*_sweep execútanse debaixo da táboa única de limpeza, na orde que sempre tiveron, en vez de debaixo de seis táboas separadas.
  • BREAKING: Sweep All desapareceu. Marca a caixa de verificación da cabeceira e aplica a acción en lote Sweep, que fai o mesmo e permíteche deixar filas fóra.
  • NEW: Limpeza en lote. Marca as limpezas que queiras e execútaas de vez en vez de facer clic unha a unha.
  • NEW: As limpezas agrúpanse na pantalla. A vista sen filtrar pon cada unha baixo un título cunha icona — Post, Comment, User, Term, Option, Database — e segue sendo unha soa táboa, así que unha única limpeza en lote aínda executa todo o que marques. Ordenar unha columna elimina os títulos en vez de deixalos describindo filas que xa non agrupan.
  • NEW: Filtros de grupo e columnas ordenables, a partir dun WP_List_Table real.
  • NEW: Toda a pantalla funciona con JavaScript desactivado. As accións das filas son ligazóns normais con nonce e a acción en lote é un envío de formulario normal.
  • NEW: As listas de claves meta permitidas protexen tanto as limpezas de meta duplicada como as de orfa, algo que o readme sempre afirmou e o código nunca fixo.
  • NEW: Filtros wp_sweep_capability e wp_sweep_limit_details. WP-Sweep non ten pantalla de axustes: wp_sweep_limit_details é como se cambia o límite de Details.
  • NEW: Cada limpeza inclúe unha descrición do que elimina, mostrada baixo o seu nome, e destácanse os contos que merecen actuación.
  • NEW: Un uninstall.php que limpa nunha rede enteira en vez de só nos primeiros cen sitios. WP-Sweep non garda nada: nin filas de opcións, nin táboas, nin capacidades, nin eventos programados.
  • NEW: Reestruturado en includes/, seguindo o Plugin Handbook.
  • NEW: Suites de PHPUnit e vitest, e CI de GitHub Actions en seis combinacións de WordPress e PHP, en sitio único e multisitio.
  • CHANGED: As exclusións de claves meta compáranse en PHP en vez de con SQL LIKE, así que un guion baixo nunha clave protexida é un guion baixo e non un comodín.
  • CHANGED: Todas as chamadas á base de datos pasan por un só método, e todas as consultas están preparadas.
  • FIXED: Un XSS almacenado na pantalla de administración. A lista de Details construíase por concatenación de cadeas e inxectábase como HTML, así que un nome de autor de comentario con marcado executábase como script no navegador do administrador.
  • FIXED: O plugin xa non constrúe rutas a partir do nome do seu propio directorio, así que o script de administración cárgase cando se instala baixo un directorio distinto de wp-sweep.
  • FIXED: Filtrar wp_sweep_excluded_termids cun array baleiro producía SQL non válido e deixaba en branco o conto de Termos sen usar.
  • FIXED: Un termo excluíase da limpeza de Termos sen usar sempre que o seu ID coincidise cunha opción default_<taxonomy>, mesmo se esa opción apuntaba a un termo que xa non existe. WordPress inclúe default_link_category co valor 2, así que na maioría dos sitios o termo que tiña o ID 2 non se limpaba en silencio.
  • FIXED: Limpar sen JavaScript eliminaba datos e non amosaba nada; agora móstrase o resultado.
  • FIXED: O bucle de desinstalación en multisitio detíñase en 100 sitios, cargaba obxectos de sitio completos para ler unha soa columna e deixaba a pila de cambios desequilibrada nun.
  • FIXED: Os parámetros da petición sanéanse e valídanse contra a lista de limpezas do propio plugin.
  • FIXED: As dúas mensaxes «Sweep Complete» que imprime wp sweep eran as únicas cadeas do plugin que nunca pasaban polas funcións de tradución