Saya memiliki beberapa posting yang tidak dipublikasikan di situs Wordpress saya dan saya mencoba membuatnya dapat diakses oleh pengguna normal (yang tidak masuk log) menggunakan siput posting normal ( site.com/post-here
). Saya mengerti ini mungkin bukan praktik terbaik tetapi untuk tujuan khusus saya, ini perlu dilakukan.
Saya telah mencoba menambahkan potongan kode berikut ke functions.php
file saya :
function enable_view_drafts() {
$role = get_role( 'subscriber' );
$role->add_cap( 'read_private_posts' );
$role->add_cap( 'edit_posts' );
}
add_action( 'after_setup_theme', 'enable_view_drafts');
Saya juga sudah mencoba init
hook after_setup_theme
. Tidak berhasil
Pemahaman saya adalah bahwa perubahan peran disimpan ke database sehingga hanya perlu dilakukan sekali. Itu sebabnya saya menggunakan after_setup_theme
hook untuk memanggil fungsi.
Tetapi ketika saya mencoba mengakses halaman sebagai pengguna normal, saya ditunjukkan halaman 404 alih-alih menunjukkan konten posting. Saya juga mencoba memuat URL pratinjau ( site.com/?p=212&preview=true
) tetapi itu tidak berhasil.
Ini tebakan saya:
- pengguna biasa tidak memiliki cukup
caps
untuk membaca posting konsep. - menguji dan melihat postingan konsep di front-end tidak dimungkinkan untuk semua pengguna (termasuk administrator).
Perubahan apa yang harus saya lakukan untuk mencapai apa yang saya coba lakukan? Jika tidak memungkinkan, solusi alternatif apa yang Anda sarankan?
Catatan: Saya tidak mencari solusi berbasis plugin.
sumber
Jawaban:
Anda tidak dapat menetapkan kemampuan untuk pengguna yang tidak dikenal. Jika Anda ingin membuat posting terlihat untuk semua orang, buat URL terpisah untuk posting ini dan tambahkan elemen kontrol ke editor posting untuk mengaktifkan pratinjau hanya pada posting yang dipilih.
Ketika URL semacam itu dipanggil, periksa apakah pratinjau diizinkan untuk kiriman dan apakah kiriman tersebut belum diterbitkan. Pastikan juga mesin pencari mengabaikan URL ini.
Untuk URL saya akan menggunakan titik akhir :
Sekarang Anda dapat membuat URL seperti ...
... di mana
123
ID pos.Kemudian gunakan penangan panggilan balik untuk memeriksa ID posting, periksa apakah valid dan timpa permintaan utama. Ini mungkin satu-satunya kasus penggunaan yang dapat diterima untuk
query_posts()
. :)Katakanlah titik akhir adalah kelas
T5_Endpoint
(model), dan output handler adalah kelasT5_Render_Endpoint
(tampilan) yang membuat model melewati sebelumnya. Lalu mungkin ada metode yangrender()
dipanggiltemplate_redirect
:$this->meta
adalah model lain (kelasT5_Post_Meta
) untuk nilai meta pos yang mengontrol jika pratinjau diizinkan. Kontrol diatur ke dalam kotak Publikasikan ( tindakanpost_submitbox_misc_actions
), diberikan oleh tampilan lain yang mendapatkan kelas meta yang sama.Jadi
T5_Post_Meta
tahu di mana dan kapan untuk menyimpan nilai meta, pandangan melakukan sesuatu dengannya.Selain itu, kaitkan ke dalam
transition_post_status
untuk menghapus kolom meta pos saat posting dipublikasikan. Kami tidak ingin menyia-nyiakan sumber daya, bukan?Ini hanya garis besar. Ada banyak detail yang harus dibahas ... Saya telah menulis sebuah plugin kecil yang menunjukkan cara mengimplementasikan ini: T5 Public Preview .
sumber
Saya memecahkan masalah ini dengan cara yang menurut saya lebih sederhana daripada jawaban @ toscho di atas.
Kasus penggunaan saya adalah saya menggunakan database yang sama untuk situs pementasan intranet internal dan situs yang menghadap publik, dan alur kerjanya adalah bahwa penulis menulis konsep dan membaginya dengan pengguna lain yang melihat draft tersebut di situs intranet, sebelum diterbitkan. Saya secara khusus tidak ingin meminta pengulas untuk masuk untuk melihat konsep, jadi saya hanya bergantung pada konstanta,
ENV_PRODUCTION
yang diatur dalam file wp-config berdasarkan nama host di$_SERVER['SERVER_NAME']
. Thats melakukan pemeriksaan diENV_PRODUCTION
sini; hanya menyingkat semua filter ini jika situs produksi sedang dilihat.Ini agak aneh, karena Anda harus terhubung setelah WP_Query menghapus semua postingan dari array $ wp_query-> posts, tetapi tampaknya stabil dan aman bagi saya.
Ada dua bagian terpisah untuk filter.
sumber
ENV_PRODUCTION
konstanta jika Anda sedang berproduksi. Saya menggunakan domain.com untuk produksi dan staging.domain.com untuk pementasan, jadi baris saya adalahdefine( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
Apakah itu membantu?Saya pikir plugin "Editor Peran Pengguna" yang tersedia di situs web WordPress.org mungkin yang Anda cari. Ngomong-ngomong, mengapa Anda ingin memberikan akses ke draft Anda untuk semua orang? Saya pribadi tidak bisa memikirkan contoh di mana ini akan diperlukan.
sumber
Anda hanya dapat mengubah visibilitas pada halaman / posting ke "Pribadi" yang hanya dapat dilihat oleh Editor dan Administrator dan bukan pengunjung umum, mesin pencari, rss feed, dll.
sumber
Saya pikir komentar GM adalah yang terbaik di sini. Saya berasumsi Anda mencoba melakukan hal berikut:
Apakah itu benar?
Sayangnya, saya tidak bisa memikirkan cara sederhana untuk melakukan ini. Anda dapat mempostingnya sebagai pos pribadi sehingga mereka perlu memasukkan kata sandi untuk melihatnya tetapi Anda harus masuk untuk ini. Anda juga bisa melindunginya dengan kata sandi, tetapi kemudian kata sandi itu masih akan muncul di feed dan daftar posting terbaru Anda, dll. Tidak bisakah Anda membuat akun pengguna tamu dan memberi mereka nama pengguna / kata sandi saat Anda memberikan URL?
Baca di sini untuk info lebih lanjut: http://codex.wordpress.org/Content_Visibility
Atau, ada plugin yang mungkin sesuai dengan kebutuhan Anda: http://wordpress.org/extend/plugins/shareadraft/ Saya melihat kode dengan cepat dan tampaknya pengembang memodifikasi nilai yang dikembalikan oleh get_post_status sehingga Anda mungkin dapat bermain-main dengan itu:
http://codex.wordpress.org/Function_Reference/get_post_status
HTH
sumber
Jika Anda tidak peduli apakah posting itu "diterbitkan" atau tidak, hanya ingin diakses oleh siapa saja di URL yang diterbitkan secara teratur dan tidak muncul di halaman utama / hasil pencarian / rss feed dll, plugin ini berfungsi dengan WP 4.6. 1 dan memungkinkan Anda menyempurnakan di mana posting muncul:
https://wordpress.org/plugins/wp-hide-post/
sumber