Cómo insertar correctamente datos en una tabla personalizada a través de un plugin

14 jul 2016, 19:47:32
Vistas: 41.2K
Votos: 6

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?

2
Comentarios

¿has intentado usar tipos de contenido personalizados en lugar de hacer consultas SQL directas https://codex.wordpress.org/Function_Reference/register_post_type?

mmm mmm
14 jul 2016 19:50:55

Hola @mmm, desafortunadamente un tipo de contenido personalizado no funcionará para lo que necesito.

Breno Breno
14 jul 2016 20:13:25
Todas las respuestas a la pregunta 3
1
10

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.

15 jul 2016 00:04:58
Comentarios

Estoy haciendo algo similar creando rutas/endpoints en la API REST de WP y leyendo/escribiendo en la base de datos usando los métodos adjuntos a las rutas.

b_dubb b_dubb
19 mar 2024 16:23:05
0

¿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.

14 jul 2016 21:06:17
1
-1
<?php 
global $wpdb;
 $table="test_table";
$store_arr["name"]="test";
$store_arr["email"]="test@gmail.com";

$wpdb->insert( $table, $store_arr);
 ?> 
19 jul 2016 08:01:38
Comentarios

Por favor, explica qué hace este código y por qué responde a la pregunta. Se desaconsejan respuestas que solo incluyan código.

Tim Malone Tim Malone
19 jul 2016 08:19:54