2

使用为插件编写的代码时出现以下错误:

错误:致命错误:在第 335 行的 .../wp-login.php 中对非对象调用成员函数 get_error_code()

我尝试在 wp-login.php 中执行 var_dump($errors) 并返回 NULL。

我的插件:(将注册用户添加到外部数据库)

 function add_user_to_SF($errors, $sanitized_user_login, $user_email ) {

 global $SF_USERNAME;
 global $SF_PASSWORD;
 global $errors;

 try {
   $mySforceConnection = new SforceEnterpriseClient();
   $mySoapClient = $mySforceConnection->createConnection(CD_PLUGIN_PATH . 'Toolkit/soapclient/enterprise.wsdl.xml');
   $mySFlogin = $mySforceConnection->login($SF_USERNAME, $SF_PASSWORD);

$sObject = new stdclass();
$sObject->FirstName = $_POST['user_login'];
$sObject->LastName = $_POST['user_login'];
$sObject->Email = $_POST['user_email'];

$createResponse = $mySforceConnection->create(array($sObject), 'Contact');

$ids = array();
    foreach ($createResponse as $createResult) {
        array_push($ids, $createResult->id);
    }

    } catch (Exception $e) {

      $errors->add( 'demo_error', __('<strong>ERROR</strong>: There is a Salesforce problem.','mydomain') );
      return $errors;
     }

 }

 add_filter( 'registration_errors', 'add_user_to_SF', 10, 3 );

此外,当我使用此功能测试该过程时,一切正常。

  function myplugin_registration_errors ($errors, $sanitized_user_login, $user_email) {
    if ( empty( $_POST['first_name'] ) )
        $errors->add( 'first_name_error', __('<strong>ERROR</strong>: You must include a first name.','mydomain') );

    return $errors;
}
 add_filter( 'registration_errors', 'myplugin_registration_errors', 10, 3 );
4

2 回答 2

2

应用过滤器的代码是:

$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );

...所以你需要从你的函数中返回 $errors 对象。目前在您的代码中,只有当您看到异常时才会发生这种情况。你的第二个函数总是返回 $errors,所以它会起作用。

此外,您不需要将 $errors 定义为全局,因为它是作为函数参数传入的。

尝试这个:

function add_user_to_SF($errors, $sanitized_user_login, $user_email ) {

    global $SF_USERNAME;
    global $SF_PASSWORD;
    // global $errors; // don't need to do this!

    try {
        $mySforceConnection = new SforceEnterpriseClient();
        $mySoapClient = $mySforceConnection->createConnection(CD_PLUGIN_PATH . 'Toolkit/soapclient/enterprise.wsdl.xml');
        $mySFlogin = $mySforceConnection->login($SF_USERNAME, $SF_PASSWORD);

        $sObject = new stdclass();
        $sObject->FirstName = $_POST['user_login'];
        $sObject->LastName = $_POST['user_login'];
        $sObject->Email = $_POST['user_email'];

        $createResponse = $mySforceConnection->create(array($sObject), 'Contact');

        $ids = array();
        foreach ($createResponse as $createResult) {
            array_push($ids, $createResult->id);
        }

    } catch (Exception $e) {
        $errors->add( 'demo_error', __('<strong>ERROR</strong>: There is a Salesforce problem.','mydomain') );
        // return $errors; // let's move this out of the exception handler block
    }

    return $errors; // always return the $errors object
}

add_filter( 'registration_errors', 'add_user_to_SF', 10, 3 );
于 2013-03-15T07:01:07.393 回答
0

你的函数必须返回变量$errors——即使你的逻辑没有新的错误。

'registration_errors'是一个过滤器,过滤器总是期望一个返回值。没有那个你的函数返回NULL,这就是var_dump()找到的。

所以基本的函数体应该是:

function add_user_to_SF($errors, $sanitized_user_login, $user_email ) {
    try {
    } catch (Exception $e) {
        return $errors;
    }
    return $errors; // important!
}

来源:https ://wordpress.stackexchange.com/a/90904/33667

于 2013-07-29T07:42:04.467 回答