Created
April 22, 2025 19:35
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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