PluginProbe
Disable Comments & Delete All Comments / 1.3.0
Disable Comments & Delete All Comments v1.3.0
1.3.3 1.3.2 trunk 1.0.0 1.0.4 1.0.5 1.0.8 1.0.9 1.1.1 1.1.3 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.3.0 1.3.1
comments-plus / libs / factory / core / includes / class-factory-plugin-base.php

class-factory-plugin-base.php in Disable Comments & Delete All Comments 1.3.0, at libs/factory/core/includes/class-factory-plugin-base.php

615 lines 23.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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_000\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