Chức năng chuyển hướng bên trong một Shortcode


13

Tôi đang phát triển một plugin miễn phí để kết nối hệ thống hỗ trợ bên ngoài với WordPress để có thể xác thực người dùng trên WordPress.

Đối với điều này, hiện tại từ hệ thống bên ngoài, người dùng được gửi đến trang đăng nhập của WordPress với mục này ở cuối

?action=freshdesk-remote-login

Plugin của tôi sau đó kiểm tra xem người dùng có đăng nhập vào WP không, nếu không nó hiển thị biểu mẫu đăng nhập và sau khi đăng nhập thành công, hãy chuyển hướng họ quay lại trang web của bên thứ 3.

Chuyển hướng được thực hiện bằng cách sử dụng một cái gì đó như thế này: wp_redirect( $sso_url );

Bây giờ điều này hoạt động tốt, nhưng tôi dự định cung cấp một shortcode có thể được thêm vào một trang mà người dùng chọn. Bây giờ một khi người dùng truy cập trang này, nếu họ đã đăng nhập, họ sẽ được chuyển tiếp đến trang web của bên thứ 3, nếu không, sau đó đến trang đăng nhập.

Có cách nào bạn có thể đề xuất wp_redirect hoạt động bên trong một shortcode không?

Câu trả lời:


21

Như @Rarst giải thích, các mã ngắn thường chạy quá muộn để bạn chuyển hướng từ bên trong. Chúng thường chạy trên the_contenthook, sau khi nội dung được gửi tới trình duyệt. Nếu bạn cần chuyển hướng dựa trên sự hiện diện của một mã ngắn, bạn cần kiểm tra mã ngắn đó trước khi bất kỳ nội dung nào rời khỏi máy chủ.

function pre_process_shortcode() {
  if (!is_singular()) return;
  global $post;
  if (!empty($post->post_content)) {
    $regex = get_shortcode_regex();
    preg_match_all('/'.$regex.'/',$post->post_content,$matches);
    if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
      // redirect to third party site
    } else {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

Đó là "bằng chứng của khái niệm". Các điều kiện cụ thể bạn cần có thể sẽ khác nhau. Lưu ý rằng đó là một chút xử lý khá "nặng". Tôi chắc chắn rằng nó chỉ chạy khi thật cần thiết.


Cảm ơn rất nhiều. Điều này là hoàn hảo và chính xác những gì tôi đang tìm kiếm.
Harish Chouhan

Xin chào, tôi đã thêm một số kiểm tra để đảm bảo mã này chỉ chạy trên một trang cụ thể, tuy nhiên tôi nhận thấy rằng việc đặt wp_redirect bên trong một shortcode cũng hoạt động tốt. Tôi đã thử với javascript và cũng với wp_redirect( $sso_url );và nó chỉ hoạt động.
Harish Chouhan

1
wp_redirectkhông hoạt động trong một shortcode trong điều kiện bình thường. Tôi chỉ cần kiểm tra. Nếu nó hoạt động cho bạn, chủ đề hoặc plugin của bạn đang làm một cái gì đó giống như những gì tôi đề xuất để làm cho nó hoạt động.
s_ha_dum

Có bạn đúng. Xin lỗi vì đã làm mất thời giờ của bạn. Tôi đã có nhiều phiên bản mã của bạn. Tôi quay lại sử dụng mã trên của bạn :)
Harish Chouhan

5

wp_redirect()thực hiện chuyển hướng qua các tiêu đề HTTP để về mặt kỹ thuật, nó sẽ không (hoặc ít nhất là không nên) hoạt động sau khi đầu ra trang bắt đầu. Vì vậy, bạn không thể chỉ sử dụng chức năng này trong shortcode.

Điều đó không có nghĩa là tuy nhiên bạn không thể sử dụng shortcode để kiểm soát nó. Bạn có thể kiểm tra các điều kiện phù hợp (nếu trang và trang chứa shortcode) trước khi đầu ra bắt đầu (ở đâu đó quanh template_redirecthook) và thực hiện chuyển hướng sau đó.

Một tùy chọn khác là xuất ra JavaScript có điều kiện sẽ thực hiện chuyển hướng sau khi trang được tải.


Xin chào tôi đã tìm thấy điều này: `function pippin_login_form_shortcode ($ atts, $ content = null) {extract (shortcode_atts (mảng ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirect) {$ redirect_url = $ redirect; } khác {$ redirect_url = get_permalink (); } $ form = wp_login_form (mảng ('echo' => false, 'redirect' => $ redirect_url)); } trả về mẫu $; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Ở đây có vẻ như wp_redirect được đặt bên trong một shortcode.
Harish Chouhan


@HarishChouhan bạn thấy wp_redirect()mã đó ở đâu?
Rarst

Xin chào, tôi xin lỗi bạn đã đúng. Trong mã ví dụ, nó chỉ lưu URL và không thực sự chuyển hướng. Vì vậy, theo bạn, chuyển hướng dựa trên JavaScript dường như là lựa chọn duy nhất của tôi?
Harish Chouhan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.