Mam kilka niepublikowanych postów na mojej stronie Wordpress i staram się, aby były one dostępne dla zwykłych użytkowników (którzy nie są zalogowani) przy użyciu normalnych post slugs ( site.com/post-here
). Rozumiem, że może nie być to najlepsza praktyka, ale w moim specjalnym celu należy to zrobić.
Próbowałem dodać następujący fragment kodu do mojego functions.php
pliku:
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');
Próbowałem też init
zamiast haka after_setup_theme
. Brak szczęścia.
Rozumiem, że zmiany ról są zapisywane w bazie danych, więc trzeba to zrobić tylko raz. Dlatego używam after_setup_theme
hooka do wywołania funkcji.
Ale kiedy próbuję uzyskać dostęp do strony jako zwykły użytkownik, wyświetla się strona 404 zamiast treści postu. Próbowałem również załadować podgląd URL ( site.com/?p=212&preview=true
), ale to też nie działało.
Oto moje domysły:
- zwykły użytkownik nie ma wystarczającej ilości,
caps
aby przeczytać szkic posta. - testowanie i przeglądanie wersji roboczych postów na interfejsie nie jest możliwe dla żadnego użytkownika (w tym administratorów).
Jakie zmiany muszę wprowadzić, aby osiągnąć to, co próbuję zrobić? Jeśli nie jest to możliwe, jakie alternatywne rozwiązania sugerujesz?
Uwaga: nie szukam rozwiązań opartych na wtyczkach.
źródło
Odpowiedzi:
Nie można przypisać funkcji nieznanym użytkownikom. Jeśli chcesz, aby post był widoczny dla wszystkich, utwórz osobny adres URL dla tych postów i dodaj element sterujący do edytora postów, aby włączyć podgląd tylko wybranych postów.
Po wywołaniu takiego adresu URL sprawdź, czy podgląd postu jest dozwolony i czy post nie został jeszcze opublikowany. Upewnij się również, że wyszukiwarki ignorują ten adres URL.
Jako adres URL użyłbym punktu końcowego :
Teraz możesz tworzyć adresy URL, takie jak…
… Gdzie
123
jest identyfikator posta.Następnie użyj modułu obsługi wywołania zwrotnego, aby sprawdzić identyfikator posta, sprawdź, czy jest poprawny, i zastąp główne zapytanie. Jest to prawdopodobnie jedyny dopuszczalny przypadek użycia dla
query_posts()
. :)Powiedzmy, że punktem końcowym jest klasa
T5_Endpoint
(model), a procedura obsługi danych wyjściowych to klasaT5_Render_Endpoint
(widok), która wcześniej przekazuje model. Następnie prawdopodobnie jestrender()
wywoływana metodatemplate_redirect
:$this->meta
to kolejny model (klasaT5_Post_Meta
) dla meta wartości po, który kontroluje, czy podgląd jest dozwolony. Formant jest ustawiony w polu Publikuj ( akcjapost_submitbox_misc_actions
), renderowanym przez inny widok, który otrzymuje tę samą meta klasę.Więc
T5_Post_Meta
wie, gdzie i kiedy przechowywać wartość meta, widoki coś z tym robią.Ponadto, hak do
transition_post_status
usunięcia pola meta pocztowy gdy post jest opublikowany. Nie chcemy marnować zasobów, prawda?To tylko zarys. Jest wiele szczegółów do omówienia… Napisałem małą wtyczkę, która pokazuje, jak to zaimplementować: T5 Public Preview .
źródło
Rozwiązałem ten problem w sposób, który moim zdaniem był prostszy niż odpowiedź @ toscho powyżej.
Mój przypadek użycia polega na tym, że używam tej samej bazy danych dla wewnętrznej witryny pośredniej i wewnętrznej witryny intranetowej, a przepływ pracy polega na tym, że autorzy piszą wersje robocze i udostępniają je innym użytkownikom, którzy przeglądają te wersje robocze w witrynie intranetowej, przed opublikowaniem. W szczególności nie chciałem wymagać od recenzentów, aby logowali się, aby zobaczyć wersje robocze, więc po prostu polegam na stałej,
ENV_PRODUCTION
która jest ustawiona w pliku wp-config na podstawie nazwy hosta w$_SERVER['SERVER_NAME']
. To właśnieENV_PRODUCTION
robią tutaj kontrole ; po prostu zewrzyj wszystkie te filtry, jeśli przeglądana jest strona produkcyjna.Jest to trochę dziwne, ponieważ musisz podłączyć się po tym, jak WP_Query usuwa wszystkie posty z tablicy $ wp_query-> posts, ale wydaje mi się to stabilne i bezpieczne.
Filtry składają się z dwóch oddzielnych części.
źródło
ENV_PRODUCTION
stałą, jeśli jesteś w produkcji. Użyłem domain.com do produkcji i staging.domain.com do inscenizacji, więc moja linia brzmiała:define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
Czy to pomaga?Myślę, że wtyczka „User Role Editor” dostępna na stronie WordPress.org może być tym, czego szukasz. Nawiasem mówiąc, dlaczego chcesz wszystkim udostępnić swoje projekty? Osobiście nie mogę wymyślić przypadku, w którym byłoby to wymagane.
źródło
Możesz po prostu zmienić widoczność strony / postu na „Prywatna”, która jest widoczna tylko dla redaktorów i administratorów, a nie dla odwiedzających publicznych, wyszukiwarek, kanałów rss itp.
źródło
Myślę, że komentarz GM jest tutaj najlepszy. Zakładam, że próbujesz wykonać następujące czynności:
Czy to jest poprawne?
Niestety nie mogę wymyślić żadnego prostego sposobu na zrobienie tego. Możesz opublikować go jako post prywatny, aby musiał wprowadzić hasło, aby je wyświetlić, ale musisz być zalogowany. Możesz także zabezpieczyć hasłem, ale nadal będzie pojawiać się w Twoim kanale i liście ostatnich postów itp. Czy nie możesz utworzyć konta użytkownika-gościa i podać mu nazwę użytkownika / hasło, podając im adres URL?
Przeczytaj tutaj, aby uzyskać więcej informacji: http://codex.wordpress.org/Content_Visibility
Alternatywnie istnieje wtyczka, która może odpowiadać Twoim potrzebom: http://wordpress.org/extend/plugins/shareadraft/ Rzuciłem okiem na kod i wygląda na to, że programista modyfikuje wartość zwracaną przez get_post_status, więc możesz być w stanie się z tym bawić:
http://codex.wordpress.org/Function_Reference/get_post_status
HTH
źródło
Jeśli nie obchodzi Cię, czy post jest „opublikowany”, czy nie, po prostu chcę, aby był dostępny dla każdego pod zwykłym opublikowanym adresem URL i nie pojawiał się na stronie głównej / wynikach wyszukiwania / kanałach RSS itp., Ta wtyczka działała z WP 4.6. 1 i pozwala dostosować, gdzie pojawia się post:
https://wordpress.org/plugins/wp-hide-post/
źródło