Acciones o filtros activados cuando los datos se guardan en una tabla personalizada

4

Estoy usando un complemento, y estoy tratando de completar automáticamente un campo personalizado (desplegable) para el formulario de suscriptor, ya que debería incluir algunos datos dinámicos (relacionados con el contenido de los sitios web).

El complemento, por lo que puedo ver, no tiene filtros ni acciones para este propósito. Esto me obliga a pensar en formas alternativas para lidiar con esto.

El complemento usa tablas personalizadas (no nativas / integradas de WP), por lo que pensé si hay alguna acción o filtro que se active cuando se guardan datos en cualquiera de estas tablas personalizadas.

    
pregunta Capiedge 05.03.2017 - 13:50

1 respuesta

4

El complemento probablemente (o: con suerte) usó el objeto $wpdb , una instancia de la clase wpdb , para agregar la tabla personalizada. Si es así (y solo si es así), es probable que su autor también use $wpdb->insert() para agregar filas / entradas a la tabla.

Echando un vistazo a wpdb::insert() , y mirando su source , descubrirá que este método es solo un envoltorio práctico alrededor de wpdb::_insert_replace_helper() , que establece el argumento $type en INSERT . Si bien este método NO tiene ningún filtro, la fuente revela que esta función realmente usa

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

Si bien wpdb::prepare() no permite ninguna modificación a través de los filtros, echemos un vistazo a wpdb::query() . Allí encontrarás el siguiente filtro:

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

Ahora que tenemos un punto de entrada , donde podemos agregar modificaciones, hablemos sobre cómo identificar la tabla personalizada que está llena de datos. Al observar la instrucción SQL que se incluye en la instrucción para su ejecución, observará la siguiente línea:

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

La variable $table proviene de la definición de la función, que es el primer argumento de la llamada $wpdb->insert() . Normalmente, cualquier desarrollador sensato usaría "{$wpdb->prefix}custom_table_name" allí, para evitar un plugin dañado si la tabla con prefijo fuera 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;
} );

Tenga en cuenta que este complemento se ejecuta en cada consulta única ahora. Es posible que desee agregar cheques como is_admin() y ajustar todo el bloque de código en una función que se adjunta a un gancho más exclusivo para reducir el número de ejecuciones. De lo contrario, podría ralentizar considerablemente su sitio.

    
respondido por el kaiser 05.03.2017 - 15:12

Lea otras preguntas en las etiquetas