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-plugin-base.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 5 months ago class-check-compatibility.php 1 year ago class-factory-migrations.php 6 months ago class-factory-notices.php 1 year ago class-factory-options.php 1 year ago class-factory-plugin-abstract.php 5 months ago class-factory-plugin-base.php 1 year ago class-factory-requests.php 1 year ago class-factory-requirements.php 5 months ago functions.php 1 year ago index.php 3 years ago
class-factory-plugin-base.php
615 lines
1 <?php
2 // Exit if accessed directly
3 if( !defined('ABSPATH') ) {
4 exit;
5 }
6
7 /**
8 * Базовый класс для создания нового плагина. Полную реализацию класса смотрите в Wbcr_Factory480_Plugin
9 *
10 * Документация по классу: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/392724484
11 * Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
12 * Репозиторий: https://github.com/alexkovalevv
13 *
14 * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
15 * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
16 *
17 * @since 1.0.0
18 * @package factory-core
19 */
20 class Wbcr_Factory480_Base {
21
22 use WBCR\Factory_480\Options;
23
24 /**
25 * Обязательное свойство. Префикс, используется для создания пространство имен.
26 * Чаще всего используется на именования опций в базе данны�
27 . Также может быть
28 * использован для именования полей html форм, создания уникальны�
29 имен, �
30 уков.
31 * Пример: wrio_
32 *
33 * Для префикса всегда используете нижнее подчеркивание справа!
34 *
35 * @var string
36 */
37 protected $prefix;
38
39 /**
40 * Обязательное свойство. Заголовок плагина. Используете в интерфейсе плагина,
41 * может быть использован в уведомления�
42 для администратора, чтобы пользователь
43 * мог понять, с каким плагином он ведет коммуникацию. Пример: Robin image optimizer
44 *
45 * @var string
46 */
47 protected $plugin_title;
48
49 /**
50 * Обязательное свойство. Имя плагина. Используется аналогично префиксу, но с небольшим
51 * отличием. Имя плагина имеет человеку понятную строку, которую можно использовать в
52 * именовании �
53 уков, созданию условной логики. Допустимые символы [A-z0-9_].
54 * Пример: wbcr_clearfy
55 *
56 * @var string
57 */
58 protected $plugin_name;
59
60 protected $plugin_slug;
61
62 /**
63 * Обязательное свойство. Версия плагина в формате 0.0.0. Допустимые символы [0-9.]
64 *
65 * @var string
66 */
67 protected $plugin_version;
68
69 /**
70 * Обязательное свойство. Текстовый домен плагина, используется для подключения файлов
71 * переводов. Рекомендуется использовать slug плагина, идентичный slug в репозитории
72 * Wordpress.org
73 *
74 * @since 4.1.1
75 * @var string
76 */
77 protected $plugin_text_domain;
78
79 /**
80 * Обязательное свойство. Информация для поддержки клиента. Для начала работы плагина,
81 * достаточно только указать адрес лендинга в атрибут url. На лендинге должны быть
82 * созданы страницы features, pricing, support, docs. Если страницы (features, pricing,
83 * support, docs) не могут иметь такие же адреса, вы можете наложить карту адресов в
84 * атрибуте pages_map. К примеру: я создал страницу "Pro Features" и она имеет адрес
85 * {site}/premium-features, для pages_map в атрибуте features, я указал, что адрес
86 * страницы со списком функций имеет слаг premium-features. Теперь плагин будет понимать,
87 * что адрес страницы со списком функций будет таким:
88 * https://robin-image-optimizer.webcraftic.com/premium-features.
89 *
90 * Это свойство заполняется для того, чтобы в процессе разработки вы могли использовать
91 * экземпляр класса \WBCR\Factory_480\Entities\Support, для получения информации о сайте плагина.
92 * Тем самым вы избавляете себя от жесткого прописывания ссылок на лендинг плагина и
93 * можете изменить все ссылки в одном месте.
94 *
95 * @var array
96 */
97 protected $support_details;
98
99 /**
100 * Включение/отключение обновлений для бесплатного плагина. Если вашего плагина нет в репозитори
101 * Wordpress.org, вы можете включить собственный режим обновлений, например через GitHub или
102 * собственный репозиторий. Если установлено true, плагин будет проверять наличие обновлений
103 * для этого плагина.
104 *
105 * @var bool
106 */
107 protected $has_updates = false;
108
109 /**
110 * Настройка обновлений для бесплатного плагина. Если вы �
111 отите настроить обновления для
112 * бесплатного плагина через собственный репозиторий (например: github), вам нужно указать имя
113 * репозитория и slug плагина. Slug может быть идентичен имени репозитория в github. Для Wordpress.org
114 * эти настройки не обязательны, так как в wordpress ядре есть встроенные функции для обновлений
115 * плагинов и тем.
116 *
117 * @var array
118 */
119 protected $updates_settings = [];
120
121 /**
122 * Включение/отключение премиум версии для плагина. Если вы создаете бесплатный плагин и �
123 отите
124 * реализовать для него премиум версию, вам нужно начать с этого свойства. Если свойство установлено,
125 * как true, при инициализации плагина будут подключены функции лицензирования, проверки обновлений
126 * для премиум версии.
127 *
128 * @var bool
129 */
130 protected $has_premium = false;
131
132 /**
133 * Настройки лицензирования
134 *
135 * Лицензирование плагина может быть реализовано для любого провайдера,
136 * к примеру: freemius, codecanyon, templatemonster, вам нужно указать только настройки для
137 * взаимодействия с выбранным вами провайдером. Каждая реализация провайдера лицензий может иметь
138 * индивидуальный настройки, в этом примере приведены настройки для freemius провайдера
139 * WBCR\Factory_480\Premium\Provider > WBCR\Factory_Freemius_170\Premium\Provider
140 *
141 * На текущий момент существует только реализация для freemius провайдера.
142 *
143 * Для премиум плагина вы должны также указать настройки обновлений. Атрибут has_updates
144 * включает/отключает обновления для премиум плагина, в атрибуте updates_settings вы указываете
145 * дополнительные настройки обновлений.
146 *
147 * @var array
148 */
149 protected $license_settings = [];
150
151 /**
152 * Переключатель внутренней рекламы в плагине
153 *
154 * Если установить true, то плагин будет показывать рекламу компании в интерфейсе Wordpress.
155 * Рекламный модуль может отображать рекламу внутри инрефейса плагина, на странице dashboard
156 * и создавать сквозные уведомления на все�
157 страница�
158 админ панели Wordpress.
159 *
160 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
161 * @since 4.1.9
162 * @var bool
163 */
164 protected $render_adverts = false;
165
166 /**
167 * Настройки внутренней рекламы компании
168 *
169 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
170 * @since 4.1.9
171 * @var array
172 */
173 protected $adverts_settings = [];
174
175 /**
176 * Обязательное свойство. Подключаемые модули фреймворка.
177 *
178 * Модули фреймворка позволяют расширять его функциональность.
179 *
180 * @var array {
181 * Array with information about the loadable module
182 * {type} string $module [0] Relative path to the module directory
183 * {type} string $module [1] Module name with prefix 000
184 * {type} string $module [2] Scope:
185 * admin - Module will be loaded only in the admin panel,
186 * public - Module will be loaded only on the frontend
187 * all - Module will be loaded everywhere
188 * }
189 */
190 protected $load_factory_modules = [
191 ['libs/factory/bootstrap', 'factory_bootstrap_482', 'admin'],
192 ['libs/factory/forms', 'factory_forms_480', 'admin'],
193 ['libs/factory/pages', 'factory_pages_480', 'admin'],
194 ];
195
196 /**
197 * Не обязательное свойство. Список подключаемы�
198 компонентов плагина.
199 *
200 * Компоненты плагина, это независимые плагины, которые расширяют возможности текущего плагина.
201 * Вы должны указать файл для автозагрузки компонента и префикс плагина, чтобы фреймворк
202 * мог обращаться к классам и константам компонентов.
203 *
204 *
205 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
206 * @since 4.2.0 Добавлен
207 * @var array Пример данны�
208
209 * array(
210 * 'component_ID' => array(
211 * 'autoload' => 'relative_path/autoload_filename.php',
212 * 'plugin_prefix' => 'WPRFX_'
213 * ),
214 * // Реальный пример
215 * 'cyrlitera' => array(
216 * 'autoload' => 'components/cyrlitera/clearfy.php',
217 * 'plugin_prefix' => 'WCTR_'
218 * ),
219 * )
220 */
221 protected $load_plugin_components = [];
222
223
224 /**
225 * Экземпляр класса \WBCR\Factory_480\Entities\Support используется для получения информации
226 * о сайте плагина. Чаще всего используется для получения ссылки на страницу с тарифами или
227 * ссылки на форму обратной связи. Встроен ме�
228 анизм отслеживания по utm меткам.
229 *
230 * @var \WBCR\Factory_480\Entities\Support
231 */
232 protected $support;
233
234 /**
235 * Экземпляр класса \WBCR\Factory_480\Entities\Paths используется для получения информации о
236 * путя�
237 плагина. Часто используется для получения путей или ссылок на место �
238 ранения плагина
239 * или его в�
240 одного файла.
241 *
242 * @var \WBCR\Factory_480\Entities\Paths
243 */
244 protected $paths;
245
246 /**
247 * Абсолютный путь к в�
248 одному файлу плагина: C://server/site.dev/wp-content/plugins/plugin_name/plugin_name.php
249 *
250 * @var string
251 */
252 private $plugin_file;
253
254 /**
255 * Свойство �
256 ранит сырые настройки плагина, а также дополнительные настройки, которые не описаны
257 * в интерфейсе класса.
258 *
259 * @var array
260 */
261 private $plugin_data;
262
263 /**
264 * Конструктор:
265 * - Заполняет свойства класса из сыры�
266 данны�
267 плагина
268 * - Выполняет проверку на обязательные настройки
269 * - Инициализирует сущности support и paths
270 *
271 * @param string $plugin_file
272 * @param array $data
273 *
274 * @throws Exception
275 * @since 4.0.8 - добавлена дополнительная логика
276 *
277 * @since 4.1.1 - добавил две сущности support, paths. Удалил свойства, plugin_build
278 * plugin_assembly, main_file, plugin_root, relative_path, plugin_url
279 */
280 public function __construct($plugin_file, $data)
281 {
282 $this->plugin_file = $plugin_file;
283 $this->plugin_data = $data;
284
285 foreach((array)$data as $option_name => $option_value) {
286 if( property_exists($this, $option_name) ) {
287 $this->$option_name = $option_value;
288 }
289 }
290
291 if( empty($this->prefix) || empty($this->plugin_name) || empty($this->plugin_title) || empty($this->plugin_version) || empty($this->plugin_text_domain) ) {
292 throw new Exception('One of the required attributes has not been passed (prefix, plugin_title, plugin_name, plugin_version, plugin_text_domain).');
293 }
294
295 $this->support = new \WBCR\Factory_480\Entities\Support($this->support_details);
296 $this->paths = new \WBCR\Factory_480\Entities\Paths($plugin_file);
297
298 // used only in the module 'updates'
299 $this->plugin_slug = !empty($this->plugin_name) ? $this->plugin_name : basename($plugin_file);
300 }
301
302 /**
303 * При обновлении фреймворка, некоторые свойства класса были удалены. Однако плагины на старом
304 * фреймворке по прежнему используют удаленные свойства. С помощью этого магического метода мы
305 * добавляем совместимость со старыми плагинами, но при этом выводим предупреждение, что нужно
306 * обновить некоторые свойства.
307 *
308 * @param string $name Имя свойства класса.
309 *
310 * @return mixed
311 */
312 public function __get($name)
313 {
314
315 $deprecated_props = [
316 'plugin_build',
317 'plugin_assembly',
318 'main_file',
319 'plugin_root',
320 'relative_path',
321 'plugin_url'
322 ];
323
324 if( in_array($name, $deprecated_props) ) {
325 $deprecated_message = 'In version 4.1.1 of the Factory framework, the class properties ';
326 $deprecated_message .= '(' . implode(',', $deprecated_props) . ')';
327 $deprecated_message .= 'have been removed. To get plugin paths, use the new paths property.' . PHP_EOL;
328
329 $backtrace = debug_backtrace();
330 if( !empty($backtrace) && isset($backtrace[1]) ) {
331 $deprecated_message .= 'BACKTRACE:(';
332 $deprecated_message .= 'File: ' . $backtrace[1]['file'];
333 $deprecated_message .= 'Function: ' . $backtrace[1]['function'];
334 $deprecated_message .= 'Line: ' . $backtrace[1]['line'];
335 $deprecated_message .= ')';
336 }
337
338 _deprecated_argument(__METHOD__, '4.1.1', $deprecated_message);
339
340 switch( $name ) {
341 case 'plugin_build':
342 return null;
343 break;
344 case 'plugin_assembly':
345 return null;
346 break;
347 case 'main_file':
348 return $this->get_paths()->main_file;
349 break;
350 case 'plugin_root':
351 return $this->get_paths()->absolute;
352 break;
353 case 'relative_path':
354 return $this->get_paths()->basename;
355 break;
356 case 'plugin_url':
357 return $this->get_paths()->url;
358 break;
359 }
360 }
361
362 return null;
363 }
364
365 /**
366 * При обновлении фреймворка, некоторые методы класса были удалены. Однако плагины на старом фреймворке
367 * по прежнему используют удаленные методы. С помощью этого магического метода мы добавляем совместимость
368 * со старыми плагинами, но при этом выводим предупреждение, что нужно обновить некоторые методы.
369 *
370 * @param string $name Имя метода класса.
371 * @param array $arguments Массив аргументов метода класса.
372 *
373 * @return stdClass|null
374 * @throws Exception
375 */
376 public function __call($name, $arguments)
377 {
378
379 $deprecated_methods = [
380 'getPluginBuild',
381 'getPluginAssembly',
382 'getPluginPathInfo'
383 ];
384
385 if( in_array($name, $deprecated_methods) ) {
386 $deprecated_message = 'In version 4.1.1 of the Factory framework, methods (' . implode(',', $deprecated_methods) . ') have been removed.';
387
388 $backtrace = debug_backtrace();
389 if( !empty($backtrace) && isset($backtrace[1]) ) {
390 $deprecated_message .= 'BACKTRACE:(';
391 $deprecated_message .= 'File: ' . $backtrace[1]['file'];
392 $deprecated_message .= 'Function: ' . $backtrace[1]['function'];
393 $deprecated_message .= 'Line: ' . $backtrace[1]['line'];
394 $deprecated_message .= ')';
395 }
396
397 _deprecated_argument(__METHOD__, '4.1.1', $deprecated_message);
398
399 if( 'getPluginPathInfo' == $name ) {
400 $object = new stdClass;
401
402 $object->main_file = $this->get_paths()->main_file;
403 $object->plugin_root = $this->get_paths()->absolute;
404 $object->relative_path = $this->get_paths()->basename;
405 $object->plugin_url = $this->get_paths()->url;
406
407 return $object;
408 }
409 }
410
411 throw new Exception("Method {$name} does not exist");
412 }
413
414 /**
415 * Проверяет, включен ли премиум для этого плагина или нет.
416 *
417 * @return bool Возвращает true, если премиум пакет включен для этого плагина.
418 * См. Wbcr_Factory480_Base::has_premium
419 */
420 public function has_premium()
421 {
422 return $this->has_premium;
423 }
424
425 /**
426 * Позволяет получить заголовок плагина.
427 *
428 * @return string Возвращает заголовок плагина. См. Wbcr_Factory480_Base::plugin_title
429 */
430 public function getPluginTitle()
431 {
432 return apply_filters('wbcr/factory/plugin_title', $this->plugin_title, $this->getPluginName());
433 }
434
435 /**
436 * Позволяет получить префикс плагина.
437 *
438 * @return string Возвращает префикс плагина.См. Wbcr_Factory480_Base::prefix
439 */
440 public function getPrefix()
441 {
442 return $this->prefix;
443 }
444
445 /**
446 * Позволяет получить имя плагина.
447 *
448 * @return string Возвращает имя плагина. См. Wbcr_Factory480_Base::plugin_name
449 */
450 public function getPluginName()
451 {
452 return $this->plugin_name;
453 }
454
455 /**
456 * Позволяет получить версию плагина.
457 *
458 * @return string Возвращает версию плагина. См. Wbcr_Factory480_Base::plugin_version
459 */
460 public function getPluginVersion()
461 {
462 return $this->plugin_version;
463 }
464
465 /**
466 * Позволяет получить список подключаемы�
467 к плагином компонентов
468 *
469 * @return array
470 * @since 4.2.0
471 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
472 */
473 public function get_load_plugin_components()
474 {
475 return $this->load_plugin_components;
476 }
477
478 /**
479 * Предоставляет доступ к сырым данным плагина. Может быть полезен, если вы �
480 отите получить
481 * какие-то данные не описанные в интерфейсе этого плагина.
482 *
483 * @param string $attr_name Имя атрибута, который нужно получить. Идентично ключу в массиве
484 * Wbcr_Factory480_Base::plugin_data
485 *
486 * @return null
487 */
488 public function getPluginInfoAttr($attr_name)
489 {
490 if( isset($this->plugin_data[$attr_name]) ) {
491 return $this->plugin_data[$attr_name];
492 }
493
494 return null;
495 }
496
497 /**
498 * Предоставляет доступ к экземпляру класса \WBCR\Factory_480\Entities\Support.
499 *
500 * @return \WBCR\Factory_480\Entities\Support
501 */
502 public function get_support()
503 {
504 return $this->support;
505 }
506
507 /**
508 * Предоставляет доступ к экземпляру класса \WBCR\Factory_480\Entities\Paths.
509 *
510 * @return \WBCR\Factory_480\Entities\Paths
511 */
512 public function get_paths()
513 {
514 return $this->paths;
515 }
516
517 /**
518 * Позволяет получить сырые данные плагина в виде объекта StdClass.
519 *
520 * @return object Возвращает объект с сырыми данными плагина. См. Wbcr_Factory480_Base::plugin_data
521 */
522 public function getPluginInfo()
523 {
524 return (object)$this->plugin_data;
525 }
526
527 /**
528 * Проверяет права пользователя
529 *
530 * @return bool
531 * @since 4.2.0 Добавлен
532 * @author Alexander Kovalev <alex.kovalevv@gmail.com>
533 */
534 public function current_user_can($capability = 'manage_options')
535 {
536 // Просмотр страниц: read_pages
537 // Просмотр уведомлений: read_notices
538 // Редактирование: edit_forms
539
540 if( 'manage_options' == $capability && is_multisite() && $this->isNetworkActive() ) {
541 $capability = 'manage_network';
542 }
543
544 return current_user_can($capability);
545 }
546
547 /**
548 * Проверят, на�
549 одится ли пользователь в панели усправления сетью сайтов
550 *
551 * @return bool
552 * @since 4.0.8 Добавлен
553 *
554 */
555 public function isNetworkAdmin()
556 {
557 return is_multisite() && is_network_admin();
558 }
559
560 /**
561 * Проверяет активирован ли плагин для сети. Если проект работает в режиме мультисайтов..
562 *
563 * @return bool Если true, плагин активирован для сети или в текущий момент активируется для сети.
564 * @since 4.0.8 Добавлен
565 */
566 public function isNetworkActive()
567 {
568 // Makes sure the plugin is defined before trying to use it
569 if( !function_exists('is_plugin_active_for_network') ) {
570 require_once(ABSPATH . '/wp-admin/includes/plugin.php');
571 }
572
573 $activate = is_plugin_active_for_network($this->get_paths()->basename);
574
575 if( !$activate && $this->isNetworkAdmin() && isset($_GET['action']) && $_GET['action'] == 'activate' ) {
576 return isset($_GET['networkwide']) && 1 == (int)$_GET['networkwide'];
577 }
578
579 return $activate;
580 }
581
582 /**
583 * Позволяет получить все активные сайты сети. Если проект работает в режиме мультисайтов.
584 *
585 * @return array|int
586 * @since 4.0.8
587 */
588 public function getActiveSites($args = ['archived' => 0, 'mature' => 0, 'spam' => 0, 'deleted' => 0])
589 {
590 global $wp_version;
591
592 if( version_compare($wp_version, '4.6', '>=') ) {
593 return get_sites($args);
594 } else {
595 $converted_array = [];
596
597 $sites = wp_get_sites($args);
598
599 if( empty($sites) ) {
600 return $converted_array;
601 }
602
603 foreach((array)$sites as $key => $site) {
604 $obj = new stdClass();
605 foreach($site as $attr => $value) {
606 $obj->$attr = $value;
607 }
608 $converted_array[$key] = $obj;
609 }
610
611 return $converted_array;
612 }
613 }
614 }
615