# wordpress-seo/27.6/src/user-meta/infrastructure/cleanup-repository.php

Yoast SEO – Advanced SEO with real-time guidance and built-in AI, version 27.6. 39 lines.

- Page: https://pluginprobe.com/plugins/wordpress-seo/27.6/code/src/user-meta/infrastructure/cleanup-repository.php
- Raw: https://pluginprobe.com/plugins/wordpress-seo/27.6/raw/src/user-meta/infrastructure/cleanup-repository.php
- Modified: 2026-02-17T12:17:50+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/wordpress-seo/27.6/code/src/user-meta/infrastructure/cleanup-repository.php#L10-L20`.

```php
<?php

namespace Yoast\WP\SEO\User_Meta\Infrastructure;

/**
 * Repository going into the database to clean up.
 */
class Cleanup_Repository {

	/**
	 * Deletes empty usermeta based on their meta_keys and returns the number of the deleted meta.
	 *
	 * @param array<string> $meta_keys The meta to be potentially deleted.
	 * @param int           $limit     The number of maximum deletions.
	 *
	 * @return int|false The number of rows that was deleted or false if the query failed.
	 */
	public function delete_empty_usermeta_query( $meta_keys, $limit ) {
		global $wpdb;

		// phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
		$delete_query = $wpdb->prepare(
			'DELETE FROM %i
			WHERE meta_key IN ( ' . \implode( ', ', \array_fill( 0, \count( $meta_keys ), '%s' ) ) . ' )
			AND meta_value = ""
			ORDER BY user_id
			LIMIT %d',
			\array_merge( [ $wpdb->usermeta ], $meta_keys, [ $limit ] ),
		);
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}
}

```
