Edit File by line
/home/zeestwma/ceyloniy.../wp-conte.../plugins/extendif.../app
File: AdminPageRouter.php
<?php
[0] Fix | Delete
[1] Fix | Delete
/**
[2] Fix | Delete
* Simple router to handle admin page loading
[3] Fix | Delete
*/
[4] Fix | Delete
[5] Fix | Delete
namespace Extendify;
[6] Fix | Delete
[7] Fix | Delete
defined('ABSPATH') || die('No direct access.');
[8] Fix | Delete
[9] Fix | Delete
use Extendify\Assist\AdminPage as AssistAdminPage;
[10] Fix | Delete
use Extendify\Launch\AdminPage as LaunchAdminPage;
[11] Fix | Delete
use Extendify\AutoLaunch\AdminPage as AutoLaunchAdminPage;
[12] Fix | Delete
[13] Fix | Delete
/**
[14] Fix | Delete
* This class handles routing when the main admin button is pressed.
[15] Fix | Delete
* This used to be more robust but now just routes to Assist. And
[16] Fix | Delete
* possibly loads Launch depending on the state.
[17] Fix | Delete
*/
[18] Fix | Delete
[19] Fix | Delete
class AdminPageRouter
[20] Fix | Delete
{
[21] Fix | Delete
/**
[22] Fix | Delete
* Adds various actions to set up the page
[23] Fix | Delete
*
[24] Fix | Delete
* @return void
[25] Fix | Delete
*/
[26] Fix | Delete
public function __construct()
[27] Fix | Delete
{
[28] Fix | Delete
// This does the initial redirect to Launch.
[29] Fix | Delete
\add_action('admin_init', [$this, 'redirectOnce'], 10);
[30] Fix | Delete
\add_action('admin_init', [$this, 'maybeForceFlush'], 5);
[31] Fix | Delete
[32] Fix | Delete
// Add a dropdown above Dashboard in the admin toolbar.
[33] Fix | Delete
\add_action('admin_bar_menu', function ($wpAdminBar) {
[34] Fix | Delete
if (!PartnerData::$id || is_admin()) {
[35] Fix | Delete
return;
[36] Fix | Delete
}
[37] Fix | Delete
[38] Fix | Delete
$wpAdminBar->add_node([
[39] Fix | Delete
'id' => 'extendify-site-assistant',
[40] Fix | Delete
'title' => \__('Site Assistant', 'extendify-local'),
[41] Fix | Delete
'href' => \admin_url() . $this->getRoute(),
[42] Fix | Delete
'parent' => 'site-name',
[43] Fix | Delete
'meta' => ['position' => 1],
[44] Fix | Delete
]);
[45] Fix | Delete
}, 11);
[46] Fix | Delete
[47] Fix | Delete
// When Launch is finished, fire this to set the correct permalinks.
[48] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification
[49] Fix | Delete
if (isset($_GET['extendify-launch-success'])) {
[50] Fix | Delete
\add_action('admin_init', function () {
[51] Fix | Delete
\flush_rewrite_rules();
[52] Fix | Delete
});
[53] Fix | Delete
}
[54] Fix | Delete
[55] Fix | Delete
\add_action('admin_menu', function () {
[56] Fix | Delete
// If no partner, we don't show any menu.
[57] Fix | Delete
if (!PartnerData::$id) {
[58] Fix | Delete
return;
[59] Fix | Delete
}
[60] Fix | Delete
[61] Fix | Delete
$assist = new AssistAdminPage();
[62] Fix | Delete
// Adds the top Assist menu.
[63] Fix | Delete
$this->addAdminMenu(
[64] Fix | Delete
__('Site Assistant', 'extendify-local'),
[65] Fix | Delete
$assist->slug,
[66] Fix | Delete
[$assist, 'pageContent']
[67] Fix | Delete
);
[68] Fix | Delete
[69] Fix | Delete
if (!Config::$showLaunch) {
[70] Fix | Delete
return;
[71] Fix | Delete
}
[72] Fix | Delete
[73] Fix | Delete
$launch = new LaunchAdminPage();
[74] Fix | Delete
$this->addSubMenu(
[75] Fix | Delete
// translators: Launch is a noun.
[76] Fix | Delete
__('Launch', 'extendify-local'),
[77] Fix | Delete
$launch->slug,
[78] Fix | Delete
[$launch, 'pageContent']
[79] Fix | Delete
);
[80] Fix | Delete
$autoLaunch = new AutoLaunchAdminPage();
[81] Fix | Delete
$this->addSubMenu(
[82] Fix | Delete
// translators: Launch is a noun.
[83] Fix | Delete
__('Auto Launch', 'extendify-local'),
[84] Fix | Delete
$autoLaunch->slug,
[85] Fix | Delete
[$autoLaunch, 'pageContent']
[86] Fix | Delete
);
[87] Fix | Delete
});
[88] Fix | Delete
[89] Fix | Delete
// If the user is redirected to this while visiting our url, intercept it.
[90] Fix | Delete
\add_filter('wp_redirect', function ($url) {
[91] Fix | Delete
if (!PartnerData::$id) {
[92] Fix | Delete
return $url;
[93] Fix | Delete
}
[94] Fix | Delete
[95] Fix | Delete
// Check for extendify-launch-success as other plugins will not override
[96] Fix | Delete
// this as they intercept the request.
[97] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification
[98] Fix | Delete
if (isset($_GET['extendify-launch-success'])) {
[99] Fix | Delete
return \admin_url() . $this->getRoute();
[100] Fix | Delete
}
[101] Fix | Delete
[102] Fix | Delete
// Special treatment for Yoast to disable their redirect when installing.
[103] Fix | Delete
if ($url === \admin_url() . 'admin.php?page=wpseo_installation_successful_free') {
[104] Fix | Delete
return \admin_url() . $this->getRoute();
[105] Fix | Delete
}
[106] Fix | Delete
[107] Fix | Delete
// Special treatment for Germanized for WooCommerce to disable their redirect when installing.
[108] Fix | Delete
if ($url === \admin_url() . 'admin.php?page=wc-gzd-setup') {
[109] Fix | Delete
return \admin_url() . $this->getRoute();
[110] Fix | Delete
}
[111] Fix | Delete
[112] Fix | Delete
return $url;
[113] Fix | Delete
}, 9999);
[114] Fix | Delete
}
[115] Fix | Delete
[116] Fix | Delete
/**
[117] Fix | Delete
* A helper for handling sub menus
[118] Fix | Delete
*
[119] Fix | Delete
* @param string $name - The menu name.
[120] Fix | Delete
* @param string $slug - The menu slug.
[121] Fix | Delete
* @param callable $callback - The callback to render the page.
[122] Fix | Delete
*
[123] Fix | Delete
* @return void
[124] Fix | Delete
*/
[125] Fix | Delete
public function addSubMenu($name, $slug, $callback = '')
[126] Fix | Delete
{
[127] Fix | Delete
\add_submenu_page(
[128] Fix | Delete
// Uses a "dummy" page for adding pages without a menu.
[129] Fix | Delete
(constant('EXTENDIFY_DEVMODE') ? 'extendify-assist' : 'extendify-page'),
[130] Fix | Delete
$name,
[131] Fix | Delete
$name,
[132] Fix | Delete
Config::$requiredCapability,
[133] Fix | Delete
$slug,
[134] Fix | Delete
$callback
[135] Fix | Delete
);
[136] Fix | Delete
}
[137] Fix | Delete
[138] Fix | Delete
/**
[139] Fix | Delete
* Adds Extendify top menu
[140] Fix | Delete
*
[141] Fix | Delete
* @param string $label - The menu label.
[142] Fix | Delete
* @param string $slug - The menu slug.
[143] Fix | Delete
* @param string|callable $callback - The callback to render the page.
[144] Fix | Delete
* @return void
[145] Fix | Delete
*/
[146] Fix | Delete
public function addAdminMenu($label, $slug, $callback)
[147] Fix | Delete
{
[148] Fix | Delete
$menuLabel = sprintf(
[149] Fix | Delete
'%1$s <span class="extendify-assist-badge-count" data-test="assist-badge-count"></span>',
[150] Fix | Delete
$label
[151] Fix | Delete
);
[152] Fix | Delete
[153] Fix | Delete
\add_menu_page(
[154] Fix | Delete
'Extendify',
[155] Fix | Delete
$menuLabel,
[156] Fix | Delete
Config::$requiredCapability,
[157] Fix | Delete
$slug,
[158] Fix | Delete
$callback,
[159] Fix | Delete
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode, Generic.Files.LineLength.TooLong
[160] Fix | Delete
'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>'),
[161] Fix | Delete
PartnerData::$id ? 0 : null
[162] Fix | Delete
);
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
/**
[166] Fix | Delete
* Routes pages accordingly
[167] Fix | Delete
*
[168] Fix | Delete
* @return string
[169] Fix | Delete
*/
[170] Fix | Delete
public function getRoute()
[171] Fix | Delete
{
[172] Fix | Delete
// This router use to handle more cases but now everyone goes to Assist.
[173] Fix | Delete
return 'admin.php?page=extendify-assist';
[174] Fix | Delete
}
[175] Fix | Delete
[176] Fix | Delete
/**
[177] Fix | Delete
* Redirect once to Launch, only once (at least once) when
[178] Fix | Delete
* the email matches the entry in WP Admin > Settings > General.
[179] Fix | Delete
*
[180] Fix | Delete
* @return void
[181] Fix | Delete
*/
[182] Fix | Delete
public function redirectOnce()
[183] Fix | Delete
{
[184] Fix | Delete
if (wp_doing_ajax()) {
[185] Fix | Delete
return;
[186] Fix | Delete
}
[187] Fix | Delete
[188] Fix | Delete
if (defined('EXTENDIFY_IS_THEME_EXTENDABLE') && !EXTENDIFY_IS_THEME_EXTENDABLE) {
[189] Fix | Delete
return;
[190] Fix | Delete
}
[191] Fix | Delete
[192] Fix | Delete
if (\get_option('extendify_launch_loaded', false) || !Config::$showLaunch) {
[193] Fix | Delete
return;
[194] Fix | Delete
}
[195] Fix | Delete
[196] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
[197] Fix | Delete
if (isset($_GET['page']) && $_GET['page'] === 'extendify-auto-launch') {
[198] Fix | Delete
return;
[199] Fix | Delete
}
[200] Fix | Delete
[201] Fix | Delete
// Only redirect if we aren't already on the page.
[202] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
[203] Fix | Delete
if (isset($_GET['page']) && $_GET['page'] === 'extendify-launch') {
[204] Fix | Delete
if (PartnerData::setting('useAgentOnboarding')) {
[205] Fix | Delete
// If they landed on launch but have the Agent onboarding enabled, redirect to auto-launch.
[206] Fix | Delete
$redirect_url = \add_query_arg(
[207] Fix | Delete
['page' => 'extendify-auto-launch'],
[208] Fix | Delete
\admin_url('admin.php')
[209] Fix | Delete
);
[210] Fix | Delete
\wp_safe_redirect($redirect_url);
[211] Fix | Delete
exit;
[212] Fix | Delete
}
[213] Fix | Delete
return;
[214] Fix | Delete
}
[215] Fix | Delete
[216] Fix | Delete
$user = \wp_get_current_user();
[217] Fix | Delete
if (
[218] Fix | Delete
$user
[219] Fix | Delete
// Check the main admin email, and they have an admin role.
[220] Fix | Delete
&& \get_option('admin_email') === $user->user_email
[221] Fix | Delete
&& in_array('administrator', $user->roles, true)
[222] Fix | Delete
) {
[223] Fix | Delete
// Only redirect 3 times.
[224] Fix | Delete
$currentCount = \get_option('extendify_attempted_redirect_count', 0);
[225] Fix | Delete
if ($currentCount >= 3) {
[226] Fix | Delete
return;
[227] Fix | Delete
}
[228] Fix | Delete
[229] Fix | Delete
\update_option('extendify_attempted_redirect_count', ($currentCount + 1));
[230] Fix | Delete
\update_option('extendify_attempted_redirect', gmdate('Y-m-d H:i:s'));
[231] Fix | Delete
[232] Fix | Delete
// Update permalink structure to postname when auto-redirecting to Launch
[233] Fix | Delete
\update_option('permalink_structure', '/%postname%/');
[234] Fix | Delete
\update_option('extendify_needs_rewrite_flush', true);
[235] Fix | Delete
[236] Fix | Delete
$allowed_launch_params = [
[237] Fix | Delete
'objective',
[238] Fix | Delete
'title',
[239] Fix | Delete
'description',
[240] Fix | Delete
'structure',
[241] Fix | Delete
'tone',
[242] Fix | Delete
'skip',
[243] Fix | Delete
// new for autolaunch (some duplicated)
[244] Fix | Delete
'type',
[245] Fix | Delete
'title',
[246] Fix | Delete
'description',
[247] Fix | Delete
'objective',
[248] Fix | Delete
'category',
[249] Fix | Delete
'structure',
[250] Fix | Delete
'tone',
[251] Fix | Delete
'products',
[252] Fix | Delete
'appointments',
[253] Fix | Delete
'events',
[254] Fix | Delete
'donations',
[255] Fix | Delete
'multilingual',
[256] Fix | Delete
'contact',
[257] Fix | Delete
'address',
[258] Fix | Delete
'blog',
[259] Fix | Delete
'landing-page',
[260] Fix | Delete
'cta-link'
[261] Fix | Delete
];
[262] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.MissingUnslash
[263] Fix | Delete
$autoLaunch = isset($_GET['auto-launch']) && filter_var($_GET['auto-launch'], FILTER_VALIDATE_BOOLEAN);
[264] Fix | Delete
$query_params = ['page' => $autoLaunch ? 'extendify-auto-launch' : 'extendify-launch'];
[265] Fix | Delete
[266] Fix | Delete
foreach ($allowed_launch_params as $param) {
[267] Fix | Delete
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
[268] Fix | Delete
$value = sanitize_text_field(wp_unslash($_GET[$param] ?? ''));
[269] Fix | Delete
if (!empty($value)) {
[270] Fix | Delete
$query_params[$param] = $value;
[271] Fix | Delete
}
[272] Fix | Delete
}
[273] Fix | Delete
[274] Fix | Delete
$redirect_url = \add_query_arg($query_params, \admin_url('admin.php'));
[275] Fix | Delete
\wp_safe_redirect($redirect_url);
[276] Fix | Delete
exit;
[277] Fix | Delete
}
[278] Fix | Delete
}
[279] Fix | Delete
[280] Fix | Delete
/**
[281] Fix | Delete
* Flushes WordPress rewrite rules if previously scheduled by `redirectOnce()`.
[282] Fix | Delete
*
[283] Fix | Delete
* This is triggered based on a flag (`extendify_needs_rewrite_flush`) that is set
[284] Fix | Delete
* when the permalink structure is modified. Flushing rewrite rules in the same
[285] Fix | Delete
* request where the permalink structure is updated can be ineffective due to
[286] Fix | Delete
* internal WordPress caching, so the flush is deferred to a subsequent request.
[287] Fix | Delete
*
[288] Fix | Delete
* @return void
[289] Fix | Delete
*/
[290] Fix | Delete
public function maybeForceFlush()
[291] Fix | Delete
{
[292] Fix | Delete
if (\get_option('extendify_needs_rewrite_flush', false)) {
[293] Fix | Delete
\flush_rewrite_rules(true);
[294] Fix | Delete
\delete_option('extendify_needs_rewrite_flush');
[295] Fix | Delete
}
[296] Fix | Delete
}
[297] Fix | Delete
}
[298] Fix | Delete
[299] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function