Почему, когда я создаю экземпляр ошибки wp в методе проверки, мой метод регистрации пользователя перестает работать?


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

Я работаю над плагином WordPress, который регистрирует пользователей в WordPress и хочет проверять данные, отправленные через форму. У меня есть класс для этого, вот его сокращенная версия:

namespace PluginName\Includes\Forms\Classes;

class Validation {

    public function validate_fields($field, $form_type){

      $errors = new WP_Error();
      $validated_fields = [];

      if(!is_email($field)):
        $errors->add('not_email', __('Entered an invalid email', 'plugin-name'));
      else:
        $validated_fields['user_email'] = $field;
      endif;

      //other validations

      $error_code = $errors->get_error_code();
      if(!empty($error_code)):
         return $errors;
      endif;

      return $validated_fields;

    }
}

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

Вот мой класс Register_User сокращенный:

namespace PluginName\Includes\Forms\Classes;

class Register_User{

    public function __construct(){
        add_action('wp_ajax_pn_register_user', [$this, 'pn_register_user']);
        add_action('wp_ajax_nopriv_pn_register_user', [$this, 'pn_register_user']);
    }

    public function pn_register_user(){
    
        if (!check_ajax_referer( 'reg_nonce' )):
            wp_die();
        endif;

        $form_validation = new Validation();
        $form_validation_results = $form_validation->validate_fields($_POST, 'registration');

        if(is_wp_error($form_validation_results)):
            
            error_log('Some error happened');

        else:

            error_log('No Errors to report');

            $userdata = array(
                'user_email' => $form_validation_results['user_email']
                //other fields
            );

            wp_insert_user($userdata);

        endif;

        wp_die();

    }

}

Это не работает, если у меня есть эта строка в классе проверки: $errors = new WP_Error(); - форма отправлена, но пользователь не зарегистрирован, как только я прокомментирую все, что связано с WP_Error, пользователь зарегистрирован нормально. И это не связано с какой-либо проверкой, даже без проверки, а просто с экземпляром объекта WP_Error, он не работает.

Опять же, я был бы очень признателен за любую помощь, которую я могу получить, моя голова вот-вот взорвется. Я ничего не смог найти на сайте или в другом месте. Я не уверен, что это проблема с областью действия или проблема ajax? что касается первого, я попытался сделать ошибки $ глобальными, но все равно безрезультатно.

Пожалуйста, помогите

Author: ryanaindimer, 2020-06-19

1 answers

Похоже, вам нужно использовать $errors = new \WP_Error(); в своем коде, поскольку WP_Error не является частью вашего пространства имен.

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

Использование new WP_Error():

% wp eval 'namespace PJ\NS\Test; $x = new WP_Error(); var_dump( $x );'
Fatal error: Uncaught Error: Class 'PJ\NS\Test\WP_Error' not found in phar:///usr/local/bin/wp/vendor/wp-cli/eval-command/src/Eval_Command.php(37) : eval()'d code:1
Stack trace:
#0 phar:///usr/local/bin/wp/vendor/wp-cli/eval-command/src/Eval_Command.php(37): eval()
#1 [internal function]: Eval_Command->__invoke(Array, Array)
#2 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/CommandFactory.php(98): call_user_func(Array, Array, Array)
#3 [internal function]: WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}(Array, Array)
#4 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Dispatcher/Subcommand.php(451): call_user_func(Object(Closure), Array, Array)
#5 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(371): WP_CLI\Dispatcher\Subcommand->invoke(Array, Array, Array)
#6 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(394): WP_CLI\Runner->run_command(Array, Array)
#7 phar:///usr/local/bin/wp/vendor/wp-cli/wp-cli/php/WP_CLI/Runner.php(87): WP_CLI\Runne in phar:///usr/local/bin/wp/vendor/wp-cli/eval-command/src/Eval_Command.php(37) : eval()'d code on line 1
Error: There has been a critical error on your website.Learn more about debugging in WordPress. There has been a critical error on your website.

Использование new \WP_Error():

% wp eval 'namespace PJ\NS\Test; $x = new \WP_Error(); var_dump( $x );'
object(WP_Error)#1516 (2) {
  ["errors"]=>
  array(0) {
  }
  ["error_data"]=>
  array(0) {
  }
}
 3
Author: Pat J, 2020-06-19 20:00:16