Wordpress - Object of class WP_Error could not be converted to string

422
01 июня 2017, 10:46

Есть вот такой код, который из данных формы отправляет письмо, добавляет пользователя, пост от его имени и комментарий к посту:

<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

Подскажите, в чем может быть причина и как это исправить?

Answer 1

Это происходит по следующей причине. Привожу выдержку из документации по функции wp_create_user():

Возвращает ID, если удалось добавить пользователя. Если создать не удалось (имя или мыло уже существуют), вернет объект WP_Error со следующими сообщениями об ошибке...

В итоге, первый раз пользователь создался и по вернувшемуся ID Вы делаете свои дела и всё работает. А во второй раз ID не возвращается, а возвращается объект WP_Error и ваш код пытается обработать его как ожидаемую строку - вот и ошибка. Используйте функцию is_wp_error(), чтобы делать проверку и на основе неё решать, вызывать ли WP_Query или нет.

Answer 2

Все из-за этой строчки:

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 преобразовать в строку. Код вылетает с сообщением об ошибке, приведенном в вопросе.

Answer 3

Спасибо @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;
    }
READ ALSO
Форма_обратной_связи

Форма_обратной_связи

На сайте, разработанном с помощью CMS WordPress, установлена форма обратной связи CONTACT FORM 7, все настроено, разрешено отправлять файлы до 50 mb, к отправке...

271
Preg_match_all() PHP

Preg_match_all() PHP

Есть строка

205
Хранение в базе данных

Хранение в базе данных

Задача следующая: Есть таблица nap (общая точка доступа и хранения информации)Есть алгоритмы: 1

226