Skip to content

Instantly share code, notes, and snippets.

@everaldomatias
Created April 22, 2025 19:35
Show Gist options
  • Save everaldomatias/4a1142c08bc88ea58a4c491a17d5dc4d to your computer and use it in GitHub Desktop.
Save everaldomatias/4a1142c08bc88ea58a4c491a17d5dc4d to your computer and use it in GitHub Desktop.
Comando WP-CLI para validar e limpar a tabela wp_doifd_lab_subscribers com base em nome e e-mail
<?php
/**
* Plugin Name: DOIFD - WP-CLI Subscriber Cleaner
* Description: Comando WP-CLI para validar e limpar a tabela wp_doifd_lab_subscribers com base em nome e e-mail.
* Version: 1.0.0
* Author: Everaldo Matias
*
* ---------------------------------------------
* DOCUMENTAÇÃO DO COMANDO WP-CLI:
* ---------------------------------------------
*
* Comando:
* wp doifd clean-subscribers [--dry-run] [--export]
*
* Opções:
* --dry-run Simula a exclusão sem remover nenhum dado do banco.
* --export Gera um arquivo CSV com os dados inválidos identificados.
*
* CSV gerado:
* Será salvo na pasta de uploads do WordPress (wp-content/uploads)
* O nome do arquivo será: doifd_invalid_subscribers_YYYYmmdd_HHMMSS.csv
*
* Colunas do CSV:
* - ID => ID do registro
* - Nome => Campo doifd_name
* - E-mail => Campo doifd_email
* - time => Data/hora do registro
* - invalid_name => "Nome inválido" caso o nome seja inválido
* - invalid_email => "E-mail inválido" caso o e-mail seja inválido
*
* Uso recomendado:
* wp doifd clean-subscribers --dry-run --export
* → Verifica registros inválidos e exporta para CSV, sem deletar
*
* wp doifd clean-subscribers --export
* → Deleta registros inválidos e exporta para CSV
*
*/
if ( defined( 'WP_CLI' ) && WP_CLI ) {
class DOIFD_Clean_Subscribers_Command {
public function __invoke( $args, $assoc_args ) {
global $wpdb;
$table = $wpdb->prefix . 'doifd_lab_subscribers';
$batch_size = 5000;
$offset = 0;
$dry_run = isset( $assoc_args['dry-run'] );
$export = isset( $assoc_args['export'] );
$total_checked = 0;
$total_invalid = 0;
$invalid_rows = [];
WP_CLI::log( 'Iniciando limpeza de assinantes DOIFD...' );
while ( true ) {
$rows = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM $table LIMIT %d OFFSET %d", $batch_size, $offset),
ARRAY_A
);
if ( empty( $rows ) ) {
break;
}
foreach ( $rows as $row ) {
$valid_name = $this->is_valid_human_name( $row['doifd_name'] ?? '' );
$valid_email = $this->is_valid_email( $row['doifd_email'] ?? '' );
$total_checked++;
if ( ! $valid_name || ! $valid_email ) {
$total_invalid++;
$invalid_rows[] = [
'ID' => $row['doifd_subscriber_id'],
'Nome' => $row['doifd_name'],
'E-mail' => $row['doifd_email'],
'Data' => $row['time'],
'Nome inválido?' => $valid_name ? '' : 'Nome inválido',
'E-mail inválido?' => $valid_email ? '' : 'E-mail inválido'
];
if ( ! $dry_run ) {
$wpdb->delete( $table, [
'doifd_subscriber_id' => $row['doifd_subscriber_id']
], [ '%d' ] );
}
}
}
WP_CLI::log( "Lote processado: OFFSET $offset" );
$offset += $batch_size;
}
WP_CLI::log( "Total verificados: $total_checked" );
WP_CLI::log( "Total inválidos: $total_invalid" );
if ( $export && ! empty( $invalid_rows ) ) {
$upload_dir = wp_upload_dir();
$filename = 'doifd_invalid_subscribers_' . date('Ymd_His') . '.csv';
$csv_path = trailingslashit( $upload_dir['basedir'] ) . $filename;
$fp = fopen( $csv_path, 'w' );
fputcsv( $fp, array_keys( $invalid_rows[0] ) );
foreach ( $invalid_rows as $row ) {
fputcsv( $fp, $row );
}
fclose( $fp );
WP_CLI::success( "CSV gerado em: $csv_path" );
}
WP_CLI::success( 'Limpeza concluída.' );
}
/**
* Valida se um nome parece legítimo (sem spam, links, etc.)
* Permite e-mails escritos no campo do nome.
*
* @param string $name
* @return bool
*/
public function is_valid_human_name( string $name ): bool {
$name = trim( $name );
$name = preg_replace( '/[^\P{C}]+/u', '', $name );
if ( filter_var( $name, FILTER_VALIDATE_EMAIL ) && $this->is_valid_email( $name ) ) {
return true;
}
if ( strlen( $name ) < 2 || strlen( $name ) > 60 ) {
return false;
}
if ( preg_match( '/\b(http|www|bitcoin|transfer|donate|script)\b|[<>]/i', $name ) ) {
return false;
}
if ( ! preg_match( '/^[\p{L}0-9\s\-\.]+$/u', $name ) ) {
return false;
}
if ( preg_match( '/(.)\1{4,}/', $name ) ) {
return false;
}
if ( preg_match( '/[\s\-]{3,}/', $name ) ) {
return false;
}
return true;
}
/**
* Valida se o email é seguro e com formato válido.
*
* @param string $email
* @return bool
*/
public function is_valid_email( string $email ): bool {
$email = trim( $email );
if ( $email !== strip_tags( $email ) ) {
return false;
}
if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
return false;
}
if ( preg_match( '/@(.*\.(ru|xyz|bit|top|click|link))$/i', $email ) ) {
return false;
}
return true;
}
}
WP_CLI::add_command( 'doifd clean-subscribers', 'DOIFD_Clean_Subscribers_Command' );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment