От автора: На форумах и всевозможных сайтах Вы могли не раз видеть некий скрытый контент — ссылку, картинку и пр. — для просмотра которого необходимо авторизоваться. Гости вместо скрытого содержимого видят что-то типа «Авторизуйтесь для просмотра скрытого содержимого». Авторизованные же пользователи без проблем видят скрытый контент.
Сегодня я поделюсь с Вами способом, как организовать подобную вещь на сайте. В качестве исходников к данному уроку я воспользуюсь исходниками из урока Установка визуального редактора с файловым менеджером и исходниками из урока Создание простой системы авторизации. Также Вы можете написать собственное решение для управления контентом страницы и разграничения гостей и авторизованных пользователей.
Внимание!!! В связи со спецификой публикации (при публикации используются BB-теги, которые пересекаются с публикуемыми BB-тегами) рекомендуется просмотреть текстовую версию.
Детали учебника
Тема: PHP, регулярные выражения
Сложность: Средняя

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!Урок: Видео версия (.mp4)
Время: 00:30:06
Размер архива: 67 Mb
Итак, соединив исходники из обоих указанных уроков, я получил примерно такую картину:
Здесь форма авторизации нам нужна как раз для того, чтобы отличать авторизованного пользователя от гостя. Если пользователь успешно авторизован, то в сессии создается переменная $_SESSION['admin']. Конечно же, если на сайте будет множественная регистрация/авторизация, то переменную логичнее назвать $_SESSION['user'], но у нас предусмотрен 1 пользователь. Создание же системы регистрации не есть темой данного урока.
Теперь о том, как бы мы хотели публиковать скрытое содержимое. Как правило, для этого используются BB-теги HIDE. Не будем оригинальными и воспользуемся традиционным названием. Таким образом, публикация скрытой ссылки будет иметь следующий вид:
1 | [HIDE]<a href="//google.com/">Скрытая ссылка</a>[/HIDE] |
Пока что, независимо от того гость или авторизованный пользователь просматривает страницу, мы увидим одно и то же:
Прежде всего, поработаем с гостем и добьемся того, чтобы вместо текущего результата он видел сообщение о скрытом контенте. Как Вы, наверное, уже догадались, нам потребуются возможности регулярных выражений. Итак, давайте составим шаблон:
1 | $pattern = '#\[hide].*?\[/hide]#is'; |
Данный шаблон ищет в тексте BB-теги HIDE и все, что в них содержится. При этом шаблон будет регистронезависимым (благодаря модификатору «i») и мультистрочным (благодаря модификатору «s», обеспечивающему совпадение метасимвола точки с переносом строки). Стоит также обратить внимание, что после квантификатора «*» мы поставили еще один квантификатор — «?» — тем самым делая первый квантификатор «ленивым». Это обеспечивает корректную работу шаблона с двумя и более блоками HIDE в тексте.

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!Итак, шаблон готов и мы можем приступить к написанию несложной функции:
1 2 3 4 5 6 7 8 9 | function hide_content($content){ if(!$_SESSION['admin']){ $pattern = '#\[hide].*?\[/hide]#is'; $content = preg_replace($pattern, '<div class="hide">Авторизуйтесь для просмотра скрытого содержимого</div>', $content); return $content; }else{ return $content; } } |
И несколько правил для класса hide:
1 2 3 4 5 6 | .hide{ border: 1px solid #765858; background: #ffeded; color: #7f5354; padding: 3px; } |
И вызовем функцию hide_content() для выводимого текста. В нашем случае это будет иметь следующий вид:
1 2 | $text = hide_content($item['text']); echo code_content($text); |
В переменную $text попадет пропущенный через функцию hide_content() выводимый текст. Ну а строкой ниже он будет выведен.
Теперь вместо BB-тегов HIDE и их содержимого гость будет видеть то, что мы и хотели:
С гостями мы «разобрались», но авторизованные пользователи видят скрытое содержимое в не совсем приглядном виде — хотелось бы убрать BB-теги HIDE и как-то оформить данный блок. Немного допишем функцию hide_content():
1 2 3 4 5 6 7 8 9 10 11 | function hide_content($content){ if(!$_SESSION['admin']){ $pattern = '#\[hide].*?\[/hide]#is'; $content = preg_replace($pattern, '<div class="hide">Авторизуйтесь для просмотра скрытого содержимого</div>', $content); return $content; }else{ $pattern = '#\[hide](.*?)\[/hide]#is'; $content = preg_replace($pattern, '<div class="show">$1</div>', $content); return $content; } } |
Здесь мы немного изменили шаблон. Поскольку нам нужно показывать содержимое тегов HIDE, мы воспользовались запоминающими скобками — (.*?). Ну а в функции preg_replace(), соответственно, ссылаемся на запомненное — $1.
И несколько правил для класса show:
1 2 3 4 5 6 7 8 9 | .show{ border: 1px solid #adc092; background: #f0faf1; color: #58715e; padding: 3px; } .show a{ color: #58715e; } |
Теперь можно оценить результат и для авторизованного пользователя:
Вот и все. Задача реализована и, как видите, реализуется она довольно просто. Удачи и до новых встреч!

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!
Разработка веб-приложения на PHP
Скачайте видеокурс и узнайте, как создать веб-приложение на PHP
Скачать
Здравствуйте, Андрей!
Это всё замечательно, но, у всех этих способов, есть один существенный минус, который еще не удалось решить никому в мире. Скрытый контент, прекрасно виден через поиск wordpress то есть, если в поисковом запросе будет слово из скрытого содержимого, скажем слово «ссылка» в вашем случае, то поиск выдаст страницу где будет статья с этим самым скрытым содержимым, пусть даже в самой статье слово «ссылка» и не встречается. Вот так…
Здравствуйте, Павел.
И если уж на то пошло, то заявление «не удалось решить никому в мире» на самом деле ошибочно:
Вы меня, конечно, извините, но при чем здесь WordPress? В уроке я ни словом не обмолвился об этой CMS
1) во-первых, если уж взяли WP, то будет выдана статья, в которой будет все тот же скрытый контент, поскольку для вывода результатов поиска используется все та же функция the_content(), что и для показа статьи… саму ссылку он не увидит в любом случае;
2) ну а, во-вторых, кто мешает перед тем, как отдать результаты поиска, обработать эти самые результаты, и удалить из объекта posts все статьи (или просто не выводить их в цикле), в которых встречается тег HIDE и содержимое тега совпадает с поисковым запросом? Мне кажется, что никто не мешает и все в руках ваших
А как сделать вот такое окно, которое всплыло перед тем, как прочесть эту запись? Это скрипт Попова? Или другой? Я очень хочу что-то подобное, но у меня нет платного аккаунта в смарте
Андрей, не подскажете как можно это реализовать?
Спасибо
Реализовать можно без проблем, но в комментариях показать, как это можно сделать, конечно же, невозможно… для этого нужен, как минимум, отдельный урок.