Какова общая практика перенаправления пользователей обратно в корзину после выполнения определенных критериев?

Я создаю веб-сайт онлайн-курса с помощью Wordpress + Buddyboss + Woocommerce + Learndash. В соответствии с нашей политикой все пользователи должны заполнить свой профиль, прежде чем размещать заказ. Мне удалось добиться этого с помощью следующего кода:

add_action('woocommerce_before_checkout_form',function(){
  if (is_user_logged_in()){
    $user = wp_get_current_user();
    if ( bpprocn_has_incomplete_profile($user->id) ) { //check if profile is completed
      if (wp_redirect(bp_core_get_user_domain( $user->id ) . bp_get_profile_slug() . '/edit/group/2')) exit; //redirect user to profile edit page
    }
  }
});

Теперь, после того как пользователи закончат редактирование своего профиля и нажмут «сохранить», мне нужно перенаправить их обратно в корзину. Мне удалось создать пользовательское действие, которое срабатывает после отображения кнопки «сохранить профиль», и использовать это действие для отображения ссылки рядом с кнопкой «сохранить профиль».

add_action('wsk_add_continue_shop_button',function(){
    $user = wp_get_current_user();
    if (WC()->cart->get_cart_contents_count() && !bpprocn_has_incomplete_profile($user->id)) echo '<a class = "uk-button" href = "/cart">continue shopping</a>';  // if user's cart is not empty and profile is completed, show the "continue shopping" link.
  });

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

Я не могу просто сделать wp_redirect() в приведенном выше коде, потому что это перенаправит тех пользователей, которые заполнили свой профиль, имеют что-то в своей корзине и попадут на страницу редактирования профиля, что означает, что эти пользователи никогда не увидят страницу редактирования профиля, пока они не очистят их тележка.

Мои познания в PHP и Wordpress довольно ограничены, поэтому мне нужен совет. Одна вещь, которую я могу придумать, это проверить, пусто ли $_POST, если оно не пусто, то это, вероятно, означает, что пользователь просто отправляет некоторые изменения или новую информацию в своем профиле, и в этих случаях я могу сделать wp_redirect. Но надежен ли этот подход? Если пользователь просто хочет отредактировать свой профиль и у него есть что-то в корзине, он тоже будет перенаправлен, что нежелательно.

Еще один вопрос, о котором я могу подумать, это когда я делаю первое перенаправление (когда пользователи пытаются разместить заказ, перенаправляю их на страницу редактирования своего профиля, если их профиль не заполнен), есть ли способ пометить этого пользователя как «Этот пользователь имеет просто пытался сделать заказ и был перенаправлен", чтобы его можно было отличить от тех пользователей, которые не пытались сделать заказ и просто хотят отредактировать свой профиль? Мне кажется, что для этого мне нужно подключиться к данным сеанса, но у меня почти нулевые знания о манипулировании сеансом ... Есть ли у wordpress что-нибудь полезное в этом аспекте?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вы можете использовать оригинальное событие Wordpress — profile_update. Он срабатывает сразу после обновления существующего пользователя.

add_action('profile_update', 'checkUserUpdate', 10, 1);

функция checkUserUpdate($user_id) { // проверяем, заполнен ли ваш профиль пользователя и не пуста ли ваша корзина WC, и перенаправляем его в корзину }

Спасибо за информацию. Это полезно и частично решает мою проблему. Однако, если пользователь просто хотел отредактировать свой профиль и у него что-то есть в этой корзине, он тоже будет перенаправлен. Итак, вопрос в том, как мне отличить пользователей, которые просто хотят отредактировать свой профиль, и пользователей, которые должны были заполнить свой профиль при попытке разместить заказ?

shenkwen 06.04.2022 15:33

@shenkwen - Вы можете проверить реферера на странице редактирования профиля пользователя с помощью $referer = $_SERVER['HTTP_REFERER']; , и если реферером был сайт корзины покупок, вы можете установить флаг в сеансе wordpress $wp_session = WP_Session::get_instance(); $wp_session['userCameFromCart'] = true; Тогда событие сработает, и ваша функция будет выполнена, вы можете проверить флаг, и если это правда, вы можете перенаправить этого пользователя обратно на карту. И, возможно, вам следует снять флаг перед перенаправлением. Если флаг не был установлен или ложный - просто ничего не делаем и выходим из функции по return.

J P 07.04.2022 21:06

Спасибо за информацию. Опять же, это очень полезно. Я потратил время на изучение того, как использовать куки для решения этой проблемы. Как вы думаете, cookie - это более простой способ сделать это?

shenkwen 08.04.2022 04:25

@shenkwen Если вы используете файлы cookie или html5 local.storage, вы должны знать, что храните эту информацию в браузере пользователя. Если они вам понадобятся в PHP, вы должны как-то отправить их на сервер, например. через вызов Ajax. Поэтому я думаю, что путь над сессией легче.

J P 08.04.2022 14:09

Я подумал о том, как это сделать, и опубликовал еще один ответ. Пожалуйста, посмотрите, когда у вас будет шанс, спасибо!

shenkwen 09.04.2022 23:36

Я придумал способ решить эту проблему. Кажется, работает, но нужно больше тестов.

add_action('woocommerce_before_checkout_form',function(){
  if (is_user_logged_in()){
    $user = wp_get_current_user();
    if ( bpprocn_has_incomplete_profile($user->id) ) { //check if profile is completed
      if (wp_redirect(bp_core_get_user_domain( $user->id ) . bp_get_profile_slug() . '/edit/group/2?redirected=wsk_checkout')) exit; //redirect user to profile edit page with a GET parameter
    }
  }
});

Если пользователь попытается оформить заказ без заполненного профиля, он будет перенаправлен на страницу редактирования профиля с параметром GET. На этой странице, если они завершат свой профиль и сохранят изменения, сработает действие «profile_update», и страница редактирования профиля перезагрузится с HTTP_REFERER, которая содержит ранее установленный параметр GET:

add_action('profile_update',function(){
  $user = wp_get_current_user();
  if (WC()->cart->get_cart_contents_count() && !bpprocn_has_incomplete_profile($user->id) && str_contains($_SERVER['HTTP_REFERER'],'wsk_checkout')) { 
      wp_redirect('/checkout');
      exit;
    }
  });

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

Таким образом, пользователи, которые просто пытаются обновить свой профиль и у которых есть что-то в корзине, не будут перенаправлены на страницу оформления заказа, потому что у них не будет параметра GET.

Другие вопросы по теме