Redirect function di dalam Shortcode

13

Saya sedang mengembangkan plugin gratis untuk menghubungkan sistem pendukung eksternal ke WordPress untuk dapat mengotentikasi pengguna di WordPress.

Untuk ini, saat ini dari sistem eksternal, pengguna dikirim ke halaman login WordPress dengan ini di akhir

?action=freshdesk-remote-login

Plugin saya kemudian memeriksa apakah pengguna login ke WP, jika tidak menunjukkan form login dan setelah login berhasil, mengarahkan mereka kembali ke situs pihak ke-3.

Pengalihan dilakukan menggunakan sesuatu seperti ini: wp_redirect( $sso_url );

Sekarang ini berfungsi dengan baik, tetapi saya berencana untuk menawarkan kode pendek yang dapat ditambahkan ke halaman yang dipilih pengguna. Sekarang setelah pengguna masuk ke halaman ini, jika mereka login, mereka harus diteruskan ke situs pihak ke-3, jika tidak, maka ke halaman login.

Apakah ada cara Anda bisa menyarankan wp_redirect untuk bekerja di dalam kode pendek?

Harish Chouhan
sumber

Jawaban:

21

Seperti yang dijelaskan oleh @Rarst, shortcode biasanya terlambat untuk Anda redirect dari dalam satu. Mereka biasanya berjalan pada the_contenthook yang baik setelah konten dikirim ke browser. Jika Anda perlu mengarahkan ulang berdasarkan keberadaan kode pendek Anda harus memeriksa kode pendek itu sebelum konten meninggalkan server.

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);

Itu adalah "bukti konsep". Kondisi khusus yang Anda butuhkan kemungkinan akan berbeda. Perhatikan bahwa itu adalah proses yang cukup "berat". Saya akan memastikan itu hanya berjalan di mana benar-benar diperlukan.

s_ha_dum
sumber
Terima kasih banyak. Ini sempurna dan persis apa yang saya cari.
Harish Chouhan
Halo, saya menambahkan beberapa cek untuk memastikan kode ini hanya berjalan pada halaman tertentu, namun saya perhatikan, bahwa menempatkan wp_redirect di dalam shortcode juga berfungsi dengan baik. Saya mencoba dengan javascript dan juga dengan wp_redirect( $sso_url );dan itu hanya berhasil.
Harish Chouhan
1
wp_redirecttidak bekerja dalam kode pendek dalam kondisi normal. Aku baru saja memeriksa. Jika itu berfungsi untuk Anda, tema atau plugin Anda melakukan sesuatu seperti yang saya sarankan untuk membuatnya berfungsi.
s_ha_dum
Ya kamu benar. Maaf membuang waktu Anda. Saya memiliki beberapa contoh kode Anda. Saya kembali menggunakan kode Anda di atas :)
Harish Chouhan
5

wp_redirect()melakukan redirect melalui header HTTP sehingga secara teknis itu tidak akan (atau setidaknya tidak seharusnya) bekerja setelah output halaman dimulai. Jadi Anda tidak bisa hanya menggunakan fungsi ini dalam kode pendek.

Namun itu tidak berarti Anda tidak dapat menggunakan kode pendek untuk mengontrolnya. Anda dapat memeriksa kondisi pemasangan (jika halaman dan halaman berisi kode pendek) sebelum output dimulai (di sekitar template_redirecthook) dan lakukan redirect.

Pilihan lain adalah untuk menghasilkan JavaScript bersyarat yang akan melakukan pengalihan setelah halaman dimuat.

Jarang
sumber
Halo Saya menemukan ini: `function pippin_login_form_shortcode ($ atts, $ content = null) {ekstrak (shortcode_atts (array ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirect) {$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (array ('echo' => false, 'redirect' => $ redirect_url)); } mengembalikan $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Ini sepertinya wp_redirect ditempatkan di dalam shortcode.
Harish Chouhan
Tautannya
Harish Chouhan
@HarishChouhan di mana Anda melihat wp_redirect()kode itu?
Jarang
Halo, maaf Anda benar. Dalam kode contoh itu hanya menyimpan URL dan tidak benar-benar mengarahkan ulang. Jadi menurut Anda, pengalihan berbasis JavaScript sepertinya menjadi satu-satunya pilihan saya?
Harish Chouhan