Ações ou filtros acionados quando os dados são salvos em uma tabela personalizada

4

Estou usando um plug-in e estou tentando preencher automaticamente um campo personalizado (suspenso) para o formulário do assinante, porque ele deve listar alguns dados dinâmicos (relacionados ao conteúdo do site).

O plugin tem, até onde eu posso ver, filtros ou ações para este propósito. Isso me força a pensar de qualquer maneira alternativa para lidar com isso.

O plugin usa tabelas customizadas (não aquelas nativas / internas do WP), então eu estava pensando se há alguma ação ou filtro que é acionado quando os dados são salvos em qualquer uma dessas tabelas customizadas.

    
por Capiedge 05.03.2017 / 13:50

1 resposta

4

O plugin provavelmente (ou: esperançosamente) usou o objeto $wpdb , uma instância da classe wpdb , para adicionar a tabela personalizada. Se sim (e somente em caso afirmativo), então o autor provavelmente também usa $wpdb->insert() para adicionar linhas / entradas à tabela.

Dê uma olhada em wpdb::insert() e observe seu source , você descobrirá que esse método é apenas um wrapper de conveniência em torno de wpdb::_insert_replace_helper() , que define o argumento $type como INSERT . Enquanto este método NÃO tem nenhum filtro, a fonte revela que esta função realmente usa

return $this->query( $this->prepare( $sql, $values ) );

Embora wpdb::prepare() não permita nenhuma modificação por meio de filtros, vamos dar uma olhada em wpdb::query() . Lá você encontrará o seguinte filtro:

$query = apply_filters( 'query', $query );

Agora que temos um ponto de entrada , onde podemos adicionar modificações, vamos falar sobre como identificar a tabela personalizada que é preenchida com dados. Olhando para a instrução SQL que é colocada na instrução para execução, você notará a seguinte linha:

$sql = "$type INTO '$table' ($fields) VALUES ($formats)";

A variável $table vem da definição da função, que é o primeiro argumento da chamada $wpdb->insert() . Normalmente, qualquer desenvolvedor sensato usaria "{$wpdb->prefix}custom_table_name" , para evitar um plugin corrompido se o prefixo da tabela fosse alterado para longe de wp_ dentro de wp-config.php .

Finalmente:

<?
/* Plugin Name: Do something when a custom table gets data added or altered */
add_filter( 'query', function( $query ) {
    // Return SQL unmodified. Not the table we are targeting.
    if ( false === strstr( $query, "{$wpdb->prefix}custom_table_name" ) ) {
        return $query;
    }

    // Return SQL unmodified. Not the actions we are targeting.
    # @TODO If you only want to act on either of them, modify the if-clause
    if ( 
        false === strstr( $query, "INSERT" ) 
        AND false === strstr( $query, "REPLACE" )
    ) {
        return $query;
    }

    # @TODO Do your custom task here and…
    # …modify according the query to your likings.

    return $query;
} );

Tenha em mente que este plugin é executado em cada consulta individual agora. Você pode querer adicionar verificações como is_admin() e encapsular todo o bloco de código em uma função anexada a um gancho mais exclusivo para reduzir o número de execuções para ele. Senão você pode diminuir o seu site significativamente.

    
por kaiser 05.03.2017 / 15:12