У меня есть несколько неопубликованных постов на моем веб-сайте Wordpress, и я пытаюсь сделать его доступным для обычных пользователей (которые не вошли в систему) с помощью обычных пост-слагов ( site.com/post-here
). Я понимаю, что это не лучшая практика, но для моей особой цели это нужно сделать.
Я попытался добавить следующий фрагмент кода в мой functions.php
файл:
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');
Я также попробовал init
крюк вместо after_setup_theme
. Неудачно.
Насколько я понимаю, изменения ролей сохраняются в базе данных, поэтому их нужно выполнить только один раз. Вот почему я использую after_setup_theme
крючок для вызова функции.
Но когда я пытаюсь получить доступ к странице как обычный пользователь, мне показывают страницу 404 вместо того, чтобы показывать содержание сообщения. Я также попытался загрузить URL предварительного просмотра ( site.com/?p=212&preview=true
), но это тоже не сработало.
Это мои догадки:
- обычному пользователю не хватает
caps
читать черновик. - Тестирование и просмотр черновиков сообщений во внешнем интерфейсе невозможны ни для каких пользователей (включая администраторов).
Какие изменения я должен сделать, чтобы выполнить то, что я пытаюсь сделать? Если это невозможно, какие альтернативные решения вы предлагаете?
Примечание: я не ищу решения на основе плагинов.
источник
Ответы:
Вы не можете назначать возможности неизвестным пользователям. Если вы хотите сделать сообщение видимым для всех, создайте отдельный URL для этих сообщений и добавьте элемент управления в редактор сообщений, чтобы включить предварительный просмотр только для выбранных сообщений.
Когда вызывается такой URL-адрес, проверьте, разрешен ли предварительный просмотр для сообщения, и не было ли оно уже опубликовано. Также убедитесь, что поисковые системы игнорируют этот URL.
Для URL я бы использовал конечную точку :
Теперь вы можете создавать URL-адреса, как ...
… Где
123
идентификатор сообщения.Затем используйте обработчик обратного вызова, чтобы проверить идентификатор сообщения, проверить его действительность и переписать основной запрос. Это, вероятно, единственный приемлемый вариант использования для
query_posts()
. :)Допустим, конечная точка - это класс
T5_Endpoint
(модель), а обработчик вывода - это классT5_Render_Endpoint
(представление), который получает модель, переданную ранее. Тогда, вероятно, есть метод, который вызываетсяrender()
наtemplate_redirect
:$this->meta
является другой моделью (классомT5_Post_Meta
) для мета-значения post, которое контролирует, разрешен ли предварительный просмотр. Элемент управления устанавливается в поле « Публикация» ( действиеpost_submitbox_misc_actions
), отображаемое другим представлением, которое получает тот же мета-класс.Так что
T5_Post_Meta
знает, где и когда хранить мета-значение, представления с ним что-то делают.Кроме того, подключитесь,
transition_post_status
чтобы удалить мета-поле сообщения при публикации сообщения. Мы не хотим тратить ресурсы, верно?Это всего лишь набросок. Есть много деталей для рассмотрения ... Я написал небольшой плагин, который показывает, как реализовать это: T5 Public Preview .
источник
Я решил эту проблему более простым способом, чем ответ @ toscho выше.
В моем случае я использую одну и ту же базу данных для внутреннего промежуточного сайта интрасети и общедоступного сайта, и рабочий процесс заключается в том, что авторы пишут черновики и делятся ими с другими пользователями, которые просматривают эти черновики на сайте интрасети перед публикацией. Я специально не хотел требовать, чтобы рецензенты входили в систему, чтобы видеть черновики, поэтому я просто зависел от константы,
ENV_PRODUCTION
которая задается в файле wp-config на основе имени хоста в$_SERVER['SERVER_NAME']
. Вот что делают чекиENV_PRODUCTION
здесь; просто отключив все эти фильтры, если производственный сайт просматривается.Это немного странно, потому что вам нужно подключиться после того, как WP_Query удалит все записи из массива $ wp_query-> posts, но мне он кажется стабильным и безопасным.
В фильтрах есть две отдельные части.
источник
ENV_PRODUCTION
константу, если вы находитесь на производстве. Я использовал domain.com для производства и staging.domain.com для подготовки, поэтому моя линия была «define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
Помогает ли это?Я думаю, что плагин «User Role Editor», доступный на веб-сайте WordPress.org, может быть тем, что вы ищете. Кстати, почему ты хочешь дать доступ к своим черновикам всем? Лично я не могу вспомнить случай, когда это потребуется.
источник
Вы можете просто изменить видимость на странице / посте на «Приватный», который виден только редакторам и администраторам, а не публичным посетителям, поисковым системам, RSS-каналам и т. Д.
источник
Я думаю, что комментарий GM является лучшим здесь. Я предполагаю, что вы пытаетесь сделать следующее:
Это верно?
К сожалению, я не могу придумать простой способ сделать это. Вы можете опубликовать это как личное сообщение, чтобы им нужно было ввести пароль для просмотра, но для этого вам необходимо войти в систему. Вы также можете защитить его паролем, но тогда он все равно будет отображаться в вашем фиде и списке последних сообщений и т. Д. Не могли бы вы создать гостевую учетную запись пользователя и дать им имя пользователя / пароль, когда вы дадите им URL?
Читайте здесь для получения дополнительной информации: http://codex.wordpress.org/Content_Visibility
Кроме того, есть плагин, который может удовлетворить ваши потребности: http://wordpress.org/extend/plugins/shareadraft/ Я быстро просмотрел код, и оказалось, что разработчик изменяет значение, возвращаемое get_post_status, так что вы можете в состоянии поиграть с этим:
http://codex.wordpress.org/Function_Reference/get_post_status
НТН
источник
Если вам все равно, опубликовано ли это сообщение или нет, просто хотите, чтобы оно было доступно любому по обычному опубликованному URL-адресу и не отображалось на главной странице / результатах поиска / RSS-каналах и т. Д., Этот плагин работает с WP 4.6. 1 и позволяет вам точно настроить место появления сообщения:
https://wordpress.org/plugins/wp-hide-post/
источник