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);

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

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (10 голоса, рейтинг: 4,30 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

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

12 комментарий

  1. Эдгар says:

    Доьрый день!
    Можно ли отобразить видимость контента в зависимости от выбранной группы. Например публикацию записи видят только Админы но не видят Участники или Редакторы?

  2. Андрей says:

    Класс!!! Добавил в избранное ;)
    Скажите, а как-то можно показать какой-то блок (div) в записях, но не показывать на страницах?
    Например, я добавил для записей (новостей) блок с призывом оставлять комментарии. Добавил прямо в singular.php. Но я не хочу, чтобы этот блок был виден на Страницах (Контакты, Автор, О проекте). Как тут быть?

    Заранее спасибо!

    1. Вячеслав Скоблей says:

      Такая конструкция проверяет, находимся ли мы на страницах записи (не страницы, а записи). Если да, то выполняем код:

      if( is_single( $post ) ){
      	echo "ваш код";
      }
  3. Юрий Декарт says:

    # Отключить видимость контента в диапазоне дат и месяца

    function content_not_show($atts, $content = null){
    extract(shortcode_atts(array(
    'from' => '',
    'to' => '',
    'month' => ''
    ), $atts));
    $dt=date("j");
    $dq=date("n");
    if ($dt>=$from && $dt<=$to && $dq==$month)
    {
    return false;
    }
    	return do_shortcode($content);
    }
    add_shortcode('not_show', 'content_not_show');

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

    [not_show from="1" to="10" month="1"]
    КОНТЕНТ
    [/not_show]
  4. Юрий Декарт says:

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

    function content_countdown_dataq($atts, $content = null){
    extract(shortcode_atts(array(
    'from' => '',
    'to' => '',
    'month' => ''
    ), $atts));
    $dt=date("j");
    $dq=date("n");
    if ($dt>=$from && $dt<=$to && $dq==$month)
    {
    return do_shortcode($content);
    }
    }
    add_shortcode('dataq', 'content_countdown_dataq');

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

    [dataq from="1" to="10" month="1"]
    Видимость контента в диапазоне дат и месяца
    [/dataq]
  5. Здравствуйте ! Шикарные шорткоды, очень полезные, лично для меня это клад! Подскажите а можно сделать шорткод что бы открывалась видимость только определённому пользователю, например с именем "Александр" ? А остальные ( зарегистрированные разумеется) пользователи этого контента бы не видели ? Спасибо. А ещё круче было бы что бы была возможность с бэкэнда подставлять значения и открывался бы определённый контент..

  6. Олег says:

    А как сделать что бы контент менялся автоматически.
    Например у меня есть на каждую неделю, свой контент,
    и чтобы он выводился на страницу в зависимости от номера недели.

  7. Леонид says:

    Большое спасибо за материал, очень полезно!
    Скажите, в вашей практике встречалась реализация показа части контента через метку в URL ?

    Например при переходе на http://domen.ru/coolpage/ контент странице скрыты
    А при переходе через http://domen.ru/coolpage/?content=active будет отображён скрытый контент

    Такое можно сделать?
    Спасибо за ответ и отдельно ещё раз спасибо за "Видимость контента после наступления даты" (вот прямо помогло!) !

    1. Вячеслав Скоблей says:

      Это обычный GET запрос. Применительно к PHP языку, обрабатывается так:

      <?php
      if ($_GET['content']=='active')
      {
      //отображаем скрытый контент
      }
      else
      {
      //прячем скрытый контент
      }
      ?>
      
  8. Светлана says:

    Здравствуйте! Подскажите, а как сделать так, чтобы контент отображался не в один день недели, а в два, к примеру в понедельник и пятницу?

    1. Вячеслав Скоблей says:

      Можно создать два контейнера для определенных дней недели:

      [week chislo="1"]
      Понедельник
      [/week]

      и

      [week chislo="5"]
      Пятница
      [/week]
      1. Светлана says:

        Спасибо за помощь!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *