Почему is_wp_error () не возвращает false, даже нет определенной ошибки

В представлении формы я беру комментарий пользователя для пользовательской цели для своего плагина. Я проверяю, пусто ли поле комментария или нет, и поле комментария заполнено не менее 30 символами. Если оба варианта в порядке, я хочу вставить комментарий.

Вот мой код:

<?php global $current_user, $post; if( isset( $_POST['send'] ) && isset( $_POST['test_nonce'] ) && wp_verify_nonce( $_POST['test_nonce'], 'testify_nonce' ) ) { //global $error; $error = new WP_Error(); $comment_content = $_POST['comment_content']; if( empty( $comment_content ) ) { $error->add( 'comment_empty', __("Comment field can't be empty.") ); } if ( strlen( $comment_content ) < 30 ) { $error->add( 'comment_short', __("Your comment is too short. Write down at least 30 characters.") ); } //test test test var_dump($error); if( is_wp_error( $error ) ) { echo 1; } //test test test if( is_wp_error( $error ) ) { echo '<div class="alert alert-danger" role="alert">'; echo $error->get_error_message(); echo '</div>'; } else { $commentdata = array( 'comment_post_ID' => $post->ID, 'comment_author' => $current_user->display_name, 'comment_author_email' => $current_user->user_email, 'comment_author_url' => $current_user->user_url, 'comment_content' => htmlentities( $comment_content ), 'comment_type' => '', 'comment_parent' => 0, 'user_id' => $current_user->ID, 'comment_approved' => '1' //approve by default ); //Insert new comment and get the comment ID $comment_id = wp_insert_comment( $commentdata ); if( ! is_wp_error( $comment_id ) ) { echo '<div class="alert alert-success" role="alert">'; _e( 'Your comment is successfully submitted.', 'text-domain' ); echo '</div>'; } else { echo '<div class="alert alert-danger" role="alert">'; echo $comment_id->get_error_message(); echo '</div>'; } //endif( ! is_wp_error( $comment_id ) ) } //endif( is_wp_error( $error ) ) } //endif( $_POST['send'] ) ?> <form method="post" enctype="multipart/form-data"> <textarea name="comment_content" id="" class="form-control" rows="6"></textarea> <?php wp_nonce_field( 'testify_nonce', 'test_nonce' ); ?> <button type="submit" name="send" class="btn btn-primary"><?php _e( 'Submit', 'text-domain' ); ?></button> </form> 

Но при var_dump( $error ); формы, если я var_dump( $error ); :

 object(WP_Error)[398] public 'errors' => array (size=0) empty public 'error_data' => array (size=0) empty 

он пуст, но все равно if( is_wp_error( $error ) ) { echo 1; } if( is_wp_error( $error ) ) { echo 1; } показывает 1 . И поэтому комментарий не вставляет.

Что я делаю не так?

Solutions Collecting From Web of "Почему is_wp_error () не возвращает false, даже нет определенной ошибки"

Функция is_wp_error проверяет, является ли данный var экземпляром класса WP_Error ( код soruce как WP 4.2.2 ):

 function is_wp_error( $thing ) { return ( $thing instanceof WP_Error ); } 

Как вы можете видеть, если данная переменная является экземпляром класса WP_Error, функция возвращает true, даже если объект пуст. Ваша переменная $error – это экземпляр WP_Error , пустой, но экземпляр WP_Error , поэтому он возвращает true. Вы могли бы что-то сделать:

 if( is_wp_error( $error ) && ! empty( $error->errors ) ) 

Или инициируйте WP_Error только в условиях WP_Error (напишите здесь, не тестировалось):

 $errors = array(); if( empty( $comment_content ) ) { $errors['comment_empty'] = __("Comment field can't be empty."); } if ( strlen( $comment_content ) < 30 ) { $errors['comment_short'] = __("Your comment is too short. Write down at least 30 characters."); } if( ! empty( $errors ) ) { $wp_error = new WP_Error(); foreach( $errors as $error => $message) { $error->add( $error, $message ); } } if( is_wp_error( $wp_error ) ) { }