У меня есть сайт цифровой загрузки, работающий на WordPress / WooCommerce, который требует, чтобы пользователи вошли в систему, чтобы покупать продукты. Для вышедших из системы пользователей вместо кнопки «Купить» отображается кнопка входа / регистрации на страницах продуктов, как показано здесь: https : //prnt.sc/1rc03lw. Я пытаюсь перенаправить пользователей после того, как они вошли в систему или зарегистрировались обратно на предыдущую страницу, но только если эта предыдущая страница была страницей продукта.

Вот код, который я сейчас использую, который сохраняет ссылающийся URL, а затем выполняет перенаправление. Перенаправление работает, но я пытаюсь ограничить его перенаправлением только в том случае, если URL-адрес реферала был страницей продукта (domain.com/product):

[КОД УДАЛЕНО]

Любая помощь будет оценена по достоинству! Спасибо, / JJ

РЕШЕНИЕ

Спасибо за все ответы! Вот что у нас получилось:

// Hide Add to Cart for logged out users
add_action( 'init', 'creatorcabin_hide_price_add_cart_not_logged_in' );
function creatorcabin_hide_price_add_cart_not_logged_in() {   
   if ( ! is_user_logged_in() ) {      
      remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
    }
}

// Add Login to Buy button for logged out users
add_action( 'woocommerce_single_product_summary', 'creatorcabin_user_logged_out_disable_add_to_cart', 30 );
function creatorcabin_user_logged_out_disable_add_to_cart() {
   if ( ! is_user_logged_in() ) {  
    $parameter = (is_singular("product")) ? '?product_page=1' : '';
    echo '<div class="login-to-buy-box"><h4 style="color: #E67E22;">Login to buy!</h4><p style="color: black;">Login or Sign Up for free to unlock the buy button and gain access to your downloads! <a href="/learn/using-our-website/why-do-i-need-an-account-to-buy-stuff/" target="_blank><p style="font-style: italic;">Why do I need an account to buy stuff?</p></a><a href="/my-account' . $parameter . '"><div class="user-bought-singleproduct">Login / Register ></div></a></div>';
    }
}

// Referer
add_action( 'woocommerce_login_form_end', 'creatorcabin_actual_referer' );
function creatorcabin_actual_referer() {
   $product_page = (isset($_GET['product_page'])) ? $_GET['product_page'] : 0;
   echo '<input type="hidden" name="product_page" value="' . $product_page . '" />';
}

// Start global session for saving the referer URL
function start_session() {
    if(!session_id()) {
        session_start();
    }
}
add_action('init', 'start_session', 1);

// Get referer URL and save it 
function redirect_url() {
    if (! is_user_logged_in()) {
        $_SESSION['referer_url'] = wp_get_referer();
    } else {
        session_destroy();
    }
}
add_action( 'template_redirect', 'redirect_url' );

//Login redirect 
function login_redirect() {
    if (isset($_SESSION['referer_url']) && isset($_POST['product_page']) && intval($_POST['product_page']) === 1) {
        wp_redirect($_SESSION['referer_url']);
        exit;
        
    } else {
        wp_redirect( '/my-account' );
        exit;
    }
}
add_filter('woocommerce_login_redirect', 'login_redirect', 1100, 2);

Огромное спасибо Идану за помощь в канале Slack для разработчиков WooCommerce!

0
jamesjohnsonw 16 Сен 2021 в 21:51

3 ответа

Лучший ответ

Почему бы вам просто не добавить аргумент запроса к ссылке на страницах продукта?

Edit: хорошо, так что не вдаваясь в подробности, так как я устал и несколько опьянен, и сейчас мне нельзя доверять точкам с запятой:

Я бы использовал https://developer.wordpress.org/reference/functions/wp_login_url/, чтобы настроить hrefs для моих ссылок входа. Вы заметите, что эта функция включает: a: необязательный аргумент для передачи URL-адреса, на который следует ссылаться после входа в систему и b: перехватчик фильтра под названием 'login_url', который вы можете использовать, чтобы перехватить процесс и применить в нем свою собственную логику.

Также wordpress поставляется с функцией, которая называется add_query_arg и делает именно то, что написано на жестяной банке. ( https://developer.wordpress.org/reference/functions/add_query_arg/ )

Поэтому, если бы я настроил какой-то php, который возвращал бы эту строку на странице продукта, я бы сделал что-то вроде этого:

$refer_to_url = get_permalink(get_the_ID()); //get current post/page permalink
$refer_to_url = add_query_arg('is_product_page', true, $refer_to_url); //add arguments to that url.
$this_login_url = wp_login_url($refer_to_url);

Тогда я бы, вероятно, попытался настроить фильтр, который изменил бы URL-адрес ссылки, например, страница учетной записи пользователя, если is_product_page не соответствует действительности. https://developer.wordpress.org/reference/functions/add_filter/

Вам также может потребоваться зарегистрировать queryvar, используя

add_filter( 'query_vars',  function ( $qvars ) {
    $qvars[] = 'is_product_page';          
    return $qvars;
}); 

В противном случае wordpress может отказаться обрабатывать запрос var.

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

1
WdeVlam 16 Сен 2021 в 21:35

Вам нужно проверить хук wp или template_redirect, является ли предыдущая страница страницей магазина или нет. Я предполагаю и предлагаю код.

Редирект после входа в систему будет перенаправлен, и вторая функция проверит, содержит ли URI запроса магазин или нет.

<?php

// Function to redirect after login (best so far)
function redirect_after_login(){
  global $wp;
 
      if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
        $redirect = home_url() . "/wp/wp-login.php?redirect_to= $protocol://" . 
        $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);


        $shop_url = $_SERVER["REQUEST_URI"];
        $shop_end = "/shop/";

        if (!endsWith($shop_url, $shop_end)) {

            wp_redirect( $redirect );
            exit;
        }
     }

}
add_action( 'wp', 'redirect_after_login', 3 );

// Check is previous page requst url shop page

function isCheckShop($haystack, $needle) {
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }
    return (substr($haystack, -$length) === $needle);
}
0
Vasim Shaikh 16 Сен 2021 в 19:45

Фактически,

Функция wp_login_url() позволяет указать переменную перенаправления через $redirect.

<?php 

// for the sake of the argument... 
$current_url = home_url( '/product/spiderman-toy-statue-red' );

// in live environment you could use something like this... 
// global $wp;
// $current_url = home_url( add_query_arg( $_GET, $wp->request ) );

echo '<a href="' . esc_url( wp_login_url( $current_url )  ) . '">Login redirect example</a>';

Ваш пользователь щелкнет эту ссылку на странице продукта и после входа будет перенаправлен на эту страницу.

0
amarinediary 16 Сен 2021 в 20:24