PluginProbe
Extendify / 2.2.2
Extendify v2.2.2
3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 0.7.0 All 126 releases
extendify / app / AdminPageRouter.php

AdminPageRouter.php in Extendify 2.2.2, at app/AdminPageRouter.php

238 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Simple router to handle admin page loading
5 */
6
7 namespace Extendify;
8
9 defined('ABSPATH') || die('No direct access.');
10
11 use Extendify\Assist\AdminPage as AssistAdminPage;
12 use Extendify\Launch\AdminPage as LaunchAdminPage;
13
14 /**
15 * This class handles routing when the main admin button is pressed.
16 * This used to be more robust but now just routes to Assist. And
17 * possibly loads Launch depending on the state.
18 */
19
20 class AdminPageRouter
21 {
22 /**
23 * Adds various actions to set up the page
24 *
25 * @return void
26 */
27 public function __construct()
28 {
29 // This does the initial redirect to Launch.
30 \add_action('admin_init', [$this, 'redirectOnce'], 10);
31 \add_action('admin_init', [$this, 'maybeForceFlush'], 5);
32
33 // Add a dropdown above Dashboard in the admin toolbar.
34 \add_action('admin_bar_menu', function ($wpAdminBar) {
35 if (!PartnerData::$id || is_admin()) {
36 return;
37 }
38
39 $wpAdminBar->add_node([
40 'id' => 'extendify-site-assistant',
41 'title' => \__('Site Assistant', 'extendify-local'),
42 'href' => \admin_url() . $this->getRoute(),
43 'parent' => 'site-name',
44 'meta' => ['position' => 1],
45 ]);
46 }, 11);
47
48 // When Launch is finished, fire this to set the correct permalinks.
49 // phpcs:ignore WordPress.Security.NonceVerification
50 if (isset($_GET['extendify-launch-success'])) {
51 \add_action('admin_init', function () {
52 \flush_rewrite_rules();
53 });
54 }
55
56 \add_action('admin_menu', function () {
57 // If no partner, we don't show any menu.
58 if (!PartnerData::$id) {
59 return;
60 }
61
62 $assist = new AssistAdminPage();
63 // Adds the top Assist menu.
64 $this->addAdminMenu(
65 __('Site Assistant', 'extendify-local'),
66 $assist->slug,
67 [$assist, 'pageContent']
68 );
69
70 if (!Config::$showLaunch) {
71 return;
72 }
73
74 $launch = new LaunchAdminPage();
75 $this->addSubMenu(
76 // translators: Launch is a noun.
77 __('Launch', 'extendify-local'),
78 $launch->slug,
79 [$launch, 'pageContent']
80 );
81 });
82
83 // If the user is redirected to this while visiting our url, intercept it.
84 \add_filter('wp_redirect', function ($url) {
85 if (!PartnerData::$id) {
86 return $url;
87 }
88
89 // Check for extendify-launch-success as other plugins will not override
90 // this as they intercept the request.
91 // phpcs:ignore WordPress.Security.NonceVerification
92 if (isset($_GET['extendify-launch-success'])) {
93 return \admin_url() . $this->getRoute();
94 }
95
96 // Special treatment for Yoast to disable their redirect when installing.
97 if ($url === \admin_url() . 'admin.php?page=wpseo_installation_successful_free') {
98 return \admin_url() . $this->getRoute();
99 }
100
101 // Special treatment for Germanized for WooCommerce to disable their redirect when installing.
102 if ($url === \admin_url() . 'admin.php?page=wc-gzd-setup') {
103 return \admin_url() . $this->getRoute();
104 }
105
106 return $url;
107 }, 9999);
108 }
109
110 /**
111 * A helper for handling sub menus
112 *
113 * @param string $name - The menu name.
114 * @param string $slug - The menu slug.
115 * @param callable $callback - The callback to render the page.
116 *
117 * @return void
118 */
119 public function addSubMenu($name, $slug, $callback = '')
120 {
121 \add_submenu_page(
122 // Uses a "dummy" page for adding pages without a menu.
123 (constant('EXTENDIFY_DEVMODE') ? 'extendify-assist' : 'extendify-page'),
124 $name,
125 $name,
126 Config::$requiredCapability,
127 $slug,
128 $callback
129 );
130 }
131
132 /**
133 * Adds Extendify top menu
134 *
135 * @param string $label - The menu label.
136 * @param string $slug - The menu slug.
137 * @param string|callable $callback - The callback to render the page.
138 * @return void
139 */
140 public function addAdminMenu($label, $slug, $callback)
141 {
142 $menuLabel = sprintf(
143 '%1$s <span class="extendify-assist-badge-count" data-test="assist-badge-count"></span>',
144 $label
145 );
146
147 \add_menu_page(
148 'Extendify',
149 $menuLabel,
150 Config::$requiredCapability,
151 $slug,
152 $callback,
153 // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode, Generic.Files.LineLength.TooLong
154 'data:image/svg+xml;base64,' . base64_encode('<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.773,9.373L16.679,10.467L10,3.788L3.321,10.467L2.227,9.373L10,1.6L14.129,5.729L14.129,3.665L16.194,3.665L16.194,7.794L17.773,9.373ZM16.194,11.437L16.194,17.6L3.806,17.6L3.806,11.437L10,5.254L16.194,11.437ZM13.297,11.525C13.394,11.437 13.432,11.301 13.387,11.178L13.388,11.176C13.326,11.008 13.251,10.847 13.165,10.692L13.099,10.578C13.006,10.423 12.901,10.276 12.787,10.138C12.704,10.037 12.566,10.002 12.441,10.042L11.881,10.219C11.74,10.263 11.586,10.235 11.462,10.155C11.393,10.111 11.322,10.07 11.249,10.032C11.116,9.964 11.015,9.845 10.984,9.702L10.858,9.127C10.83,8.999 10.731,8.897 10.601,8.876C10.406,8.843 10.206,8.827 10.001,8.827C9.797,8.827 9.596,8.843 9.402,8.877C9.272,8.899 9.173,9 9.145,9.129L9.019,9.703C8.987,9.847 8.885,9.966 8.754,10.033C8.68,10.07 8.61,10.112 8.541,10.156C8.415,10.236 8.263,10.266 8.121,10.221L7.561,10.043C7.437,10.004 7.299,10.037 7.215,10.139C7.101,10.277 6.997,10.424 6.904,10.579L6.837,10.694C6.751,10.849 6.676,11.01 6.614,11.178C6.569,11.301 6.607,11.437 6.705,11.525L7.141,11.923C7.251,12.022 7.302,12.168 7.294,12.317C7.293,12.358 7.292,12.399 7.292,12.441C7.292,12.483 7.293,12.524 7.294,12.565C7.302,12.712 7.249,12.859 7.141,12.959L6.705,13.355C6.607,13.443 6.569,13.58 6.614,13.703C6.676,13.871 6.751,14.031 6.837,14.187L6.904,14.301C6.997,14.456 7.101,14.603 7.215,14.741C7.299,14.841 7.437,14.877 7.561,14.837L8.12,14.658C8.261,14.613 8.415,14.642 8.539,14.723C8.608,14.767 8.679,14.808 8.752,14.846C8.884,14.913 8.987,15.032 9.018,15.176L9.143,15.75C9.171,15.879 9.27,15.98 9.4,16.002C9.595,16.034 9.795,16.051 10,16.051C10.205,16.051 10.405,16.034 10.6,16.002C10.729,15.98 10.828,15.879 10.857,15.75L10.982,15.176C11.015,15.032 11.116,14.913 11.247,14.846C11.321,14.809 11.391,14.767 11.461,14.723C11.586,14.642 11.739,14.613 11.88,14.658L12.44,14.836C12.564,14.875 12.703,14.841 12.786,14.74C12.9,14.602 13.005,14.455 13.098,14.3L13.164,14.185C13.25,14.03 13.325,13.869 13.387,13.701C13.432,13.578 13.394,13.441 13.297,13.354L12.861,12.957C12.751,12.859 12.7,12.712 12.707,12.564C12.708,12.523 12.71,12.482 12.71,12.439C12.71,12.397 12.708,12.356 12.707,12.315C12.7,12.168 12.752,12.022 12.861,11.922L13.297,11.525ZM10.8,13.238C10.588,13.449 10.301,13.569 10.001,13.569C9.702,13.569 9.415,13.449 9.203,13.238C8.991,13.026 8.872,12.739 8.872,12.439C8.872,12.14 8.991,11.853 9.203,11.641C9.415,11.429 9.702,11.31 10.001,11.31C10.301,11.31 10.588,11.429 10.8,11.641C11.011,11.853 11.13,12.14 11.13,12.439C11.13,12.739 11.011,13.026 10.8,13.238Z" style="fill:#a7aaad;" fill="currentColor" /></svg>'),
155 PartnerData::$id ? 0 : null
156 );
157 }
158
159 /**
160 * Routes pages accordingly
161 *
162 * @return string
163 */
164 public function getRoute()
165 {
166 // This router use to handle more cases but now everyone goes to Assist.
167 return 'admin.php?page=extendify-assist';
168 }
169
170 /**
171 * Redirect once to Launch, only once (at least once) when
172 * the email matches the entry in WP Admin > Settings > General.
173 *
174 * @return void
175 */
176 public function redirectOnce()
177 {
178 if (wp_doing_ajax()) {
179 return;
180 }
181
182 if (defined('EXTENDIFY_IS_THEME_EXTENDABLE') && !EXTENDIFY_IS_THEME_EXTENDABLE) {
183 return;
184 }
185
186 if (\get_option('extendify_launch_loaded', false) || !Config::$showLaunch) {
187 return;
188 }
189
190 // Only redirect if we aren't already on the page.
191 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
192 if (isset($_GET['page']) && $_GET['page'] === 'extendify-launch') {
193 return;
194 }
195
196 $user = \wp_get_current_user();
197 if (
198 $user
199 // Check the main admin email, and they have an admin role.
200 && \get_option('admin_email') === $user->user_email
201 && in_array('administrator', $user->roles, true)
202 ) {
203 // Only redirect 3 times.
204 $currentCount = \get_option('extendify_attempted_redirect_count', 0);
205 if ($currentCount >= 3) {
206 return;
207 }
208
209 \update_option('extendify_attempted_redirect_count', ($currentCount + 1));
210 \update_option('extendify_attempted_redirect', gmdate('Y-m-d H:i:s'));
211
212 // Update permalink structure to postname when auto-redirecting to Launch
213 \update_option('permalink_structure', '/%postname%/');
214 \update_option('extendify_needs_rewrite_flush', true);
215
216 \wp_safe_redirect(\admin_url() . 'admin.php?page=extendify-launch');
217 }
218 }
219
220 /**
221 * Flushes WordPress rewrite rules if previously scheduled by `redirectOnce()`.
222 *
223 * This is triggered based on a flag (`extendify_needs_rewrite_flush`) that is set
224 * when the permalink structure is modified. Flushing rewrite rules in the same
225 * request where the permalink structure is updated can be ineffective due to
226 * internal WordPress caching, so the flush is deferred to a subsequent request.
227 *
228 * @return void
229 */
230 public function maybeForceFlush()
231 {
232 if (\get_option('extendify_needs_rewrite_flush', false)) {
233 \flush_rewrite_rules(true);
234 \delete_option('extendify_needs_rewrite_flush');
235 }
236 }
237 }
238