Изменение страницы auth_redirect () - PullRequest
1 голос
/ 11 марта 2020

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

Например, я хотел, чтобы одна из страниц открывалась только зарегистрированным пользователям, если они пытались получить доступ к странице, то сначала необходимо войти в систему, а затем включить ее. успех вернуться на эту страницу. У меня есть следующий код на моем function.php.

if ( is_page('user_only') && ! is_user_logged_in() ) {
    auth_redirect();
}

Проблема в том, что у меня есть пользовательская страница входа / регистрации, и вместо стандартной страницы входа в WordPress я хочу, чтобы auth_redirect(); использовал мой пользовательский страница входа / регистрации.

auth_redirect(); использует wp-login.php, и я хочу использовать свою пользовательскую страницу account/index.php. Можно ли это сделать? Я знаю о wp_redirect( url, );, но не думаю, что мне это нужно, поскольку его цель - только перенаправление, а не аутентификация.

1 Ответ

1 голос
/ 24 марта 2020

Отредактируйте функцию дочерней темы, она расположена по адресу:

C: \ xampp \ htdocs \ your-website \ wp-content \ themes \ your-theme \ functions. php

Затем в нижней части кода вставьте эти 3 функции .

FUNCTION # 1 Измените URL-адрес входа по умолчанию, который wp-login.php на вашу пользовательскую страницу. Например, https://localhost/my-website/my-account/.

/**Function to change the default `wp-login.php` with your custom login page **/
add_filter( 'login_url', 'new_login_page', 10, 3 );
function new_login_page( $login_url, $redirect, $force_reauth ) {
    $login_page = home_url( '/my-account/' ); //use the slug of your custom login page.
    return add_query_arg( 'redirect_to', $redirect, $login_page );
}

FUNCTION # 2 В моем случае я хотел redirect пользователей на странице Sign in/Registration, если они хотят получить доступ к wishlist или хотел перейти на страницу checkout, после успешного входа в систему они будут перенаправлены обратно на предыдущую страницу.

/**Function to redirect into `logged-in/Registration` page if not logged-in**/
add_action('template_redirect', 'redirect_if_not_logged_in');
function redirect_if_not_logged_in() {
    if (!is_user_logged_in() && (is_page('wishlist') || is_page('checkout'))) {
        auth_redirect(); //redirect into my custom login page
    }
}

FUNCTION # 3 Последнее, что нужно обработать перенаправление назад на предыдущую страницу после успешного входа в систему.

По какой-то причине, если вы используете страницу входа по умолчанию, которая является wp-login.php, а не пользовательскую страницу входа, перенаправление работает без использования приведенного ниже кода после успешного вошел в систему, и я все еще ищу объяснение этому, так как я новичок в WordPress, я думаю, что это как-то связано с пользовательской страницей входа в Woocommerce. В противном случае вы можете использовать приведенный ниже код для перенаправления обратно на предыдущую страницу после успешного входа в систему.

//function to create the redirection url
function redirect_link($redirect){
    //extract the redirection url, in my case the url with rederiction is https://my-website/my-account/?redirect_to=https://my-website/the-slug/ then I need to get the
    //https://my-website/the-slug by using the `strstr` and `substr` function of php.
    $redirect = substr(strstr($redirect, '='), 1); 

    //decode the url back to normal using the urldecode() function, otherwise the url_to_postid() won't work and will give you a different post id.
    $redirect = urldecode($redirect);

    //get the id of page that we weanted to redirect to using url_to_postid() function of wordpress.
    $redirect_page_id = url_to_postid( $redirect );

    //get the post using the id of the page
    $post = get_post($redirect_page_id); 

    //convert the id back into its original slug
    $slug = $post->post_name;

    if(!isset($slug) || trim($slug) === ''){ //if slug is empty or if doesn't exist redirect back to shop
        return get_permalink(get_page_by_path('shop'));
    }
    //re-create the url using get_permalink() and get_page_by_path() function.
    return get_permalink(get_page_by_path($slug));
}

/**Function to redirect back to previous page after succesfful logged-in**/
add_filter( 'woocommerce_login_redirect', 'redirect_back_after_logged_in');
function redirect_back_after_logged_in($redirect) {
    return redirect_link($redirect);
}

/**Function to redirect back to previous page after succesfful registration**/
add_filter( 'woocommerce_registration_redirect', 'cs_redirect_after_registration');
function cs_redirect_after_registration( $redirect ){
    return redirect_link($redirect);
}

Я не уверен, что это правильный способ сделать это с точки зрения безопасности и ошибок вопросы, я надеюсь, что кто-то укажет правильный путь, если есть, я буду редактировать это, если я нашел что-то лучше.

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