Такое всплывающее окно в админке WordPress бывает нужно для многопользовательских сайтов. Например, каждый, кто зарегистрировался на сайте после активации попадает в т.н. “Консоль”, а там ему показывается модальное окошко с определённым текстом – поздравлнием/правилами/прочим.
Задача
Она довольно ясна и часто востребована. Поэтому, сформулировав её чётко и внятно, приступим к её реализации.
Как сделать всплывающее окно приветствия в админке WordPress, которое будет появляться при каждом заходе пользователя (но не админа) до тех пор, пока он не нажмёт кнопку “Больше не показывать”?
Решение
Тут есть два пути: использовать встроенные библиотеки (thickbox), либо подключить сторонние (bootstrap). У обоих вариантов есть свои минусы. Например, Thickbox слабоват в настройках и выводит модальное окно только при нажатии на ссылку. А вот Bootstrap может подпортить стили вашей админки, потому что подгрузит свои.
Я остановился на втором варианте, достаточно долго промучившись с первым. Первое, что нужно сделать, это подключить две библиотеки и стили файле functions.php вашей темы:
function my_bootstrap_modals() { $screen = get_current_screen(); // проверка, где находимся в данный момент wp_register_script('modaljs', get_stylesheet_directory_uri() . '/assets/js/bootstrap.min.js', array('jquery'), '1', true); //ну вы поняли, этот файл должен быть уже на сайте в папке с Вашей темой wp_register_script('cookiejs', get_stylesheet_directory_uri() . '/assets/js/jquery.cookie.js', array('jquery'), '1', true); if ($screen->base == 'dashboard') { wp_register_style('modalcss', get_stylesheet_directory_uri() . '/assets/css/bootstrap.min.css', '', '', 'all');}; // подключить стили Bootstrap, если мы находимся на главной странице админки wp_enqueue_script('modaljs'); wp_enqueue_script('cookiejs'); wp_enqueue_style('modalcss'); } add_action('admin_enqueue_scripts', 'my_bootstrap_modals');
Теперь нам нужно вывести модальное (всплывающее) окно в корне админки для всех, кто не администратор. Для этого мы добавим следующий код:
add_action('admin_footer', 'open_modal'); function open_modal() { if (!current_user_can('manage_options')) { // если пользователь не может менять настройки сайта (значит, он не админ) $screen = get_current_screen(); // если текущее положение - основная страница "Консоли" и всплывающее окошко не запрещено куками if (($screen->base == 'dashboard') && ($_COOKIE['no-modal'] !== '1')) { ?> <!-- Обычный код для Bootstrap модального окна --> <div id="myModal" class="modal fade" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal">×</button> <h4 class="modal-title">Привет!</h4> </div> <div class="modal-body"> <p>Вы находитесь в админке нашего сайта. Заполните, пожалуйста <a href="profile.php">ваш профиль</a>!</p> </div> <div class="modal-footer"> <button class="btn btn-default" type="button" data-dismiss="modal">Ок</button> <button class="btn btn-primary no-more" data-dismiss="modal" type="button">Больше не показывать </button> </div> </div> </div> </div> <script> jQuery(document).ready(function () { jQuery('#myModal').modal('show'); // вывести модальное окно }); </script> <script> jQuery(".no-more").click(function () { // если нажата кнопка "Больше не показывать", то записать в куки единичку и нарушить условие показа модального окна var d = new Date(); d.setTime(d.getTime() + (1000 * 24 * 60 * 60 * 1000)); // не показывать 1000 суток var expires = "expires=" + d.toUTCString(); document.cookie = 'no-modal' + "=" + 1 + ";" + expires + ";path=/"; }); </script> <?php } } ?> <?php }
Этот код мы располагаем под первым и тестируем. Всё должно получиться. А чтобы сделать модальное окно посредине, добавьте такой код:
add_action('admin_head', 'center_bootstrap_modal'); function center_bootstrap_modal() { echo '<style> .modal { text-align: center; } @media screen and (min-width: 768px) { .modal:before { display: inline-block; vertical-align: middle; content: " "; height: 100%; } } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; } </style>'; }
Итоги.
Вот так довольно быстро и не затратно мы можем выводить своим пользователям сайта на WordPress всплывающее окошко. Буду рад замечаниям и предложениям по улучшению кода в комментариях.