PluginProbe ʕ •ᴥ•ʔ
FAPI Member / 2.2.32
FAPI Member v2.2.32
2.2.33 2.2.32 trunk 1.9.47 2.1.18 2.2.24 2.2.25 2.2.26 2.2.28 2.2.29 2.2.30 2.2.31
fapi-member / src / Bootstrap.php
fapi-member / src Last commit date
Api 2 weeks ago Container 2 weeks ago Divi 2 weeks ago Elementor 2 weeks ago Mioweb 2 weeks ago Model 2 weeks ago Repository 2 weeks ago Service 2 weeks ago Templates 2 weeks ago Utils 2 weeks ago Bootstrap.php 2 weeks ago FapiMemberPlugin.php 2 weeks ago
Bootstrap.php
616 lines
1 <?php declare(strict_types = 1);
2
3 namespace FapiMember;
4
5 use FapiMember\Api\V1\RequestHandler;
6 use FapiMember\Api\V2\ApiController;
7 use FapiMember\Container\Container;
8 use FapiMember\Divi\FapiMemberDivi;
9 use FapiMember\Mioweb\FapiMemberMioweb;
10 use FapiMember\Model\Enums\Keys\OptionKey;
11 use FapiMember\Model\Enums\Types\MembershipChangeType;
12 use FapiMember\Model\Enums\Types\RequestMethodType;
13 use FapiMember\Model\Enums\UserPermission;
14 use FapiMember\Repository\MemberActivityRepository;
15 use FapiMember\Repository\MembershipChangeRepository;
16 use FapiMember\Repository\MembershipRepository;
17 use FapiMember\Service\ApiService;
18 use FapiMember\Service\ElementService;
19 use FapiMember\Service\RedirectService;
20 use FapiMember\Service\StatisticsService;
21 use FapiMember\Utils\DisplayHelper;
22 use FapiMember\Utils\PostTypeHelper;
23 use FapiMember\Utils\Random;
24 use FapiMember\Utils\ShortcodeSubstitutor;
25
26 final class Bootstrap
27 {
28
29 private FapiMemberPlugin $fapiMemberPlugin;
30
31 private FapiMemberDivi $fapiMemberDivi;
32
33 private FapiMemberMioweb $fapiMemberMioweb;
34
35 private ApiService $apiService;
36
37 private ElementService $elementService;
38
39 private RedirectService $redirectService;
40
41 private RequestHandler $requestHandler;
42
43 private ShortcodeSubstitutor $shortcodeSubstitutor;
44
45 private ApiController $apiController;
46
47 private MembershipRepository $membershipRepository;
48
49 private MembershipChangeRepository $membershipChangeRepository;
50
51 private MemberActivityRepository $memberActivityRepository;
52
53 private StatisticsService $statisticsService;
54
55 public function __construct(FapiMemberPlugin $fapiMemberPlugin)
56 {
57 $this->fapiMemberPlugin = $fapiMemberPlugin;
58 Container::set(FapiMemberPlugin::class, $fapiMemberPlugin);
59
60 $this->apiService = Container::get(ApiService::class);
61 $this->elementService = Container::get(ElementService::class);
62 $this->redirectService = Container::get(RedirectService::class);
63 $this->requestHandler = Container::get(RequestHandler::class);
64 $this->shortcodeSubstitutor = Container::get(ShortcodeSubstitutor::class);
65 $this->apiController = Container::get(ApiController::class);
66 $this->fapiMemberDivi = Container::get(FapiMemberDivi::class);
67 $this->fapiMemberMioweb = Container::get(FapiMemberMioweb::class);
68 $this->membershipRepository = Container::get(MembershipRepository::class);
69 $this->membershipChangeRepository = Container::get(MembershipChangeRepository::class);
70 $this->memberActivityRepository = Container::get(MemberActivityRepository::class);
71 $this->statisticsService = Container::get(StatisticsService::class);
72 }
73
74 public function initialize(): void
75 {
76 $this->addHooks();
77 $this->generateTokenIfNeeded();
78 $this->migrateCredentialsIfNeeded();
79
80 update_option(OptionKey::FAPI_MEMBER_VERSION, FAPI_MEMBER_PLUGIN_VERSION);
81 }
82
83 private function generateTokenIfNeeded(): void
84 {
85 $token = get_option(OptionKey::TOKEN, '');
86
87 if (!$token) {
88 update_option(OptionKey::TOKEN, Random::generate(20, 'A-Za-z'));
89 }
90 }
91
92 public function migrateCredentialsIfNeeded(): void
93 {
94 $oldVersion = get_option(OptionKey::FAPI_MEMBER_VERSION, '');
95
96 if (!empty($oldVersion)) {
97 return;
98 }
99
100 $fapiCredentials = get_option(OptionKey::API_CREDENTIALS, null);
101
102 if ((!empty($fapiCredentials))) {
103 return;
104 }
105
106 $apiUser = get_option(OptionKey::API_USER, null);
107 $apiKey = get_option(OptionKey::API_KEY, null);
108
109 if (empty($apiKey) || empty($apiUser)) {
110 return;
111 }
112
113 update_option(
114 OptionKey::API_CREDENTIALS,
115 json_encode(
116 [
117 [
118 'username' => $apiUser,
119 'token' => $apiKey,
120 ],
121 ]
122 )
123 );
124
125 $credentialsOk = $this->apiService->checkCredentials();
126 update_option(OptionKey::API_CHECKED, $credentialsOk);
127
128 if (!$credentialsOk) {
129 update_option(OptionKey::API_CREDENTIALS, '0');
130 }
131 }
132
133 private function addHooks(): void
134 {
135 $this->addInitHooks();
136 $this->addAdminHooks();
137 $this->registerUserFapiMemberTableColumn();
138
139 add_action('plugins_loaded', function () {
140 load_plugin_textdomain('fapi-member', false, 'fapi-member/languages');
141 }, 1);
142
143 add_action('init', function () {
144 if (!is_textdomain_loaded('fapi-member')) {
145 load_plugin_textdomain('fapi-member', false, 'fapi-member/languages');
146 }
147 }, 1);
148
149 add_action('wp_enqueue_scripts', [$this, 'addPublicScripts']);
150
151 add_action('rest_api_init', [$this, 'addRestEndpoints']);
152
153 // adds meta boxed to setting page/post side bar
154 add_action('add_meta_boxes', [$this->elementService, 'addMetaBoxes']);
155 add_action('save_post', [$this->elementService, 'savePostMetadata']);
156
157 // check if page in fapi level
158 add_action('template_redirect', [$this->redirectService, 'checkPageForRedirects']);
159
160 // user profile
161 add_action('edit_user_profile', [$this->elementService, 'addUserMenuPage']);
162 add_action('plugins_loaded', [$this, 'initializeStatisticsIfNeeded']);
163
164 add_action('wp_enqueue_scripts', [$this, 'addPublicScripts']);
165
166 $this->addMiowebHooks();
167 $this->addDiviHooks();
168
169 add_image_size('level-selection', 300, 164, true);
170 add_filter('login_redirect', [$this->fapiMemberPlugin, 'loginRedirect'], 5, 3);
171 add_filter('show_admin_bar', [$this->elementService, 'hideAdminBar']);
172
173 // filters block to render by section and levels provided
174 add_filter(
175 'render_block',
176 function ($blockContent, $block) {
177 if (!isset($block['attrs']['hasSectionOrLevel'])) {
178 return $blockContent;
179 }
180
181 if (!isset($block['attrs']['fapiSectionAndLevels'])) {
182 return $blockContent;
183 }
184
185 if (DisplayHelper::shouldContentBeRendered(
186 (string) $block['attrs']['hasSectionOrLevel'],
187 $block['attrs']['fapiSectionAndLevels']
188 )) {
189 return $blockContent;
190 }
191
192 return '';
193 },
194 15,
195 2
196 );
197
198 // WPS hide login plugin
199 add_filter('whl_logged_in_redirect', [$this->redirectService, 'loggedInRedirect'], 1);
200 add_filter('whl_logged_in_redirect', [$this->redirectService, 'loggedInRedirect'], 1);
201 }
202
203 private function addInitHooks(): void
204 {
205 add_action('init', [$this, 'registerLevelsTaxonomy']);
206 add_action('init', [$this, 'registerRoles']);
207 add_action('init', [$this, 'addShortcodes']);
208 add_action('init', [$this->fapiMemberPlugin, 'checkTimedLevelUnlock']);
209 add_action('init', [$this->statisticsService, 'handleUserActive']);
210 }
211
212 private function addAdminHooks(): void
213 {
214 add_action('admin_init', [$this, 'registerSettings']);
215 add_action('admin_menu', [$this->elementService, 'addAdminMenu']);
216 add_action('admin_enqueue_scripts', [$this, 'addScripts']);
217 add_action('admin_enqueue_scripts', [$this, 'addApiNonce']);
218 add_action('admin_enqueue_scripts', [$this, 'checkFapiMemberPlusStatus']);
219 add_action('admin_enqueue_scripts', [$this, 'checkSimpleShopStatus']);
220
221 }
222
223 private function addMiowebHooks(): void
224 {
225 add_action('wp_ajax_open_element_setting', [$this->fapiMemberMioweb, 'addSetting']);
226 add_action('wp_ajax_open_row_setting', [$this->fapiMemberMioweb, 'addSetting']);
227 add_action('mw_page_init', [$this->fapiMemberMioweb, 'hideContentIfNeeded']);
228 }
229
230 public function addDiviHooks(): void
231 {
232 add_action('divi_extensions_init', [$this, 'initializeDiviExtension']);
233
234 add_filter('et_builder_get_parent_modules', [$this->fapiMemberDivi, 'addToggle']);
235
236 foreach ($this->fapiMemberDivi->allowedModuleSlugs as $slug) {
237 add_filter("et_pb_all_fields_unprocessed_" . $slug, [$this->fapiMemberDivi, 'addFields']);
238 }
239
240 add_filter('et_pb_module_content', [$this->fapiMemberDivi, 'hideElements'], 10, 4);
241 }
242
243 public function initializeDiviExtension(): void
244 {
245 require_once plugin_dir_path(__FILE__) . 'Divi/includes/FmDivi.php';
246 }
247
248 function addApiNonce(): void
249 {
250 if (current_user_can(UserPermission::REQUIRED_CAPABILITY)) {
251 $nonce = wp_create_nonce('wp_rest');
252 echo "<script>window.apiInternalAccessNonce = '{$nonce}'</script>";
253 }
254
255 }
256
257 function checkFapiMemberPlusStatus(): void
258 {
259 if (current_user_can(UserPermission::REQUIRED_CAPABILITY)) {
260 $licenceActive = $this->apiService->checkLicence();
261
262 echo "<script>
263 window.licenceActive = '{$licenceActive}'
264 </script>";
265 }
266 }
267
268 function checkSimpleShopStatus(): void
269 {
270 if (current_user_can(UserPermission::REQUIRED_CAPABILITY)) {
271 $simpleShopActive = is_plugin_active('simpleshop-cz/simpleshop-cz.php') && class_exists('Redbit\SimpleShop\WpPlugin\Group');
272
273 $ssSections = [];
274
275 if (!$simpleShopActive) {
276 echo "<script>
277 window.simpleShopToFAPIMember = false
278 </script>";
279
280 return;
281 }
282
283 $groups = new \Redbit\SimpleShop\WpPlugin\Group();
284
285 foreach ($groups->get_groups() as $groupId => $group) {
286 $group = new \Redbit\SimpleShop\WpPlugin\Group($groupId);
287
288 $ssSections[] = [
289 'id' => $group->id,
290 'name' => $group->name,
291 'users' => array_values(array_map(function ($user) use ($groupId) {
292 $membership = new \Redbit\SimpleShop\WpPlugin\Membership($user->ID);
293
294 return [
295 'id' => $user->ID,
296 'email' => $user->user_email,
297 'registered' => $membership->groups[$groupId]['subscription_date'] ?? null,
298 'until' => $membership->groups[$groupId]['valid_to'] ?? null,
299 ];
300 }, $group->get_users())),
301 ];
302 }
303
304 $pagesGroups = [];
305
306 $pages = get_posts([
307 'post_type' => 'page',
308 'numberposts' => -1,
309 ]);
310
311 $ss = \Redbit\SimpleShop\WpPlugin\SimpleShop::getInstance();
312
313 foreach ($pages as $page) {
314 $pagesGroups[] = [
315 'id' => $page->ID,
316 'name' => $page->post_title,
317 'groups' => $ss->get_access()->get_post_groups($page->ID),
318 ];
319 }
320
321 echo "<script>
322 window.simpleShopToFAPIMember = true
323 window.ssSections = " . json_encode($ssSections) . "
324 window.ssPagesGroups = " . json_encode($pagesGroups) . "
325 </script>";
326 }
327 }
328
329 public function addRestEndpoints(): void
330 {
331 $this->addRestEndpointV1('sections', 'handleApiSections', RequestMethodType::GET);
332 $this->addRestEndpointV1('sections-simple', 'handleApiSectionsSimple', RequestMethodType::GET);
333 $this->addRestEndpointV1('callback', 'handleApiCallback', RequestMethodType::POST);
334 $this->addRestEndpointV1('check-connection', 'handleApiCheckConnectionCallback', RequestMethodType::POST);
335 $this->addRestEndpointV1(
336 'list-forms/(?P<user>[^/]+(?:\+[^/]+)?)',
337 'handleApiListFormsCallback',
338 RequestMethodType::GET,
339 );
340 $this->addRestEndpointV1('list-users', 'handleApiUsernamesCallback', RequestMethodType::GET);
341
342 $this->addRestEndpointV2('sections');
343 $this->addRestEndpointV2('pages');
344 $this->addRestEndpointV2('emails');
345 $this->addRestEndpointV2('memberships');
346 $this->addRestEndpointV2('users');
347 $this->addRestEndpointV2('apiConnections');
348 $this->addRestEndpointV2('statistics');
349 }
350
351 public function addRestEndpointV2(
352 string $route
353 ): void
354 {
355 register_rest_route(
356 'fapi/v2',
357 '/' . $route,
358 [
359 'methods' => [RequestMethodType::GET, RequestMethodType::POST],
360 'callback' => [$this->apiController, 'handleRequest'],
361 'permission_callback' => function () {
362 return true;
363 },
364 ],
365 );
366 }
367
368 public function addRestEndpointV1(
369 string $route, string $functionName, string $method
370 ): void
371 {
372 register_rest_route(
373 'fapi/v1',
374 '/' . $route,
375 [
376 'methods' => $method,
377 'callback' => [$this->requestHandler, $functionName],
378 'permission_callback' => function () {
379 return true;
380 },
381 ],
382 );
383 }
384
385 public function addShortcodes(): void
386 {
387 add_shortcode('fapi-member-login', [$this->shortcodeSubstitutor, 'shortcodeLoginForm']);
388 add_shortcode('fapi-member-user', [$this->shortcodeSubstitutor, 'shortcodeUser']);
389 add_shortcode('fapi-member-user-section-expiration', [$this->shortcodeSubstitutor, 'shortcodeSectionExpirationDate']);
390 add_shortcode('fapi-member-level-unlock-date', [$this->shortcodeSubstitutor, 'shortcodeLevelUnlockDate']);
391 add_shortcode('fapi-member-unlock-level', [$this->shortcodeSubstitutor, 'shortcodeUnlockLevel']);
392 }
393
394 public function addScripts(): void
395 {
396 $this->registerStyles();
397 $this->registerScripts();
398
399 global $pagenow;
400
401 if ($pagenow === 'admin.php' || $pagenow === 'options-general.php') {
402 wp_enqueue_style('fapi-member-admin-font', '', [], FAPI_MEMBER_PLUGIN_VERSION);
403 wp_enqueue_style('fapi-member-swal-css', '', [], FAPI_MEMBER_PLUGIN_VERSION);
404 wp_enqueue_script('fapi-member-swal', '', [], FAPI_MEMBER_PLUGIN_VERSION);
405 wp_enqueue_script('fapi-member-swal-promise-polyfill', '', [], FAPI_MEMBER_PLUGIN_VERSION);
406 wp_enqueue_script('fapi-member-clipboard', '', [], FAPI_MEMBER_PLUGIN_VERSION);
407 wp_enqueue_script('fapi-member-main', '', [], FAPI_MEMBER_PLUGIN_VERSION);
408 }
409 if ($pagenow === 'user-edit.php') {
410 wp_enqueue_style('fapi-member-user-profile', '', [], FAPI_MEMBER_PLUGIN_VERSION);
411 wp_enqueue_script('fapi-member-main', '', [], FAPI_MEMBER_PLUGIN_VERSION);
412 }
413
414 wp_enqueue_script(
415 'fm-react-app',
416 FAPI_MEMBER_PLUGIN_URL . '/app/dist/bundle.js',
417 ['jquery', 'wp-element'],
418 FAPI_MEMBER_PLUGIN_VERSION,
419 true,
420 );
421
422 wp_set_script_translations(
423 'fm-react-app',
424 'fapi-member',
425 FAPI_MEMBER_PLUGIN_PATH . 'languages'
426 );
427
428 wp_localize_script('fm-react-app', 'environmentData', [
429 'timeZoneOffset' => get_option('gmt_offset'),
430 ]);
431 }
432
433 public function registerStyles(): void
434 {
435 wp_register_style(
436 'fapi-member-user-profile',
437 plugins_url('fapi-member/media/fapi-user-profile.css'),
438 [],
439 FAPI_MEMBER_PLUGIN_VERSION
440 );
441 wp_register_style(
442 'fapi-member-admin-font',
443 plugins_url('fapi-member/media/font/stylesheet.css'),
444 [],
445 FAPI_MEMBER_PLUGIN_VERSION
446 );
447 wp_register_style(
448 'fapi-member-swal-css',
449 plugins_url('fapi-member/media/dist/sweetalert2.min.css'),
450 [],
451 FAPI_MEMBER_PLUGIN_VERSION
452 );
453 wp_register_style(
454 'fapi-member-public-style',
455 plugins_url('fapi-member/media/fapi-member-public.css'),
456 [],
457 FAPI_MEMBER_PLUGIN_VERSION
458 );
459 }
460
461 public function registerScripts(): void
462 {
463 wp_register_script(
464 'fapi-member-swal',
465 plugins_url('fapi-member/media/dist/sweetalert2.js'),
466 [],
467 FAPI_MEMBER_PLUGIN_VERSION
468 );
469
470 wp_register_script(
471 'fapi-member-swal-promise-polyfill',
472 plugins_url('fapi-member/media/dist/polyfill.min.js'),
473 [],
474 FAPI_MEMBER_PLUGIN_VERSION
475 );
476
477 wp_register_script(
478 'fapi-member-clipboard',
479 plugins_url('fapi-member/media/dist/clipboard.min.js'),
480 [],
481 FAPI_MEMBER_PLUGIN_VERSION
482 );
483
484 if (FapiMemberPlugin::isDevelopment()) {
485 wp_register_script(
486 'fapi-member-main',
487 plugins_url('fapi-member/media/dist/fapi.dev.js'),
488 [],
489 FAPI_MEMBER_PLUGIN_VERSION
490 );
491 } else {
492 wp_register_script(
493 'fapi-member-main',
494 plugins_url('fapi-member/media/dist/fapi.dist.js'),
495 [],
496 FAPI_MEMBER_PLUGIN_VERSION
497 );
498 }
499 }
500
501 public
502 function addPublicScripts(): void
503 {
504 $this->registerPublicStyles();
505
506 wp_enqueue_style('fapi-member-public-style', '',
507 [],
508 FAPI_MEMBER_PLUGIN_VERSION);
509
510 if (defined('FAPI_SHOWING_LEVEL_SELECTION')) {
511 wp_register_style(
512 'fapi-member-public-levelselection-font',
513 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap',
514 [],
515 FAPI_MEMBER_PLUGIN_VERSION
516 );
517 wp_enqueue_style('fapi-member-public-levelselection-font', '',
518 [],
519 FAPI_MEMBER_PLUGIN_VERSION);
520 }
521 }
522
523 public function registerPublicStyles(): void
524 {
525 wp_register_style(
526 'fapi-member-public-style',
527 plugins_url('fapi-member/media/fapi-member-public.css'),
528 [],
529 FAPI_MEMBER_PLUGIN_VERSION
530 );
531 }
532
533 public function registerRoles(): void
534 {
535 if (get_role('member') === null) {
536 add_role('member', __('Člen', 'fapi-member'), get_role('subscriber')->capabilities);
537 }
538 }
539
540 public function registerSettings(): void
541 {
542 register_setting(
543 'options',
544 'fapiMemberApiEmail',
545 [
546 'type' => 'string',
547 'description' => __('FAPI Member - API e-mail', 'fapi-member'),
548 'show_in_rest' => false,
549 'default' => null,
550 ]
551 );
552 register_setting(
553 'options',
554 'fapiMemberApiKey',
555 [
556 'type' => 'string',
557 'description' => __('FAPI Member - API key', 'fapi-member'),
558 'show_in_rest' => false,
559 'default' => null,
560 ]
561 );
562 }
563
564 public function registerLevelsTaxonomy(): void
565 {
566 register_taxonomy(
567 'fapi_levels',
568 PostTypeHelper::getSupportedPostTypes(),
569 [
570 'public' => false,
571 'hierarchical' => true,
572 'show_ui' => false,
573 'show_in_rest' => false,
574 ]
575 );
576 }
577
578 public function initializeStatisticsIfNeeded(): void
579 {
580 if (!$this->membershipChangeRepository->tableExists()) {
581 $this->initializeMembershipChanges();
582 }
583
584 if (!$this->memberActivityRepository->tableExists()) {
585 $this->memberActivityRepository->createTableIfNeeded();
586 }
587 }
588
589 private function initializeMembershipChanges(): void
590 {
591 $this->membershipChangeRepository->createTableIfNeeded();
592
593 $memberships = $this->membershipRepository->getAll();
594
595 foreach ($memberships as $membershipsByUserId) {
596 foreach ($membershipsByUserId as $membership) {
597 $this->membershipChangeRepository->addChange(
598 $membership->toMembershipChange(
599 MembershipChangeType::CREATED,
600 $membership->getRegistered(),
601 )
602 );
603 }
604 }
605 }
606
607 public function registerUserFapiMemberTableColumn(): void
608 {
609 add_filter('manage_users_columns', [$this->elementService, 'addUserColumn']);
610 add_action('manage_users_custom_column', [$this->elementService, 'showUserColumnContent'], 10, 3);
611 add_action('show_user_profile', [$this->elementService, 'addUserProfileSection']);
612 add_action('edit_user_profile', [$this->elementService, 'addUserProfileSection']);
613 }
614
615 }
616