WP-Sweep

Descripción

WP-Sweep encuentra y elimina las filas que WordPress deja atrás. Revisiones de entradas que editaste hace años, metadatos que pertenecían a una entrada que se eliminó, términos que no están adjuntos a nada, relaciones de términos que apuntan a entradas que ya no existen, transitorios caducados: nada de esto es visible en ningún lugar de wp-admin, y todo está en tu base de datos.

Usa las funciones de eliminación adecuadas de WordPress siempre que pueden llegar a la fila, en lugar de ejecutar consultas de eliminación en bruto, por lo que los hooks de los que dependen otros plugins siguen ejecutándose. Solo las filas que la API se niega a tocar (metadatos huérfanos cuyo ID de objeto es 0) se eliminan directamente.

Características

  • Revisiones
  • Borradores automáticos
  • Entradas eliminadas
  • Comentarios sin aprobar
  • Comentarios spam
  • Comentarios borrados
  • Metas de entradas huérfanas
  • Metas de comentarios huérfanas
  • Metas de usuarios huérfanas
  • Metas de términos huérfanas
  • Relaciones de términos huérfanos
  • Términos sin utilizar
  • Metas de entradas duplicadas
  • Metas de comentarios duplicadas
  • Metas de usuario duplicadas
  • Meta de términos duplicadas
  • Opciones de datos transitorios
  • Cachés oEmbed en metas de entradas
  • Optimiza tablas de la base de datos

Funciones de eliminación utilizadas

  • 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 conocidas

Estos plugins guardan datos en lugares que WP-Sweep lee como huérfanos. Protege sus claves meta con los filtros de la sección Uso antes de limpiar.

Donativos

Paso la mayor parte de mi tiempo libre creando, actualizando, manteniendo y dando soporte a estos plugins, si te gustan de verdad mis plugins y me quieres dar un par de euros lo apreciaré enormemente. En caso contrario úsalo sin ninguna obligación.

Uso

Cada limpieza es irreversible, así que haz una copia de seguridad de tu base de datos primero.

La pantalla enumera cada limpieza con una breve descripción de lo que elimina, cuántos elementos son y qué proporción de la tabla representan. Marca los que quieras y usa la acción masiva Limpiar, o usa los botones Limpiar y Detalles de cada fila uno a la vez. Nada en la pantalla necesita JavaScript: los botones son enlaces normales y la acción masiva es un formulario normal.

No hay pantalla de ajustes. Lo único que vale la pena ajustar (cuántos elementos enumera Detalles, 500 por defecto) es el filtro wp_sweep_limit_details. El límite existe porque toda la muestra se mantiene en memoria y se escribe en la página.

WP-CLI

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

API REST

Las tres rutas necesitan la capacidad activate_plugins.

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

Nombres de 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 meta de entradas que nunca deben eliminarse, ni por la limpieza de metadatos huérfanos ni por la de duplicados. * coincide con cualquier secuencia de caracteres. Valor predeterminado: vacío.
  • wp_sweep_commentmeta_whitelist (array) — lo mismo, para metadatos de comentarios.
  • wp_sweep_usermeta_whitelist (array) — lo mismo, para metadatos de usuarios.
  • wp_sweep_termmeta_whitelist (array) — lo mismo, para metadatos de términos.
  • wp_sweep_excluded_taxonomies (array) — taxonomías excluidas de la limpieza de relaciones de términos huérfanos. Valor predeterminado: array( 'link_category' ).
  • wp_sweep_excluded_termids (array) — IDs de términos excluidos de la limpieza de términos no utilizados. Valor predeterminado: el término predeterminado de cada taxonomía, más cualquier término que sea principal de otro.
  • wp_sweep_limit_details (int) — cuántos elementos muestra una lista de Detalles. Valor predeterminado: 500.
  • wp_sweep_defer_counts (bool) — whether the Sweep screen renders first and fetches its counts afterwards, one at a time. Return false to compute every count with the page, as versions before 2.0.1 always did. Default: true.
  • wp_sweep_capability (string $capability, string $context) — la capacidad requerida. $context es uno de sweep, ajax o rest.
  • wp_sweep_total_count (int $count, string $name) — el número total de filas contra el que se mide el porcentaje de una limpieza.
  • wp_sweep_count (int $count, string $name) — cuántos elementos eliminaría una limpieza.
  • wp_sweep_details (array $details, string $name) — la lista de muestra que muestra Detalles.
  • wp_sweep_sweep (string $message, string $name) — el mensaje que se muestra después de que se haya ejecutado una limpieza.

Acciones

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.

Protege claves meta específicas de entradas de ser limpiadas:

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

Excluye una taxonomía adicional de la limpieza de relaciones de términos huérfanos:

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

Capturas de pantalla

Instalación

  1. Instala y activa el plugin. La pantalla aparece en WP-Admin -> Herramientas -> WP-Sweep.
  2. Haz una copia de seguridad de tu base de datos antes de limpiar nada. Cada limpieza es irreversible y no hay deshacer.

FAQ

La pantalla Herramientas -> Limpiar tiene una nueva dirección

