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