PluginProbe ʕ •ᴥ•ʔ
Disable Admin Notices – Hide Dashboard Notifications / trunk
Disable Admin Notices – Hide Dashboard Notifications vtrunk
1.4.5 trunk 1.0.0 1.0.2 1.0.3 1.0.5 1.0.6 1.1.1 1.1.3 1.1.4 1.2.0 1.2.2 1.2.3 1.2.4 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4
disable-admin-notices / libs / factory / core / includes / class-factory-notices.php
disable-admin-notices / libs / factory / core / includes Last commit date
activation 1 year ago assets-managment 1 year ago components 1 year ago entities 1 year ago updates 6 months ago class-check-compatibility.php 1 year ago class-factory-migrations.php 7 months ago class-factory-notices.php 1 year ago class-factory-options.php 1 year ago class-factory-plugin-abstract.php 6 months ago class-factory-plugin-base.php 1 year ago class-factory-requests.php 1 year ago class-factory-requirements.php 6 months ago functions.php 1 year ago index.php 3 years ago
class-factory-notices.php
303 lines
1 <?php
2
3 namespace WBCR\Factory_480;
4
5 use Wbcr_Factory480_Plugin;
6
7 // Exit if accessed directly
8 if( !defined('ABSPATH') ) {
9 exit;
10 }
11
12 /**
13 * A class to manage notices.
14 *
15 * @since 1.0.0
16 */
17
18 /**
19 * A group of classes and methods to create and manage notices.
20 *
21 * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
22 * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
23 *
24 * @package factory-notices
25 * @since 1.0.0
26 */
27 class Notices {
28
29 /**
30 * @var Wbcr_Factory480_Plugin
31 */
32 protected $plugin;
33 /**
34 * @var array
35 */
36 protected $notices = [];
37
38 /**
39 * @var array
40 */
41 protected $default_where = [
42 'plugins',
43 'themes',
44 'dashboard',
45 'edit',
46 'settings',
47 'dashboard-network',
48 'plugins-network',
49 'themes-network',
50 'settings-network',
51 ];
52
53 /**
54 * @var array
55 */
56 private $dissmised_notices;
57
58 /**
59 * Инициализируем уведомлений сразу после загрузки модуля уведомлений
60 *
61 * @param Wbcr_Factory480_Plugin $plugin
62 */
63 public function __construct($plugin)
64 {
65 //default notices
66 //---
67
68 $this->plugin = $plugin;
69 $this->dissmised_notices = $this->plugin->getPopulateOption('factory_dismissed_notices', []);
70
71 add_action('current_screen', [$this, 'currentScreenAction']);
72
73 if( defined('DOING_AJAX') && DOING_AJAX ) {
74 add_action('wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
75 $this,
76 'dismiss_notice'
77 ]);
78 }
79 }
80
81 /**
82 * Регистрирует экшены для работы с уведомлениями на текущем экране странице.
83 * Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
84 * �
85 отя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
86 */
87 public function currentScreenAction()
88 {
89 /**
90 * @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому �
91 уке мы заменили префикс на factory_480
92 */
93 $this->notices = apply_filters('wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName());
94
95 if( count($this->notices) == 0 ) {
96 return;
97 }
98
99 $screen = get_current_screen();
100
101 $has_notices = false;
102 foreach((array)$this->notices as $notice) {
103 if( !isset($notice['id']) ) {
104 continue;
105 }
106
107 $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
108
109 if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
110 $has_notices = true;
111 break;
112 };
113 }
114
115 if( $has_notices ) {
116 add_action('admin_footer', [$this, 'print_js_code']);
117
118 $this->show_notices();
119 }
120 }
121
122 /**
123 * Показывает все зарегистрированные уведомления для текущего плагина.
124 * Уведомления показываются только на определенны�
125 страница�
126 через параметр $notice['where'],
127 * если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
128 */
129 public function show_notices()
130 {
131 if( count($this->notices) == 0 ) {
132 return;
133 }
134
135 if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
136 return;
137 }
138
139 $screen = get_current_screen();
140
141 foreach($this->notices as $notice) {
142
143 if( !isset($notice['id']) ) {
144 continue;
145 }
146
147 $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
148
149 if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
150 if( $this->plugin->isNetworkActive() ) {
151 if( current_user_can('manage_network') ) {
152 add_action('network_admin_notices', function () use ($notice) {
153 $this->show_notice($notice);
154 });
155 add_action('admin_notices', function () use ($notice) {
156 $this->show_notice($notice);
157 });
158 }
159 } else {
160 add_action('admin_notices', function () use ($notice) {
161 $this->show_notice($notice);
162 });
163 }
164 };
165 }
166 }
167
168 /**
169 * Показывает уведомление, по переданным параметрам
170 *
171 * @param array $data - Параметры уведомления
172 * $data['id'] - Индентификатор уведомления
173 * $data['type'] - Тип уведомления (error, warning, success)
174 * $notice['where'] - На каки�
175 страница�
176 показывать уведомление ('plugins', 'dashboard', 'edit')
177 * $data['text'] - Текст уведомления
178 * $data['dismissible'] - Если true, уведомление будет с кнопкой закрыть
179 * $data['dismiss_expires'] - Когда снова показать уведомление, нужно указывать время в unix timestamp.
180 * Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
181 * $data['classes'] - Произвольный классы для контейнера уведомления.
182 */
183 public function show_notice($data)
184 {
185 $settings = wp_parse_args($data, [
186 'id' => null,
187 'text' => null,
188 'type' => 'error',
189 'dismissible' => false,
190 'dismiss_expires' => 0,
191 'classes' => []
192 ]);
193
194 if( empty($settings['id']) || empty($settings['text']) ) {
195 return;
196 }
197
198 $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
199
200 $classes = array_merge([
201 'notice',
202 'notice-' . $settings['type'],
203 $plugin_name . '-factory-notice'
204 ], $settings['classes']);
205
206 if( $settings['dismissible'] ) {
207 $classes[] = 'is-dismissible';
208 $classes[] = $plugin_name . '-factory-notice-dismiss';
209 }
210 ?>
211 <div data-name="wbcr_factory_notice_<?php echo esc_attr($data['id']) ?>" data-expires="<?php echo esc_attr($settings['dismiss_expires']) ?>" data-nonce="<?php echo wp_create_nonce($this->plugin->getPluginName() . '_factory_dismiss_notice'); ?>" class="<?php echo esc_attr(implode(' ', $classes)) ?>">
212 <?php echo $data['text'] ?>
213 </div>
214 <?php
215 }
216
217 /**
218 * Когда пользователь нажимает кнопку закрыть уведомление,
219 * отправляется ajax запрос с вызовом текущего метода
220 */
221 public function dismiss_notice()
222 {
223 if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
224 wp_die(-1, 403);
225 }
226
227 check_admin_referer($this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce');
228
229 // Имя уведомления (идентификатор)
230 $name = $this->plugin->request->post('name', null, true);
231
232 // Время в Unix timestamp, по истечению, которого уведомление снова будет показано
233 // Если передан 0, то уведомление будет скрыто навсегда
234 $expires = $this->plugin->request->post('expires', 0, 'intval');
235
236 if( empty($name) ) {
237 wp_send_json_error(['error_message' => 'You must pass the notification "Name"! Action was rejected.']);
238 }
239
240 $notices = $this->plugin->getPopulateOption("factory_dismissed_notices", []);
241
242 if( !empty($notices) ) {
243 foreach((array)$notices as $notice_id => $notice_expires) {
244 if( $notice_expires !== 0 && $notice_expires < time() ) {
245 unset($notices[$notice_id]);
246 }
247 }
248 }
249
250 $notices[$name] = $expires;
251
252 $this->plugin->updatePopulateOption('factory_dismissed_notices', $notices);
253
254 wp_send_json_success();
255 }
256
257 /**
258 * Javascript code
259 * Печает в подвале страницы код, для взаимодействия с сервером через ajax,
260 * код используется при нажатии на кнопку закрыть уведомление. *
261 */
262 public function print_js_code()
263 {
264 $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
265
266 ?>
267 <script type="text/javascript">
268 jQuery(function($) {
269
270 $(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
271 $.post(ajaxurl, {
272 'action': '<?php echo $this->plugin->getPluginName(); ?>_dismiss_notice',
273 'name': $(this).parent().data('name'),
274 'expires': $(this).parent().data('expires'),
275 'nonce': $(this).parent().attr('data-nonce')
276 });
277 });
278
279 });
280 </script>
281 <?php
282 }
283
284
285 /**
286 * Проверяет скрыто уведоление или нет
287 *
288 * @param string $notice_id - имя уведомления
289 *
290 * @return bool
291 */
292 protected function is_dissmissed($notice_id)
293 {
294 if( !empty($this->dissmised_notices) && isset($this->dissmised_notices['wbcr_factory_notice_' . $notice_id]) ) {
295 $expires = (int)$this->dissmised_notices['wbcr_factory_notice_' . $notice_id];
296
297 return $expires === 0 || $expires > time();
298 }
299
300 return false;
301 }
302 }
303