Sigue estando en Herramientas, pero la dirección cambió de tools.php?page=wp-sweep/admin.php a tools.php?page=wp-sweep. Actualiza cualquier marcador.

La dirección antigua era la forma heredada de “archivo de plugin como slug de menú”, que ponía el nombre del directorio de instalación del plugin en la URL de la página. También es la razón por la que la pantalla se rompía para cualquiera que instalara WP-Sweep con un nombre de directorio diferente, ya fuera renombrado manualmente o descomprimido como wp-sweep-2.0.0. Ahora no ocurre ninguna de las dos cosas.

¿Dónde fue a parar “Limpiar todo”?

Cada fila tiene una casilla de verificación y la tabla tiene una acción masiva Limpiar, así que marcar la casilla del encabezado y aplicar la acción hace lo que hacía “Limpiar todo” y te permite omitir los que no quieras.

Mi fragmento de código que llamaba a WPSweep::get_instance() dejó de funcionar

Las clases se renombran en la versión 2.0.0:

  • WPSweep ahora es WP_Sweep
  • WPSweep_Api ahora es WP_Sweep_API
  • WPSweep_Command ahora es WP_Sweep_Command

Así que WPSweep::get_instance()->sweep( 'revisions' ) se convierte en WP_Sweep::get_instance()->sweep( 'revisions' ). No hay un alias de compatibilidad, por lo que el nombre antiguo genera un error fatal en lugar de fallar silenciosamente.

Cada filtro y cada acción wp_sweep_admin_*_sweep mantiene el nombre que tenía.

¿Qué filtros puedo usar para proteger los datos de ser limpiados?

Cuatro filtros por tipo toman una lista de claves meta que nunca deben eliminarse, y cada uno admite * como comodín:

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

Lo mismo se aplica a wp_sweep_commentmeta_whitelist, wp_sweep_usermeta_whitelist y wp_sweep_termmeta_whitelist. Los términos se protegen con wp_sweep_excluded_termids, y las taxonomías se excluyen de la limpieza de relaciones de términos huérfanos con wp_sweep_excluded_taxonomies.

En la versión 2.0.0, estas listas también protegen las limpiezas de metadatos duplicados, algo que la documentación siempre dijo que hacían pero que el código nunca hizo.

Una clave que protegí fue limpiada de todos modos, o se mantuvo demasiado

Antes de la versión 2.0.0, la exclusión era una cláusula SQL LIKE, y LIKE trata un guion bajo como un comodín de un solo carácter. Un patrón como _my_key también coincidía con Xmy!key y con muchas otras cosas. Ahora la coincidencia ocurre en PHP, por lo que un guion bajo es un guion bajo y solo * es un comodín. Comprueba tu lista si dependías del comportamiento anterior.

¿Deja WP-Sweep algo atrás cuando lo elimino?

Nada. WP-Sweep no almacena filas de opciones, no crea tablas en la base de datos, no registra capacidades y no programa eventos. uninstall.php se ejecuta de todos modos y limpia lo que deja en toda la red en lugar de solo en los primeros cien sitios.

Reseñas

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 Enero de 2025
great and simple plugin, no licence shit – it just works, thanks!
Leer los 139 comentarios

Colaboradores & Desarrolladores

“WP-Sweep” es software de código abierto. Las siguientes personas han contribuido a este plugin.

Colaboradores

“WP-Sweep” ha sido traducido en 23 idiomas. Gracias a los traductores por sus contribuciones.

Traduce “WP-Sweep” a tu idioma.

¿Interesado en el desarrollo?

Revisa el código, echa un vistazo al repositorio SVN, o suscríbete al registro de desarrollo por RSS .

Historial de cambios

2.0.1

  • NEW: A Sweep link on the plugin’s row of the Plugins screen, opening Tools -> Sweep.
  • FIXED: The Sweep screen timed out on large databases. 2.0.0 computed every count before printing a byte — and asked for each table’s total row count once per row instead of once, so SELECT COUNT(*) ran against the postmeta table four times per load. The screen now renders at once and fetches the counts afterwards, one request at a time, so no single request outlives PHP’s time limit. Without JavaScript, a link computes them with the page the way 2.0.0 always did, and the new wp_sweep_defer_counts filter restores that behaviour outright.
  • FIXED: Counting the duplicated meta sweeps fetched every duplicate row’s ids into PHP through GROUP_CONCAT, just to add them up. On a postmeta table with millions of duplicates that alone could exhaust the request. The count now reads per-key totals only; the ids are read where they are needed, by the sweep that deletes them.

