2013-03-14 1 views
1

Я получаю следующее сообщение об ошибке, когда с кодом, который я написал для моего плагина:Фатальная ошибка: Вызов функции члена get_error_code() на не-объект

Ошибка: Критическая ошибка: Вызов функции-члена get_error_code() на не-объекте в .../wp-login.php в строке 335

Я попытался сделать var_dump ($ errors) внутри wp-login.php и он возвращает 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); 

ответ

2

Код, который применяет фильтр является:

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

... так что вам нужно вернуть $ ошибки объекта из вашей функции. В настоящее время в вашем коде это произойдет, только если вы увидите исключение. Ваша вторая функция всегда возвращает $ 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); 
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