为什么当我在验证方法中实例化wp_error时,我的用户注册方法停止工作?

时间:2020-06-19 作者:ryanaindimer

我真的,真的,非常感谢我在这里能得到的任何见解。

我正在开发一个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\\u 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();

    }

}
如果我在validation类中有以下行,则此操作无效:$errors = new WP_Error(); - 表单已提交,但没有用户注册,只要我注释掉与WP\\U错误相关的所有内容,用户就会正常注册。而且这不是由于任何验证,即使没有验证,也只是实例化的WP\\u Error对象不起作用。

再一次,我真的很感激能得到的任何帮助,我的头快要爆炸了。我在网站或其他地方找不到任何东西。我不确定这是范围界定问题还是ajax问题?关于前者,我尝试在全局范围内生成$错误,但仍然没有结果。

请帮忙

1 个回复
最合适的回答,由SO网友:Pat J 整理而成

看来你需要使用$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) {
  }
}