Cómo insertar correctamente datos en una tabla personalizada a través de un plugin
Tengo un plugin que lee datos de un archivo cargado y ejecuta consultas en la base de datos de WordPress. Estas inserciones son en una tabla creada por mi plugin, por lo que no son del tipo post.
Así es como lo hice funcionar:
$connection = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
mysqli_query($connection, $query);
El problema con esto es que tengo que declarar estas variables ($db_host, $db_user, $db_pass, $db_name) dentro del código fuente del plugin.
¿Hay alguna manera de insertar datos en mis tablas personalizadas con la API de WordPress? ¿O hay alguna forma de obtener estas variables desde un archivo externo que pueda ignorar en una configuración de control de versiones?

No es una buena práctica intentar conectar a la base de datos con tus propios métodos cuando WordPress ya lo hace inicialmente por ti.
El problema con esto es que tengo que declarar estas variables ($db_host, $db_user, $db_pass, $db_name) dentro del código fuente del plugin.
Todas estas propiedades están definidas en el archivo wp-config.php
, ubicado en el directorio raíz.
Si necesitas obtener estas constantes, simplemente incluye el archivo y llama a las constantes, o usa REGEX (es mejor usar REGEX, porque podría haber otros callbacks que requieran cargar WordPress)
// cargando el archivo de configuración para obtener las constantes DB_*
$dirname = dirname(__FILE__);
$root = false !== mb_strpos( $dirname, 'wp-content' ) ? mb_substr( $dirname, 0, mb_strpos( $dirname, 'wp-content' ) ) : $dirname;
// si $root no es correcto, proporciona una ruta estática, $root = '/ruta/al/directorio/raiz'
// asumiendo que las constantes están listas (WordPress está configurado), obtengámoslas.
require_once( $root . "wp-config.php" );
echo var_dump(
'Nombre DB', DB_NAME,
'Usuario DB', DB_USER,
'Contraseña DB', DB_PASSWORD,
'Host DB', DB_HOST
);
Aquí hay una mejor solución:
Carga WordPress
require( '/wp-blog-header.php' );
¡Debes proporcionar una ruta válida a ese archivo!
Para probar si has cargado WordPress correctamente, imprime algo:
add_action("wp", function() {
echo sprintf( "¡Sí! Estoy creando con WordPress v. %s!\n", get_bloginfo("version") );
exit("Termino aquí\n");
});
Ahora usa la API de base de datos de WordPress
Para insertar datos, existe wpdb::insert
que deberías usar. Aquí la sintaxis:
$wpdb->insert( $table, $data, $format );
y un ejemplo de uso:
$wpdb->insert(
'messages',
array(
'PM_ID' => (int) $pm_id,
'sender' => $current_user->ID,
'recipient' => (int) $recipient,
'message' => "¡Hola!\n",
'date' => time()
)
);
$record_id = $wpdb->insert_id;
En el ejemplo, el array en el segundo parámetro de $wpdb->insert
es un array con índices como nombres de columnas y valores a insertar para esas columnas en un registro independiente, cuyo ID puedes obtener con $wpdb->insert_id
, que recupera el ID del último registro insertado en esa tabla.
Espero que esto ayude, al menos para mantenerte alejado de inyecciones SQL usando $wpdb::insert
o sentencias preparadas en lugar de consultas directas.

¿Por qué no estudias cómo funciona $wpdb? Visita https://codex.wordpress.org/Class_Reference/wpdb
Aquí tienes un ejemplo de cómo insertar datos en la base de datos usando $wpdb:
<?php
global $wpdb;
$wpdb->insert(
'nombre_de_la_tabla',
array(
'columna1' => 'valor1',
'columna2' => 123
),
array(
'%s',
'%d'
)
);
?>
Visita https://codex.wordpress.org/Creating_Tables_with_Plugins para más información.
