Wordpress, ошибка - mysqli_real_escape_string() expects parameter 2 to be string

440
30 мая 2017, 03:19

Посмотреть все похожие вопросы, но не нашел ответа, да и код отличается. Собственно, пытаюсь в WP при отправке формы отправить письмо, создать пользователя, от его имени пост и комментарий к посту. Код следующий:

<?php if (isset($_GET['submitted'])) {
$contact_name = $_GET['contact_name'];
$contact_name = htmlspecialchars($contact_name);
$contact_name = trim($contact_name);
$contact_phone = $_GET['contact_phone'];
$contact_phone = htmlspecialchars($contact_phone);
$contact_phone = trim($contact_phone);
$contact_email = $_GET['contact_email'];
$contact_email = htmlspecialchars($contact_email);
$contact_email = trim($contact_email);
$text = $_GET['text'];
$text = htmlspecialchars($text);
$text = trim($text);
mail("ivan.mv46@gmail.com", "Новое сообщение", "Имя:".$contact_name."\nEmail: ".$contact_email."\nНомер телефона: ".$contact_phone."\nСообщение:".$text."");
$user_id = wp_create_user( $contact_name, 'password', $contact_email );
$post_meta = array(
    'post_author'   => $user_id,
    'post_title'    => $contact_name,
    'post_content'  => 'Нет',
    'post_status'   => 'publish',
    'post_type'     => 'clients'
    );
$post_id = wp_insert_post( $post_meta ); 
add_post_meta($post_id, 'object_types', 'Не добавлено', true);
add_post_meta($post_id, 'area', 'Не добавлено', true);
add_post_meta($post_id, 'adress', 'Не добавлено', true);
add_post_meta($post_id, 'client_phone', $contact_phone, true);
$data = array(
    'comment_post_ID'      => $post_id,
    'comment_author'       => $user_id,
    'comment_content'      => $text,
    'comment_date'         => date('d-m-Y'),
    'comment_approved'     => 1,
    );
wp_insert_comment( $data );
echo "Спасибо, ваше сообщение отправлено. Скоро мы свяжемся с вами.";
wp_redirect( home_url() ); 
exit;
} ?>
<form class="single_contact_form flex_cc main_bg">
<input type="text" placeholder="Ваше имя" name="contact_name" required>
<input type="tel" placeholder="Номер телефона" name="contact_phone" required pattern="(\+?\d[- .]*){7,13}" title="Международный, государственный или местный телефонный номер">
<input type="email" placeholder="Email" name="contact_email" required>
<textarea name="text" id="text" cols="30" rows="6"></textarea>
<input type="hidden" name="submitted" value="1">
<input type="submit" value="Отправить">
</form>

Код работает, письмо приходит и все остальное тоже выполняется. Но после на странице я вижу следующее:

Warning: mysqli_real_escape_string() expects parameter 2 to be string, object given in .../wp-includes/wp-db.php on line 1171
Warning: mysqli_real_escape_string() expects parameter 2 to be string, object given in .../wp-includes/wp-db.php on line 1171
Спасибо, ваше сообщение отправлено. Скоро мы свяжемся с вами.
Warning: Cannot modify header information - headers already sent by (output started at .../header.php:1) in /wp-includes/pluggable.php on line 1195
Answer 1

Вижу тут две ошибки.

Warning: mysqli_real_escape_string() возникает из-за того, что в качестве $user_id в wp_insert_comment() передается объект WP_Error, который возвращает wp_create_user() в том случае, когда пользователь с таким email уже существует.

Warning: Cannot modify header information - из-за того, что нельзя делать никакой вывод на страницу до wp_redirect(). Эта функция использует php-функцию header, почитайте о ней здесь.

Даже если вы уберете echo из своего кода, вторая ошибка все равно будет возникать из-за вывода на страницу первого сообщения об ошибке.

UPDATE

Чтобы не возникала первая ошибка, проверяйте, есть ли уже такой пользователь перед созданием:

$user = get_user_by('email', $contact_email);
if ( ! $user ) {
    $user_id = wp_create_user( $contact_name, 'password', $contact_email );
} else {
    $user_id = $user->ID;
}
READ ALSO
Правильное ли условие

Правильное ли условие

Есть самописный POS для аптек на PHPИ тут чтоб кассир не смог продавать больше чем количество препарата которая есть на складе делаю так

285
Как вывести видео на сайте, зная его имя?

Как вывести видео на сайте, зная его имя?

Сделал добавление видео на сайт, файлы загружаются в ту папку, которую я указалВ базу данных я заношу имя файла, размер, тип

322
Magento + IIS не работает поиск на кириллице

Magento + IIS не работает поиск на кириллице

Всем привет! Прошу помочь в поиске решения проблемы! Есть сервер WS 2012 R2 magento 19

270
Периодическая ошибка Class Not Found

Периодическая ошибка Class Not Found

Здравствуйте! Пишу не большой сайт на Laravel 54, на нем имеется аутентификация через oAuth 2

317