Очень часто на форумах можно встретить уведомления «Ссылки могут видеть только зарегистрированные пользователи» или «Скачивание файлов доступно только для зарегистрированных».
Очевидно, что весь контент (весь пост полностью) закрыть легко, всего лишь добавив условие в файл темы, а я вам покажу, как скрывать конкретные участки поста, будь то предложение, ссылка или картинка.
Рассмотренные в этой статье примеры закрывают контент не только от неавторизованных посетителей сайта, но и от поисковиков.
Сначала создаем шорткод, вставив этот код в functions.php текущей темы:
function true_logged_in_user_content( $atts, $content = null ) { if ( is_user_logged_in() && !is_null( $content ) && !is_feed() ) { return $content; } return ''; // тут в кавычках можете написать сообщение об ошибке, отображающееся для пользователей, у которых нет доступа, можно использовать HTML. } add_shortcode( 'member', 'true_logged_in_user_content' );
Теперь второй шаг, при написании поста, когда вы захотите скрыть какую-то часть текста, просто поместите его между [member] и [/member], например:
[member] Этот текст увидят только зарегистрированные пользователи. [/member]
Сюда можно засунуть не только текст, но также ссылки (например ограничить доступ к скачиванию файлов), картинки и прочий HTML.
Тут действует тот же самый принцип, но только с некоторыми усовершенствованиями. Опять начинаем с создания шорткода через functions.php:
function true_content_by_user_cap( $attr, $content = null ) { // массив со значениями по умолчанию, которые будут применяться, если в шорткоде не был указан параметр $defaults = array( 'capability' => 'read' ); extract( shortcode_atts( $defaults, $attr ) ); if ( current_user_can( $capability ) && !is_null( $content ) && !is_feed() ) { return $content; } return ''; // указываем сообщение об ошибке если нужно } add_shortcode( 'access', 'true_content_by_user_cap' );
Сам шорткод на странице редактирования поста будет выглядеть следующим образом:
[access capability="edit_posts"] Эта часть контента видна пользователям, которые могут редактировать записи. [/access]
А в этом случае будут применяться значения по умолчанию из массива $defaults:
[access] Это сообщение увидят все зарегистрированные пользователи. [/access]
По сути вы можете доработать этот код, прописав туда отдельные условия для администраторов, отдельные для авторов и отдельные для незарегистрированных чуваков.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
спасибо! то , что надо! перекопала кучу плагинов, а тут такой простой и изящный метод!
рад, что смог помочь)
Почему то после вставки кода а functions.php и вывода шорткода в посте-ничего не происходит.только код не активный какой то-весь черный без подсветки.И этот код всплывает сверху в админке.Помогите разобраться в чем проблема...
это значит, что перед кодом надо добавить
<?php
сорри за долгий ответ.
Миша спасибо я уже разобрался) Действительно в этом проблема была...
ну я так и думал, ведь я почти через 5 дней ответил, реально не было возможности зайти на сайт и проверить комменты,
в след. раз постараюсь отвечать более быстро))
Миша подскажи пожалуйста...
А вот то же самое можно реализовать на Joomla ???
Очень хотелось бы...
я джумлой не занимаюсь, но по идее должна быть такая возможность (или плагин какой-нибудь)
Добрый день! У меня противоположная проблема, после работы со страничкой вдруг стала активна эта функция входа на страничку через пароль. ПОдскажите как убрать это и сделать как прежде свободный вход
НЕ РАБОТАЕТ! Не в коем случае не пробуйте так сделать!
перед кодом и после вставь
< ? php
Все работает,чего ты гонишь... Я на трех блогах проверял и никаких проблем...
Подскажите, как сделать так, чтобы скрыть один пункт в меню в шапке? На сайте есть меню: Главная Документы Контакты. Нужно сделать так, чтобы пункт "документы" становился видным после авторизации, а для гостей был скрыт.
Добрый день.
всё зависит от того, каким образом выводится это меню
Здравствуйте, Михаил!
Это отличное решение, но у него есть один существенный недостаток, поиск отлично видит скрытый контент и выводит страницу где он расположен, хоть сам блок и не виден.
Скажите, как сделать этот скрытый блок недоступным поиску?
Добрый день!
чтобы сказать точно, нужно смотреть и тестировать, а так мне кажется вам следует в шаблоне поиска заменить
get_the_content()
наthe_content()
. Теоретически.Михаил, добрый день.
У меня почему то не работает Ваш вариант.
Вставил код в Functions.php в конец файла.
До и после поставил < ? php
На странице своей обрамил текст [member] Text [/member]
но хоть регистрированный, хоть нет пользователь все равно видно текст.
И кстати видно и тег [member] вокруг текста.
В чем может быть проблема?
после кода надо наверное ?> ставить
Михаил, добрый день.
А для полного сайта(контента) можете показать пример? Типа гости только видели одну статическую страницу. Спасибо!
Добрый день!
Вот универсальное условие для администраторов / редакторов:
А вот для авторизованных пользователей:
Спасибо большое,все просто и все работает :)
Все перепробовал. Инструмент отнюдь не универсальный.
А что тебе нужно универсального? Миша дал рабочий вариант с помощью него я не 1 тысячу рубликов зарабатывал... нужен универсальный - купи Wish List Member и танцуй с бубном.
А что тебе нужно от меня? Считаешь нужной мне ту информацию, которую выдал под комментарием?:)
Михаил, может, подскажете, почему у меня все-таки не получается:
Установил шорткод, и он отлично работает на страницах. Вот код из файла functions.php:
Однако на странице редактирования шаблона (page.php) обычный шорткод не работает. Использую следующий вариант: Текст, который нужно скрыть, и получается вот такое: Требуется регистрацияТекст, который нужно скрыть. Естественно, фраза "Текст, который нужно скрыть" и должна скрываться фразой "Требуется регистрация".
Обычный вариант [member]Текст[/member] не работает, естественно. Как же "зажать" текст в эти теги на php-странице?
Так где он в итоге у вас работает, а где нет?
Работал в записях, не работал на страницах. Разобрался. Спасибо за пост.
Чтобы добавить "универсальности", советую отредактировать статью. Добавьте прямой пример рабочего кода для страниц .php:
Рад, что вы разобрались. Рекомендую ознакомиться с теорией, как работают шорткоды.
Ну спасибо, пошла Вордпресс переустанавливать. Все слетело - пустая страница.
Уверяю вас, переустанавливать WP совсем ни к чему. Во-первых, можете вставить код именно после
<?php
(почему-то мне кажется, что проблема в этом), во-вторых, вы можете просто удалить мой код, в третьих, вы можете зайти вwp-config.php
, включитьWP_DEBUG
и посмотреть, где именно возникла ошибка :PМиша в точку сказал... зачем WP то переустанавливать?
Да просто я только установила вордпресс, хостинг мне не знакомый, пока не могу понять как попасть в файловый менеджер, чтобы менять файлы, спасибо за совет, но быстрее будет переустановить заново.
все работает на 100% , скрывает кнопки например, подскажите, как сделать ссылку на страницу регистрации прямо с надписи которая закрывает контент "зарегистрируйтесь бла бла..."
Так не пробовали?
не пробовал, учусь только пробовать,затягивает)
Проблема в отображении текста ошибки, обвожу тегами, текст пропадает, но уведомления нет на месте скрытого текста
Можно взглянуть на вашу функцию?
Михаил, здравствуйте!
Пытаюсь сделать скрытый контейнер только для зарегистрированных пользователей без шорткода, но пока не получается... Подскажите как нужно? Вот пока что накропал:
Но он прячет не содержимое контейнера .private, а вообще всё содержимое записи...
Ну, чтобы не отвлекать маэстро глупостями, пишу ответ:
Кто-нибудь знает, как выбросит содержимое этого контейнера и из поиска тоже?
Здравствуйте!
А в поиске тоже функцией
the_content()
выводится?Здравствуйте, Михаил. Код работает хорошо, но возникла ситуация.
Я обернул в данные теги контент, где содержатся другие теги с прямыми скобками, в частности, я спрятал таблицу, в ячейках которой вставлены аудиозаписи в теге [audio]Музон[/audio]
В итоге незарегенные все правильно - не видят ничего, а вот зареганные видят исходный код контента, ни плееров, ни ссылок. Что можно придумать?
Здравствуйте!
Вот в этой статье, в самом низу, о том, как наложить фильтры.
Спасибо, Михаил, благодаря этой статье начал раскуривать коды. Добра Вам
Подскажите пожалуйста, возможно ли сделать этот метод для мультиязычного сайта? Установлен WP Multisite, русский и английский, файл functions.php один для всех. Т. е. или на английском сайте будет отображаться русское оповещение о регистрации, или на русском английское. Ну и ссылку соответственно не вставить о регистрации. Была идея написать уведомление через слеш, мол: "Регистрируйся/Register", но всё же.
Возможно, просто почитайте про функции работы с мультисайтом. У меня на блоге к сожалению об этом совсем немного.
Благодарю за быстрый ответ. Вышел из положения дублированием функции, добавил: "true_logged_in_user_content_en".
Прошу прощения, забыл спросить, а форматирование сообщения об ошибке возможно? Если да, подскажите пару трюков пожалуйста, изменить цвет, выделить жирным...
Так через CSS :)
Style.css? Открываем и... Как сослаться на функцию может подскажете? Методом тыка пытался менять стили, но меняется весь текст(
Там, где нужно указать сообщение об ошибке — оберните его например в
А потом в стилях:
Огромная благодарность! Всё работает как часы швейцарские! Всего Вам наилучшего!
Миш, объясни, что ты делаешь этой строчкой:
Я давно читал об этой функции, но что то не могу понять, что она здесь делает
Привет,
функция
shortcode_atts()
заменяет элементы массива$defaults
на элементы из$atts
, но только в том случае и только на те, которые указаны.Функция
extract()
"распечатывает" массив в переменные, то есть$attr['hello']
превратится в$hello
и т.д.Спасибо, понял!
Здравствуйте! А как вывести кастомное поле внутри шорткода?
Это поле можно вывести шорткодом [acf field="name"]
То есть как вместо контента поставить этот шорткод?)
Добрый день!
Ну шорткод внутри шорткода, ez
Добрый день! Подскажите, пожалуйста, в каком направлении "копать" :)
Есть сайт на WP. На сайте есть некий контент, разбитый на категории, условно "А" "Б" "В".
Вход на сайт только по логину/паролю. Регистрацией пользователя занимается администратор.
При регистрации пользователя, ему должна присваиваться группа, опять таки "А" "Б" "В". При этом пользователь из группы "А" должен иметь доступ к контенту категории "А", но не к "Б" "В". Пользователь из группы "Б" - к контенту из категории "Б" и т.д.
Администратор, естественно, должен иметь доступ ко всему контенту.
Суть вопроса - что использовать для реализации данной задумки? Механизм ролей? Или существуют более подходящие решения? :)
Добрый день!
А контент как будете скрывать? Через
if / else
?Михаил, здравствуйте! Подскажите, как объединить 2 ваши функции?
Чтобы одна надпись была для незарегистрированных, а вторая была для определенной группы пользователей? Я использую 2 шорткода, но при их добавлении одна из функций перестает работать (когда я авторизован и нахожусь в нужной группе).
Здравствуйте!
Я правильно понимаю? – вы используете шорткоды
member
иaccess
и при использовании этих 2 шорткодов, один перестает работать?Да все верно, мне нужно объединить все в 1 код с 1 шорткодом но чтобы уведомлений было 2 разных. 1 для незарегистрированных, а второй для роли пользователя.
А трудность у вас в чём конкретно?
Нужно все условия поместить в одну функцию.
Привет!
А можно как-то скрыть ссылку в посте, но с условием к примеру "открыть после 5 комметов".
Привет!
Да, можно получить количество комментариев пользователя например при помощи
get_comments()
:Доброго времени суток. Может подскажите как реализовать подобное на Elementor? Нужно некоторые секции или елементы скрыть для неавторизованых пользователей
Не подскажу, я не рекомендую использовать никакие конструкторы типа Elementor, Divi, Composer и т д начиная с начала 2019-го :)
Подскажите, пожалуйста, через get_role() можно как-то ограничить контент?
Например, показывать только для пользователей с ролью - Подписчик?
Или как это можно сделать если не через get_role?
Вы можете сделать это функцией current_user_can()
Здравствуйте, Михаил!
Подскажите пожалуйста, как сделать отображение контента только для НЕ зарегистрированных пользователей.
Чтобы часть контента (картинка на главной, текст, кнопка регистрации) после авторизации пользователя была НЕ видна?
Какой код для этого лучше использовать?
Добрый день Роман,
Думаю лучше всего использовать условие
if( ! is_user_logged_in() ) :
. В принципе вы можете использовать примеры из этого урока, добавляя в нужных местах знак!
.Михаил, спасибо большое!
Использовал первый вариант, добавил ! и всё получилось. Ура!
О-гонь!