Insertar datos en la base de datos usando un formulario
Estoy escribiendo un plugin simple que crea una tabla llamada "newsletter" en la base de datos y proporciona un shortcode para colocar un formulario de registro en las páginas. El formulario contiene "nombre" y "email". Tengo problemas con la inserción de los datos del formulario (nombre+email) en la base de datos. Escribí esto:
<?php
$name = $_POST['name'];
$email = $_POST['email'];
function insertuser(){
global $wpdb;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
?>
pero no funciona. ¿Qué debo hacer para obtener los datos del formulario e insertarlos en la tabla?

Las dos variables $name
y $email
son desconocidas dentro de la función. Debes hacerlas disponibles globalmente dentro de ella cambiando global $wpdb
por global $wpdb, $name, $email
:
require_once('../../../wp-load.php');
/**
* Después del comentario de t f sobre poner global antes de la variable.
* No es necesario (http://php.net/manual/en/language.variables.scope.php)
*/
global $name = $_POST['name'];
global $email = $_POST['email'];
function insertuser(){
global $wpdb, $name, $email;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
insertuser();
O bien, puedes colocar las variables en los argumentos de la función:
require_once('../../../wp-load.php');
$name = $_POST['name'];
$email = $_POST['email']
function insertuser( $name, $email ) {
global $wpdb;
$table_name = $wpdb->prefix . 'newsletter';
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );
}
insertuser( $name, $email );
O bien, sin función:
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );

Eso es lo que escribí. ;) Todavía tengo dudas sobre cuándo escribir un comentario y cuándo es suficiente con una respuesta. ;) Sin embargo, las variables aún deben declararse como global
fuera de la función.

Jaja, sí vi tu comentario después de publicar mi respuesta :-) Mi regla para comentar/responder es: si el OP tiene que cambiar más de una cosa en el código, siempre responder ;-) Añadiré global
a las variables $name
y $email

Ah, vale, parece que tienes razón con el alcance (porque en este caso, fuera de la función es el alcance global, y no una clase). Sin embargo, si declaras las variables como globales (lo que has decidido hacer ahora), primero debes declararlas y luego (en la siguiente línea, o después de un punto y coma) asignar un valor.

cuando el usuario hace clic en enviar formulario, la acción del formulario hace referencia a un archivo llamado: regiostration-form.php en este archivo tengo este código ahora:
`<?php $name = $_POST['name']; $email = $_POST['email'];
function insertuser(){ global $wpdb, $name, $email; $table_name = $wpdb->prefix . "newsletter"; $wpdb->insert($table_name, array('name' => $name, 'email' => $email) ); } ?> `
pero no funciona de nuevo. ¿hay algo mal?

¿Estás llamando a la función insertuser()
después de declarar la función?

@MikeMadern ¿tengo que escribir: 'insertuser()' después de la función?

definir una función no la ejecuta automáticamente. Tienes que llamar a la función para que se ejecute. Mira el código en mi respuesta ;-)

usé tu código pero obtuve dos errores: Notice: Trying to get property of non-object in line 8
y Fatal error: Call to a member function insert() on a non-object in line 9

¿No es un archivo cargado por WordPress, verdad? Haz require
del archivo wp-load.php
al principio de tu script para cargar la biblioteca de WordPress.

usé este código y funcionó bien: <?php
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array( 'name' => $name, 'email' => $email ) );
?>
Gracias a todos, especialmente a Mike Madern

sí, por favor actualiza la respuesta con la solución completa y entonces la aceptaré. Sinceramente
