I’m working in a new plugin and I want the users use a form to send his/her email. This email would be saved in a custom table in the database.
This is the html form:
<form class="form-inline singup subscribe-database" action="#" method="post" data-url="<?php echo verde_product_info('extend_url') ?>">
<input type="hidden" name="language" value="<?php echo verde_top('language'); ?>">
<input type="hidden" name="database" value="<?php echo $wpdb->prefix; ?>">
<input type="email" name="email" placeholder="Email" required>
<button type="submit" class="btn">Send</button>
</form>
When it is sending, the js code is the next:
var urlplugin = jQuery('.subscribe-database').attr('data-url');
jQuery('.subscribe form').submit(function() {
var postdata = jQuery('.subscribe form').serialize();
jQuery.ajax({
type: 'POST',
url: urlplugin + '/themes/php/sendmail.php',
data: postdata,
dataType: 'json',
success: function(json) {
console.log(json);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
}
});
return false;
});
And the file sendmail.php when the error happens is the next one:
global $wpdb;
if(!isset($wpdb))
{
require_once('../../../../../wp-includes/wp-db.php');
}
switch ($_POST['language']) {
case 'english':
$success1 = 'Thanks for your subscription!';
$error1 = 'Insert a valid email address';
break;
case 'spanish':
$success1 = '¡Gracias por tu suscripción!';
$error1 = 'Escribe un email válido';
break;
case 'french':
$success1 = 'Merci pour votre abonnement!';
$error1 = 'Insérez une adresse e-mail valide';
break;
case 'german':
$success1 = 'Vielen Dank für Ihr Abonnement!';
$error1 = 'Legen Sie eine gültige E-Mail-Adresse';
break;
case 'italian':
$success1 = 'Grazie per il vostro abbonamento!';
$error1 = 'Inserire un indirizzo email valido';
break;
case 'portuguese':
$success1 = 'Obrigado pela sua inscrição!';
$error1 = 'Insira um email válido';
break;
}
function isEmail($email) {
return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]]).)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]).){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i", $email));
}
if($_POST['email']) {
$table = $_POST['database'] . 'verde_emails';
$subscriber_email = ($_POST['email']);
if(!isEmail($subscriber_email)) {
$array = array();
$array['valid'] = 0;
$array['message'] = $error1;
echo json_encode($array);
}
else {
$array = array();
$array['valid'] = 1;
$array['message'] = $success1;
echo json_encode($array);
$wpdb->insert(
$table,
array(
'option_email' => $subscriber_email,
)
)
}
}
When I use the form I get the next error in the browser console:
200
scripts-new.js:43 SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at parseJSON (jquery-1.9.1.min.js:2:4322)
at Fn (jquery-1.9.1.min.js:4:15175)
at k (jquery-1.9.1.min.js:4:13895)
at XMLHttpRequest.r (jquery-1.9.1.min.js:4:18226)
But it works fine if I comment the next code in the file sendmail.php:
$wpdb->insert(
$table,
array(
'option_email' => $subscriber_email,
)
)
but obviously, the email can’t be saved in the database.
I’m lost with this error and I will be very grateful if someone can help me.
Sorry for my English and thank you very much.
2
Answers
In the file sendmail.php, when it's loaded the file wp-db.php there isn't any error, but when the file wp_load.php is loaded, the error happens:
I have not said if before but the WordPress version is 5.9.3 and the PHP version is 8.0.8
Regards
Please remove this part of code and post what happens
if you are inside WordPress you don’t need this, if you are outside WordPress you need to include more than that, wp_load.php for ex.