2.0.0

  • FIXED: Unused Terms read “unused” off the count column, and core’s own counter counts published posts — so a term used only by drafts, pending posts, private posts or posts in the trash showed a count of zero and was deleted, taking its relationships with it. Those posts came back untagged with nothing to say why. A term now has to be attached to nothing at all
  • FIXED: Sweeping the terms of a taxonomy nothing registers any more finished with DELETE FROM wp_terms WHERE term_id NOT IN ( SELECT term_id FROM wp_term_taxonomy ), which is every stray row in the table rather than the ones the sweep had just orphaned. Rows the screen had neither counted nor listed were deleted along with them. It names the terms it orphaned now
  • FIXED: Orphaned Term Relationships decided a row was an orphan by looking for its object_id in wp_posts — which only asks the right question when the taxonomy belongs to posts. For a taxonomy registered against users or comments, object_id is a user or comment ID, so every relationship whose ID happened to outnumber the posts was deleted while the user was still there. link_category was excluded by hand for exactly this reason; the exclusion is now derived from what each taxonomy is registered against
  • FIXED: The oEmbed sweep matched %_oembed_%, and in a LIKE pattern an underscore matches any single character — so it meant “any meta key containing oembed with a character either side”, and it was a contains match rather than a prefix one. Keys belonging to other plugins were hard-deleted along with the caches. WordPress writes these as _oembed_{hash}, so the pattern is now anchored at the start with its underscores escaped
  • FIXED: The oEmbed sweep was the one meta sweep that never consulted the protected-keys list, so a key a site had explicitly added to wp_sweep_postmeta_whitelist was deleted anyway — the list was even read for it and then ignored
  • FIXED: Optimising the database ran SHOW TABLES with no prefix, which is every table in the schema. On a database shared between installs — an ordinary hosting arrangement — the details view listed every co-tenant’s tables, and the sweep issued OPTIMIZE TABLE against installs this administrator does not administer. It is scoped to this install’s prefix now, with wp_sweep_optimize_tables for a site that wants more
  • BREAKING: Requires WordPress 6.8 and PHP 8.2.
  • BREAKING: The screen stays under Tools but its address changed, from tools.php?page=wp-sweep/admin.php to tools.php?page=wp-sweep. The old form put the installation directory name into the URL.
  • BREAKING: The classes are renamed WPSweep -> WP_Sweep, WPSweep_Api -> WP_Sweep_API and WPSweep_Command -> WP_Sweep_Command. Every filter and action keeps its name.
  • BREAKING: WP_Sweep::$limit_details is gone. Read it with limit_details() and change it with the wp_sweep_limit_details filter.
  • BREAKING: The six wp_sweep_admin_*_sweep actions fire below the single sweep table, in the order they always had, rather than below six separate ones.
  • BREAKING: Sweep All is gone. Tick the header checkbox and apply the Sweep bulk action instead, which does the same thing and lets you leave rows out.
  • NEW: Bulk sweeping. Tick the sweeps you want and run them in one go instead of one click at a time.
  • NEW: The sweeps are grouped on screen. The unfiltered view puts each under a heading with an icon — Post, Comment, User, Term, Option, Database — while staying one table, so a single bulk sweep still runs everything you tick. Sorting a column drops the headings rather than leaving them describing rows they no longer group.
  • NEW: Group filters and sortable columns, from a real WP_List_Table.
  • NEW: The whole screen works with JavaScript turned off. The row actions are ordinary nonced links and the bulk action is an ordinary form post.
  • NEW: The meta key whitelists protect the duplicated meta sweeps as well as the orphaned ones, which the readme always claimed and the code never did.
  • NEW: wp_sweep_capability and wp_sweep_limit_details filters. WP-Sweep has no settings screen: wp_sweep_limit_details is how the Details cap is changed.
  • NEW: Every sweep carries a description of what it removes, shown under its name, and counts worth acting on are emphasised.
  • NEW: An uninstall.php that cleans up across a whole network rather than the first hundred sites. WP-Sweep itself stores nothing: no option rows, no tables, no capabilities and no scheduled events.
  • NEW: Restructured into includes/, following the Plugin Handbook.
  • NEW: PHPUnit and vitest suites, and GitHub Actions CI across six WordPress and PHP combinations, single site and multisite.
  • CHANGED: Meta key exclusions are matched in PHP rather than with SQL LIKE, so an underscore in a protected key is an underscore rather than a wildcard.
  • CHANGED: Every database call goes through one method, and every query is prepared.
  • FIXED: A stored XSS on the admin screen. The Details list was built by string concatenation and injected as HTML, so a comment author name containing markup ran as script in the administrator’s browser.
  • FIXED: The plugin no longer builds paths from its own directory name, so the admin script loads when it is installed under a directory other than wp-sweep.
  • FIXED: Filtering wp_sweep_excluded_termids to an empty array produced invalid SQL, leaving the Unused Terms count blank.
  • FIXED: A term was excluded from the Unused Terms sweep whenever its ID matched a default_<taxonomy> option, even if that option pointed at a term that no longer exists. WordPress ships default_link_category set to 2, so on most sites whatever term held ID 2 quietly refused to sweep.
  • FIXED: Sweeping without JavaScript deleted data and displayed nothing; the result is now shown.
  • FIXED: The multisite uninstall loop stopped at 100 sites, hydrated whole site objects to read one column, and left the switch stack unwound by one.
  • FIXED: Request parameters are sanitized and validated against the plugin’s own list of sweeps.
  • FIXED: The two “Sweep Complete” messages wp sweep prints were the only strings in the plugin that were never passed through the translation functions
Sponsor
SponsoredKunjungi sekarang
Promo