Сессия WordPress / WC не переносится на следующую страницу - PullRequest
0 голосов
/ 08 ноября 2018

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

Это

<?php
    $customer = WC()->customer;
    $customer->set_billing_first_name("WORKING!!!");
    $customer->save();
    var_dump($customer->get_billing());
?>

Выводит это

array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)

Но тогда это

<?php
    $customer = WC()->customer;
    //$customer->set_billing_first_name("WORKING!!!");
    //$customer->save();
    var_dump($customer->get_billing());
?>

Выводит это

array (size=1)
'country' => string 'US' (length=2)

Несмотря на то, что я все еще должен быть твердо в том же сеансе и, следовательно, должен получить данные, хранящиеся до комментариев. Все, что я сделал, это обновил страницу после комментирования этих двух строк.

Я совершенно не прав относительно этих методов?


Проверено

  1. Среда настроена полностью правильно. Даже кто-то еще перепроверил это для меня. URL-адреса, кэши и т. Д.

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

  3. Пробовали это на двух разных серверах (один локальный, один удаленный) и у них та же проблема.

  4. Начинается с новой установки WP + WC, создается пустая тема functions.php, которая выполняет вышеуказанные действия для кода инициализации. Точно такая же проблема.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Если $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' );
0 голосов
/ 11 ноября 2018

Используете ли вы URL, установленный в Wordpress? Похоже, что он хранит cookie на основе URL-адреса, настроенного в приложении, а не фактического.

Надеюсь, это поможет.

Источник: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...