PluginProbe ʕ •ᴥ•ʔ
FAPI Member / 2.1.18
FAPI Member v2.1.18
2.2.34 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 / Service / RedirectService.php
fapi-member / src / Service Last commit date
ApiService.php 1 year ago ElementService.php 1 year ago EmailService.php 1 year ago FormService.php 1 year ago LevelOrderService.php 1 year ago LevelService.php 1 year ago MembershipService.php 1 year ago RedirectService.php 1 year ago SanitizationService.php 1 year ago UserService.php 1 year ago
RedirectService.php
226 lines
1 <?php declare(strict_types=1);
2
3 namespace FapiMember\Service;
4
5 use FapiMember\Container\Container;
6 use FapiMember\Model\Enums\Keys\OptionKey;
7 use FapiMember\Model\Enums\Types\LevelUnlockType;
8 use FapiMember\Model\Enums\UserPermission;
9 use FapiMember\Repository\LevelRepository;
10 use FapiMember\Repository\PageRepository;
11 use FapiMember\Repository\UserRepository;
12 use FapiMember\Utils\PostTypeHelper;
13 use JetBrains\PhpStorm\NoReturn;
14 use WP_Post;
15
16 class RedirectService
17 {
18 private LevelRepository $levelRepository;
19 private MembershipService $membershipService;
20 private PageRepository $pageRepository;
21 private UserRepository $userRepository;
22
23 public function __construct()
24 {
25 $this->levelRepository = Container::get(LevelRepository::class);
26 $this->membershipService = Container::get(MembershipService::class);
27 $this->pageRepository = Container::get(PageRepository::class);
28 $this->userRepository = Container::get(UserRepository::class);
29 }
30
31 public function checkPageForRedirects(): bool
32 {
33 global $wp_query;
34
35 if (!isset($wp_query->post) ||
36 !($wp_query->post instanceof WP_Post) ||
37 !in_array( $wp_query->post->post_type, PostTypeHelper::getSupportedPostTypes(), true)
38 ) {
39 return true;
40 }
41
42 if (current_user_can(UserPermission::REQUIRED_CAPABILITY)) {
43 return true;
44 }
45
46 $pageId = $wp_query->post->ID;
47
48 if ($pageId === (int) get_option('page_on_front')) {
49 return true;
50 }
51
52 $levels = $this->levelRepository->getAllAsLevels();
53 $levelsForThisPage = [];
54 $post_type = $wp_query->post->post_type;
55 $all_stored_post_types = get_option(OptionKey::POST_TYPES, array());
56
57 foreach ($all_stored_post_types as $levelId => $post_types) {
58 if (is_string( $post_types)) {
59 $post_types = array($post_types);
60 }
61
62 $level = $this->levelRepository->getLevelById($levelId);
63
64 if (in_array( $post_type, $post_types, true) && $level !== null) {
65 $levelsForThisPage[] = $level;
66 }
67 }
68
69 foreach ($levels as $level) {
70 if ($level->getPageIds() === []) {
71 continue;
72 }
73
74 foreach ($level->getPageIds() as $levelPageId) {
75 if ($pageId === $levelPageId) {
76 $levelsForThisPage[] = $level;
77 }
78 }
79 }
80
81 if (count($levelsForThisPage) === 0) {
82 return true;
83 }
84
85 $firstLevel = $levelsForThisPage[0];
86
87 if (!is_user_logged_in()) {
88 $this->redirectToNoAccessPage($firstLevel->getId());
89 }
90
91 $memberships = $this->membershipService->getActiveByUserIdAndUpdate(get_current_user_id());
92
93 foreach ($memberships as $membership) {
94 foreach ($levelsForThisPage as $levelForThisPage) {
95 if ($membership->getLevelId() == $levelForThisPage->getId()) {
96 return true;
97 }
98 }
99 }
100
101 if ($firstLevel->getUnlockType() !== null && $firstLevel->getUnlockType() !== LevelUnlockType::NONE) {
102 $this->redirectToTimedUnlockNoAccessPage();
103 }
104
105 $this->redirectToNoAccessPage($firstLevel->getId());
106
107 return false;
108 }
109
110 public function redirectToNoAccessPage($levelId): void
111 {
112 $level = $this->levelRepository->getLevelById($levelId);
113
114 if ($level?->getNoAccessPageId() !== null) {
115 $this->redirectToPage($level->getNoAccessPageId());
116 }
117
118 $this->redirectToHomePage();
119 }
120
121 public function redirectToTimedUnlockNoAccessPage(): void
122 {
123 $this->redirectToPage($this->pageRepository->getTimedUnlockNoAccessPageId());
124 }
125
126 public function loginRedirect(int|null $userId)
127 {
128 if ($userId === null) {
129 return get_site_url();
130 }
131
132 if (user_can($userId, UserPermission::REQUIRED_CAPABILITY)) {
133 return admin_url();
134 }
135
136 $memberships = $this->membershipService->getActiveByUserIdAndUpdate($userId);
137
138 $pages = array_map(
139 function ($membership) {
140 $level = $this->levelRepository->getLevelById($membership->getLevelId());
141 return $level->getAfterLoginPageId();
142 },
143 $memberships,
144 );
145
146 $pages = array_unique(array_filter($pages));
147
148 if (count($pages) === 1) {
149 $pageId = array_shift($pages);
150 $pageUrl = $this->pageRepository->getPageUrlById($pageId);
151
152 if ($pageUrl !== null) {
153 return $pageUrl;
154 }
155 }
156
157 $dashboardPageId = $this->pageRepository->getCommonDashboardPageId();
158 $defaultDashboardUrl = $this->pageRepository->getPageUrlById($dashboardPageId);
159
160 if ($defaultDashboardUrl !== null) {
161 return $defaultDashboardUrl;
162 }
163
164 if (count($pages) > 1) {
165 define( 'FAPI_SHOWING_LEVEL_SELECTION', 1 );
166 include __DIR__ . '/../Templates/levelSelection.php';
167
168 exit;
169 }
170
171 return get_site_url();
172 }
173
174 /** @description Because of WPS hide login plugin */
175 public function loggedInRedirect(): string
176 {
177 return $this->loginRedirect($this->userRepository->getCurrentUser()->getId());
178 }
179
180 #[NoReturn]
181 public function redirectToPage(int $pageId): void
182 {
183 wp_redirect(get_permalink($pageId));
184
185 exit;
186 }
187
188 #[NoReturn]
189 public function redirectToHomePage(): void
190 {
191 wp_redirect(home_url());
192
193 exit;
194 }
195
196 #[NoReturn]
197 public function redirect(string $subpage, string|null $alert = null, $params = array()): void
198 {
199 $tail = '';
200
201 foreach ($params as $key => $value ) {
202 $tail .= sprintf( '&%s=%s', $key, urlencode((string) $value));
203 }
204
205 if ($alert !== null) {
206 $alert = '&e=' . $alert;
207 } else {
208 $alert = '';
209 }
210
211 wp_redirect(
212 admin_url(
213 sprintf(
214 '/admin.php?page=fapi-member-options&subpage=%s%s%s',
215 $subpage,
216 $alert,
217 $tail
218 )
219 )
220 );
221
222 exit;
223 }
224
225 }
226