Есть вот такой код, который из данных формы отправляет письмо, добавляет пользователя, пост от его имени и комментарий к посту:
<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="Отправить">
<?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("[email]", "Новое сообщение", "Имя:".$contact_name."\nEmail: ".$contact_email."\nНомер телефона: ".$contact_phone."\nСообщение:".$text."");
$user_id = get_user_by('email', $contact_email);
if ( ! $user_id ) {
$user_id = wp_create_user( $contact_name, 'password', $contact_email );
} else {
$user_id = $user->ID;
}
$args=array(
'post_type' => 'clients',
'post_status' => 'published',
'posts_per_page' => 1,
'author' => $user_id
);
$wp_query = new WP_Query($args);
while ( have_posts() ) : the_post();
$post_id = $post->ID;
endwhile;
if ( ! $post_id ) {
$post_meta = array(
'post_author' => $user_id,
'post_title' => wp_strip_all_tags( $contact_name ),
'post_content' => 'Нет',
'post_status' => 'publish',
'post_type' => 'clients'
);
$post_id = wp_insert_post( $post_meta, true );
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);
}
$user_info = get_userdata($user_id);
$data = array(
'comment_post_ID' => $post_id,
'comment_author' => $user_info->display_name,
'comment_content' => $text,
'comment_date' => date('d-m-Y'),
'comment_approved' => 1,
);
wp_insert_comment( $data );
die;
} ?>
Все отлично работает, меня устраивает, вроме одного НО: если передать два раза одно и то же Имя(contact_name), выдается такая ошибка
Recoverable fatal error:
Object of class WP_Error could not be converted to string in /wp-includes/class-wp-query.php on line 781
Подскажите, в чем может быть причина и как это исправить?
Это происходит по следующей причине. Привожу выдержку из документации по функции wp_create_user()
:
Возвращает ID, если удалось добавить пользователя. Если создать не удалось (имя или мыло уже существуют), вернет объект WP_Error со следующими сообщениями об ошибке...
В итоге, первый раз пользователь создался и по вернувшемуся ID
Вы делаете свои дела и всё работает. А во второй раз ID
не возвращается, а возвращается объект WP_Error
и ваш код пытается обработать его как ожидаемую строку - вот и ошибка. Используйте функцию is_wp_error()
, чтобы делать проверку и на основе неё решать, вызывать ли WP_Query
или нет.
Все из-за этой строчки:
post_status' => 'published',
Надо
post_status' => 'publish',
Вы неправильно указываете статус поста. Цикл while не находит таких постов. $post_id не присваивается значение.
Как следствие, не срабатывает как нужно if (! $post_id)
, т.е. код внутри if работает всегда.
Всегда вызывается функция wp_insert_post, которая уже при втором вызове возвращает в $post_id объект WP_Error.
При попытке выполнить add_post_meta не удается $post_id преобразовать в строку. Код вылетает с сообщением об ошибке, приведенном в вопросе.
Спасибо @campusboy. Действительно, я не учел, что имя - это логин, нужно делать его уникальным, а, собственно, имя, записывать в first_name. Итак, код:
$user_id = get_user_by('email', $contact_email);
if ( ! $user_id ) {
// добавим генетарор случайной строки
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
$string = '';
$max = strlen($characters) - 1;
for ($i = 0; $i < 6; $i++) {
$string .= $characters[mt_rand(0, $max)];
}
// сгенерируем логин из имени+случайных символов
$userdata = array(
'user_login' => ''.$contact_name.'_'.$string.'',
'user_pass' => 'password',
'user_email' => $contact_email,
'first_name' => $contact_name,
);
$user_id = wp_insert_user( $userdata ) ;
} else {
$user_id = $user->ID;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
На сайте, разработанном с помощью CMS WordPress, установлена форма обратной связи CONTACT FORM 7, все настроено, разрешено отправлять файлы до 50 mb, к отправке...
Задача следующая: Есть таблица nap (общая точка доступа и хранения информации)Есть алгоритмы: 1