Когда я пишу пост и планирую его для последующей публикации, WordPress позволит мне просмотреть сообщение, как если бы оно уже было опубликовано, но мне нужно войти в систему как администратор (или любой, кто имеет право просматривать этот пост).
Есть ли способ, возможно, параметр строки запроса, чтобы сделать предварительный просмотр сообщения кем угодно, а также анонимными пользователями? Что-то вроде my-post?previewsecret=645732116468
?
Посмотрите на этот кусок кода ядра в query.php, который
[Проверяет] статус сообщения, чтобы определить, должна ли отображаться почта.
http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2658
if ( ! is_user_logged_in() ) { // User must be logged in to view unpublished posts. $this->posts = array(); }
… то, что делает его несколько непростым для обхода для не зарегистрированных пользователей. Вы можете переопределить результат этой функции, зайдя глубже, а затем заботясь о ролях. Но это слишком много накладных расходов и может способствовать открытой безопасности.
Если вы посмотрите немного дальше http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2632 в строке 2632, вы обнаружите, что сообщение действительно выведено из базы данных и может быть дополнительно отфильтрован с помощью posts_results
который приходит на пару строк ниже.
Сохраните значение сообщения и введите его до конца после всех проверок, которые аннулируют массив posts
. http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2740, где the_posts
нетерпением ждет крюк the_posts
.
Итак, что-то грубое выглядело бы так:
add_filter( 'posts_results', 'wpse46014_peek_into_private', null, 2 ); function wpse46014_peek_into_private( $posts, &$query ) { if ( sizeof( $posts ) != 1 ) return $posts; /* not interested */ $status = get_post_status( $posts[0] ); $post_status_obj = get_post_status_object( $status ); if ( $post_status_obj->public ) return $posts; /* it's public */ if ( !isset( $_GET['key'] ) || $_GET['key'] != 'foryoureyesonly' ) return $posts; /* not for your eyes */ $query->_my_private_stash = $posts; /* stash away */ add_filter( 'the_posts', 'wpse46014_inject_private', null, 2 ); } function wpse46014_inject_private( $posts, &$query ) { /* do only once */ remove_filter( 'the_posts', 'wpse46014_inject_private', null, 2 ); return $query->_my_private_stash; }
Добавить ссылку предварительного просмотра сообщения с секретным ключом ?p=4601&key=foryoureyesonly
и сообщение отображается для всех. В коде есть грязные ходы, например, в stash, вместо этого вы можете использовать globals
(не рекомендуется) или обернуть его в объект (да!), А затем расширить функциональность с помощью пользовательских паролей для каждого сообщения и т. Д.
Запланированные превью работают очень схожим образом. Сообщения posts_results
заполняются 'future'
постов статуса абсолютно таким же образом, и одни и те же крючки можно использовать. Код будет работать без изменений для запланированных сообщений.
/2012/07/12/one-two-three/
– 404 NOT FOUND
/2012/07/12/one-two-three/?key=foryoureyesonly
– 200 OK
Ответ Soulseekah невероятный, и то, что я искал. В поисках этого я также наткнулся на плагин (который может основываться на этом сообщении для всего, что я знаю).
Публичный просмотр сообщений