Если $customer->save()
не сохраняет изменения, внесенные вами в данные клиента (например, $customer->set_billing_first_name('Test')
), то, скорее всего, клиент не зарегистрирован на сайте или не вошел в систему, где $customer->get_id()
означает 0
.
И это нормально, потому что идентификатор пользователя или идентификатор сеанса требуется для того, чтобы правильно сохранить изменения и сделать их постоянными на разных страницах.
Поэтому, когда пользователь не зарегистрирован / не вошел в систему, WooCommerce не начинает сеанс до тех пор, пока пользователь не войдет в систему или не добавит товар в корзину.
Но вы можете запустить сеанс вручную, например так: (добавьте код в файл functions.php
активной темы)
add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );
И затем изменения в данных клиента будут затем перенесены на другие страницы, если в браузере включены куки , потому что, как и WordPress, WooCommerce хранит свой идентификатор сессии (идентификатор пользователя или автоматически сгенерированный идентификатор / хэш) в файлах cookie & mdash; и идентификатор сеанса используется для установки / извлечения данных сеанса в базе данных & mdash; имя таблицы - woocommerce_sessions
, если без префикса таблицы.
Попробуйте после запуска сеанса WooCommerce:
$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}
А этот & ndash; Вы должны видеть новую дату при каждой загрузке страницы: (ну, ту, которую вы установили ранее)
echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can\'t be empty' );