WordPress: управление видимостью контента

Иногда бывает полезным скрыть и/или показать часть контента в записях/страницах WordPress в зависимости от тех или иных условий. Условия и ситуации бывают разными. Допустим, вы проводите конкурс на своем сайте и условия конкурса или его результаты должны автоматически появится на сайте 17 числа текущего месяца. Или вы распространяете ссылки на своем сайте, но не хотите, чтобы их видели все, а только зарегистрированные пользователи сайта. Или вы принимаете анкеты на сайте от аудитории, но хотите показывать анкету на сайте только с 1 по 10 число каждого месяца… И т.д.

Плагинов, управляющих контентом WordPress, разумеется, есть великое множество. Удовлетворяют ли они все востребованные ситуации — не ясно. Но и сделать такое самому (без использования плагинов) не так и сложно. Мы будем использовать шорткоды — это простой набор функций для создания и использования макро-кодов в содержимом записей/страниц. Мы накодируем некоторые типичные ситуации, отталкиваясь от них, вы сможете создать и свою особенную функцию.

Для каждой ситуации нам потребуется функция шорткода, она обычно вставляется в файл functions.php текущей темы и пример непосредственного использования в теле записи/страницы.

Контент виден только для зарегистрированных пользователей

Часть контента на странице можно скрыть от не зарегистрированных пользователей (естественно, его не увидят и роботы поисковых систем). Обычно скрывают: ссылки для скачивания файла, ответ на какой-то вопрос, оставшуюся часть контента (с целью мотивации пользователей регистрироваться и т.д.).

function logged_in_user_content($atts, $content = null) {
if (is_user_logged_in() && !is_null($content) && !is_feed()) {
return $content;
}
return 'Доступно только для зарегистрированных пользователей';
}
add_shortcode( 'vizible', 'logged_in_user_content');

Использование в теле записи/страницы:

[vizible]
Этот текст увидят только зарегистрированные пользователи. Он также будет исключен из поиска.
[/vizible]

Видимость контента в зависимости от роли пользователя на сайте

У зарегистрированных пользователей бывают и различные роли (можно здесь почитать). Вы можете оперировать контентом на своем сайте, если используете градации доступа юзеров на своем сайте:

function content_by_user($attr, $content = null) {
$defaults = array(
'capability' => ''
);
extract(shortcode_atts($defaults, $attr));
if (current_user_can($capability) && !is_null($content) && !is_feed() ) {
return $content;
}
return 'У Вас не хватает прав';
}
add_shortcode('rolecontent', content_by_user');

Использование в теле записи/страницы:

[rolecontent capability="edit_posts"]
Эта часть контента видна пользователям, c соответствующими правами на сайте.
[/rolecontent]

Можно использовать следующие параметры:

  • read — контент будет виден всем
  • edit_posts — виден редакторам
  • manage_options — только администраторам

Видимость контента в диапазоне дат каждого месяца

Если вы хотите сделать видимым часть контента в определенном диапазоне дат каждого месяца (скажем, с 1 по 10 число), можно использовать такой шорткод:

function content_countdown($atts, $content = null){
extract(shortcode_atts(array(
'ot' => '',
'do' => ''
), $atts));
$dt=date("j");
if ($dt>=$ot && $dt<=$do)
{
return $content;
}
}
add_shortcode('data', 'content_countdown');

Использование в теле записи/страницы:

[data ot="1" do="10"]
Показываем пользователям то, что будет доступно лишь с 1 по 10 число (включительно) каждого месяца.
[/data]

Видимость контента в определенное число месяца

Бывает полезным, например, если 30 числа каждого месяца вы подводите какие-то итоги. Делается как и аналогично в прошлом случае, с некоторыми модификациями:

function content_countdown_data($atts, $content = null){
extract(shortcode_atts(array(
'chislo' => ''
), $atts));
$dt=date("j");
if ($dt==$chislo)
{
return $content;
}
}
add_shortcode('datas', 'content_countdown_data');

Использование в теле записи/страницы:

[datas chislo="30"]
Этот контент будет доступным пользователям лишь 30 числа каждого месяца.
[/datas]

Видимость контента в определенный день недели

Контент можно прятать/показывать и в определенный день недели (понедельник, вторник и т.д.)

function content_countdown_w($atts, $content = null){
extract(shortcode_atts(array(
'chislo' => ''
), $atts));
$dt=date("w");
if ($dt==$chislo)
{
return $content;
}
}
add_shortcode('week', 'content_countdown_w');

Использование в теле записи/страницы:

[week chislo="0"]
Этот контент будет доступен лишь в определенный день недели.
Достаточно указать в параметре порядковый номер дня недели:
от 0 (воскресенье) до 6 (суббота)
[/week]

Видимость контента только в определенный месяц в году

Чтобы выводить контент на своем сайте в отдельном месяце года (не уверен, что кому-то надо, но все же), используем такой шорткод:

function content_countdown_month($atts, $content = null){
extract(shortcode_atts(array(
'month' => ''
), $atts));
$dt=date("n");
if ($dt==$month)
{
return $content;
}
}
add_shortcode('month', 'content_countdown_month');

Использование в теле записи/страницы:

[month month="1"]
Этот контент будет доступным пользователям лишь в январе месяце. Число указывать: от 1 до 12.
[/month]

Видимость контента в диапазоне месяцев

А вдруг вам понадобится показывать/прятать контент лишь летом или зимой? Или в первый квартал года? Можем сделать таким шорткод:

function content_countdown_months($atts, $content = null){
extract(shortcode_atts(array(
'ot' => '',
'do' => ''
), $atts));
$dt=date("n");
if ($dt>=$ot && $dt<=$do)
{
return $content;
}
}
add_shortcode('months', 'content_countdown_months');

Использование в теле записи/страницы:

[months ot="1" do="3"]
Контент будет доступен лишь в первом квартале года, с 1 по 3 месяц (включительно).
[/months]

Видимость контента после наступления даты

Вы можете спрятать содержимое, которое посетители вашего сайта увидят только после наступления необходимой даты. Такой код будет востребован для информера о наступлении Нового года, об окончания конкурса, марафона на сайте и т.д.

function content_countdown_day($atts, $content = null){
extract(shortcode_atts(array(
'month' => '',
'day' => '',
'year' => ''
), $atts));
$remain = ceil((mktime( 0,0,0,(int)$month,(int)$day,(int)$year) - time())/86400);
if( $remain > 1 ){
return $daysremain = "Осталось дней - <strong>($remain)</strong>";
} else if($remain == 1 ){
return $daysremain = "Остался <strong>1</strong> день";
} else{
return $content;
}
}
add_shortcode('newyear', 'content_countdown_day');

Использование в теле записи/страницы:

[newyear month="01" day="01" year="2018"]
Новый год! Давайте праздновать!
[/newyear]

Если не работают шорткоды в шорткоде

Все вышеприведенные шорткоды призваны прятать/показывать некоторый HTML код на ваших страницах. Но что произойдет, если в шорткод заключить шорткод? Правильно, вложенный шорткод не будет работать. Такой конфликт случится, например, если вы попытаетесь вложить в шорткод контактную форму, например так:

[month month="1"]
[соntаct-fоrm-7 id="6122" title="Контактная форма"]
[/month]

Чтобы заставить шорткод работать в шорткоде WordPress нам необходимо заменить всего одну строку в функциях приведенных здесь шорткодов. Строчку:

return $content;

заменить на:

return do_shortcode($content);

Все должно работать!

Источник https://seo-zona.ru/wordpress-upravlenie-vidimostyu-kontenta-2017-10-08.html
От Вячеслав Скоблей