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.