Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/jetpack
File: class.jetpack-admin.php
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
[0] Fix | Delete
/**
[1] Fix | Delete
* Build the Jetpack admin menu as a whole.
[2] Fix | Delete
*
[3] Fix | Delete
* @package automattic/jetpack
[4] Fix | Delete
*/
[5] Fix | Delete
[6] Fix | Delete
use Automattic\Jetpack\Admin_UI\Admin_Menu;
[7] Fix | Delete
use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
[8] Fix | Delete
use Automattic\Jetpack\Partner_Coupon as Jetpack_Partner_Coupon;
[9] Fix | Delete
use Automattic\Jetpack\Status;
[10] Fix | Delete
use Automattic\Jetpack\Status\Host;
[11] Fix | Delete
[12] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[13] Fix | Delete
exit( 0 );
[14] Fix | Delete
}
[15] Fix | Delete
[16] Fix | Delete
/**
[17] Fix | Delete
* Build the Jetpack admin menu as a whole.
[18] Fix | Delete
*/
[19] Fix | Delete
class Jetpack_Admin {
[20] Fix | Delete
[21] Fix | Delete
/**
[22] Fix | Delete
* Static instance.
[23] Fix | Delete
*
[24] Fix | Delete
* @var Jetpack_Admin
[25] Fix | Delete
*/
[26] Fix | Delete
private static $instance = null;
[27] Fix | Delete
[28] Fix | Delete
/**
[29] Fix | Delete
* Initialize and fetch the static instance.
[30] Fix | Delete
*
[31] Fix | Delete
* @return self
[32] Fix | Delete
*/
[33] Fix | Delete
public static function init() {
[34] Fix | Delete
if ( self::$instance === null ) {
[35] Fix | Delete
self::$instance = new Jetpack_Admin();
[36] Fix | Delete
}
[37] Fix | Delete
return self::$instance;
[38] Fix | Delete
}
[39] Fix | Delete
[40] Fix | Delete
/**
[41] Fix | Delete
* Filter callback to add `no-store` to the `Cache-Control` header.
[42] Fix | Delete
*
[43] Fix | Delete
* @deprecated 14.9
[44] Fix | Delete
* @param array $headers Headers array.
[45] Fix | Delete
* @return array Modified headers array.
[46] Fix | Delete
*/
[47] Fix | Delete
public static function add_no_store_header( $headers ) {
[48] Fix | Delete
_deprecated_function( __METHOD__, '14.9' );
[49] Fix | Delete
$headers['Cache-Control'] .= ', no-store';
[50] Fix | Delete
return $headers;
[51] Fix | Delete
}
[52] Fix | Delete
[53] Fix | Delete
/** Constructor. */
[54] Fix | Delete
private function __construct() {
[55] Fix | Delete
require_once JETPACK__PLUGIN_DIR . '_inc/lib/admin-pages/class.jetpack-react-page.php';
[56] Fix | Delete
$jetpack_react = new Jetpack_React_Page();
[57] Fix | Delete
[58] Fix | Delete
require_once JETPACK__PLUGIN_DIR . '_inc/lib/admin-pages/class.jetpack-settings-page.php';
[59] Fix | Delete
$fallback_page = new Jetpack_Settings_Page();
[60] Fix | Delete
[61] Fix | Delete
require_once JETPACK__PLUGIN_DIR . '_inc/lib/admin-pages/class-jetpack-about-page.php';
[62] Fix | Delete
$jetpack_about = new Jetpack_About_Page();
[63] Fix | Delete
[64] Fix | Delete
add_action( 'admin_init', array( $jetpack_react, 'react_redirects' ), 0 );
[65] Fix | Delete
add_action( 'admin_menu', array( $jetpack_react, 'add_actions' ), 998 );
[66] Fix | Delete
add_action( 'admin_menu', array( $jetpack_react, 'remove_jetpack_menu' ), 2000 );
[67] Fix | Delete
add_action( 'jetpack_admin_menu', array( $jetpack_react, 'jetpack_add_settings_sub_nav_item' ) );
[68] Fix | Delete
add_action( 'jetpack_admin_menu', array( $this, 'admin_menu_debugger' ) );
[69] Fix | Delete
add_action( 'jetpack_admin_menu', array( $fallback_page, 'add_actions' ) );
[70] Fix | Delete
add_action( 'jetpack_admin_menu', array( $jetpack_about, 'add_actions' ) );
[71] Fix | Delete
[72] Fix | Delete
// Add redirect to current page for activation/deactivation of modules.
[73] Fix | Delete
add_action( 'jetpack_pre_activate_module', array( $this, 'fix_redirect' ), 10, 2 );
[74] Fix | Delete
add_action( 'jetpack_pre_deactivate_module', array( $this, 'fix_redirect' ), 10, 2 );
[75] Fix | Delete
[76] Fix | Delete
// Add module bulk actions handler.
[77] Fix | Delete
add_action( 'jetpack_unrecognized_action', array( $this, 'handle_unrecognized_action' ) );
[78] Fix | Delete
[79] Fix | Delete
if ( class_exists( 'Akismet_Admin' ) ) {
[80] Fix | Delete
// If the site has Jetpack Anti-spam, change the Akismet menu label and logo accordingly.
[81] Fix | Delete
$site_products = array_column( Jetpack_Plan::get_products(), 'product_slug' );
[82] Fix | Delete
$has_anti_spam_product = count( array_intersect( array( 'jetpack_anti_spam', 'jetpack_anti_spam_monthly' ), $site_products ) ) > 0;
[83] Fix | Delete
[84] Fix | Delete
if ( Jetpack_Plan::supports( 'akismet' ) || Jetpack_Plan::supports( 'antispam' ) || $has_anti_spam_product ) {
[85] Fix | Delete
// Prevent Akismet from adding a menu item.
[86] Fix | Delete
add_action(
[87] Fix | Delete
'admin_menu',
[88] Fix | Delete
function () {
[89] Fix | Delete
remove_action( 'admin_menu', array( 'Akismet_Admin', 'admin_menu' ), 5 );
[90] Fix | Delete
},
[91] Fix | Delete
4
[92] Fix | Delete
);
[93] Fix | Delete
[94] Fix | Delete
// Add an Anti-spam menu item for Jetpack. This is handled automatically by the Admin_Menu as long as it has been initialized.
[95] Fix | Delete
Admin_Menu::init();
[96] Fix | Delete
}
[97] Fix | Delete
}
[98] Fix | Delete
[99] Fix | Delete
// Ensure an Additional CSS menu item is added to the Appearance menu whenever Jetpack is connected.
[100] Fix | Delete
add_action( 'admin_menu', array( $this, 'additional_css_menu' ) );
[101] Fix | Delete
[102] Fix | Delete
add_filter( 'jetpack_display_jitms_on_screen', array( $this, 'should_display_jitms_on_screen' ), 10, 2 );
[103] Fix | Delete
[104] Fix | Delete
// Register Jetpack partner coupon hooks.
[105] Fix | Delete
Jetpack_Partner_Coupon::register_coupon_admin_hooks( 'jetpack', Jetpack::admin_url() );
[106] Fix | Delete
}
[107] Fix | Delete
[108] Fix | Delete
/**
[109] Fix | Delete
* Handle our Additional CSS menu item and legacy page declaration.
[110] Fix | Delete
*
[111] Fix | Delete
* @since 11.0 . Prior to that, this function was located in custom-css-4.7.php (now custom-css.php).
[112] Fix | Delete
*/
[113] Fix | Delete
public static function additional_css_menu() {
[114] Fix | Delete
/*
[115] Fix | Delete
* Custom CSS for the Customizer is deprecated for block themes as of WP 6.1, so we only expose it with a menu
[116] Fix | Delete
* if the site already has existing CSS code.
[117] Fix | Delete
*/
[118] Fix | Delete
if ( wp_is_block_theme() ) {
[119] Fix | Delete
$styles = wp_get_custom_css();
[120] Fix | Delete
if ( ! $styles ) {
[121] Fix | Delete
return;
[122] Fix | Delete
}
[123] Fix | Delete
}
[124] Fix | Delete
[125] Fix | Delete
// If the site is a WoA site and the custom-css feature is not available, return.
[126] Fix | Delete
// See https://github.com/Automattic/jetpack/pull/19965 for more on how this menu item is dealt with on WoA sites.
[127] Fix | Delete
if ( ( new Host() )->is_woa_site() && ! ( in_array( 'custom-css', Jetpack::get_available_modules(), true ) ) ) {
[128] Fix | Delete
return;
[129] Fix | Delete
} elseif (
[130] Fix | Delete
class_exists( 'Jetpack' ) && (
[131] Fix | Delete
Jetpack::is_module_active( 'custom-css' ) || // If the Custom CSS module is enabled, add the Additional CSS menu item and link to the Customizer.
[132] Fix | Delete
( wp_is_block_theme() && ! empty( wp_get_custom_css() ) ) // Do the same if the theme is block-based but has existing custom CSS.
[133] Fix | Delete
)
[134] Fix | Delete
) {
[135] Fix | Delete
// Add in our legacy page to support old bookmarks and such.
[136] Fix | Delete
add_submenu_page( '', __( 'CSS', 'jetpack' ), __( 'Additional CSS', 'jetpack' ), 'edit_theme_options', 'editcss', array( __CLASS__, 'customizer_redirect' ) );
[137] Fix | Delete
[138] Fix | Delete
// Add in our new page slug that will redirect to the customizer.
[139] Fix | Delete
$hook = add_theme_page( __( 'CSS', 'jetpack' ), __( 'Additional CSS', 'jetpack' ), 'edit_theme_options', 'editcss-customizer-redirect', array( __CLASS__, 'customizer_redirect' ) );
[140] Fix | Delete
add_action( "load-{$hook}", array( __CLASS__, 'customizer_redirect' ) );
[141] Fix | Delete
}
[142] Fix | Delete
}
[143] Fix | Delete
[144] Fix | Delete
/**
[145] Fix | Delete
* Handle the redirect for the customizer. This is necessary because
[146] Fix | Delete
* we can't directly add customizer links to the admin menu.
[147] Fix | Delete
*
[148] Fix | Delete
* @since 11.0 . Prior to that, this function was located in custom-css-4.7.php (now custom-css.php).
[149] Fix | Delete
*
[150] Fix | Delete
* There is a core patch in trac that would make this unnecessary.
[151] Fix | Delete
*
[152] Fix | Delete
* @link https://core.trac.wordpress.org/ticket/39050
[153] Fix | Delete
*
[154] Fix | Delete
* @return never
[155] Fix | Delete
*/
[156] Fix | Delete
public static function customizer_redirect() {
[157] Fix | Delete
wp_safe_redirect(
[158] Fix | Delete
self::customizer_link(
[159] Fix | Delete
array(
[160] Fix | Delete
'return_url' => wp_get_referer(),
[161] Fix | Delete
)
[162] Fix | Delete
)
[163] Fix | Delete
);
[164] Fix | Delete
exit( 0 );
[165] Fix | Delete
}
[166] Fix | Delete
[167] Fix | Delete
/**
[168] Fix | Delete
* Build the URL to deep link to the Customizer.
[169] Fix | Delete
*
[170] Fix | Delete
* You can modify the return url via $args.
[171] Fix | Delete
*
[172] Fix | Delete
* @since 11.0 in this file. This method is also located in custom-css-4.7.php to cover legacy scenarios.
[173] Fix | Delete
*
[174] Fix | Delete
* @param array $args Array of parameters.
[175] Fix | Delete
* @return string
[176] Fix | Delete
*/
[177] Fix | Delete
public static function customizer_link( $args = array() ) {
[178] Fix | Delete
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
[179] Fix | Delete
$args = wp_parse_args(
[180] Fix | Delete
$args,
[181] Fix | Delete
array(
[182] Fix | Delete
'return_url' => rawurlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
[183] Fix | Delete
)
[184] Fix | Delete
);
[185] Fix | Delete
}
[186] Fix | Delete
[187] Fix | Delete
return add_query_arg(
[188] Fix | Delete
array(
[189] Fix | Delete
array(
[190] Fix | Delete
'autofocus' => array(
[191] Fix | Delete
'section' => 'custom_css',
[192] Fix | Delete
),
[193] Fix | Delete
),
[194] Fix | Delete
'return' => $args['return_url'],
[195] Fix | Delete
),
[196] Fix | Delete
admin_url( 'customize.php' )
[197] Fix | Delete
);
[198] Fix | Delete
}
[199] Fix | Delete
[200] Fix | Delete
/**
[201] Fix | Delete
* Sort callback to put modules with `requires_connection` last.
[202] Fix | Delete
*
[203] Fix | Delete
* @param array $module1 Module data.
[204] Fix | Delete
* @param array $module2 Module data.
[205] Fix | Delete
* @return int Indicating the relative ordering of module1 and module2.
[206] Fix | Delete
*/
[207] Fix | Delete
public static function sort_requires_connection_last( $module1, $module2 ) {
[208] Fix | Delete
return ( (bool) $module1['requires_connection'] ) <=> ( (bool) $module2['requires_connection'] );
[209] Fix | Delete
}
[210] Fix | Delete
[211] Fix | Delete
/**
[212] Fix | Delete
* Produce JS understandable objects of modules containing information for
[213] Fix | Delete
* presentation like description, name, configuration url, etc.
[214] Fix | Delete
*/
[215] Fix | Delete
public function get_modules() {
[216] Fix | Delete
include_once JETPACK__PLUGIN_DIR . 'modules/module-info.php';
[217] Fix | Delete
$available_modules = Jetpack::get_available_modules();
[218] Fix | Delete
$active_modules = Jetpack::get_active_modules();
[219] Fix | Delete
$modules = array();
[220] Fix | Delete
$jetpack_active = Jetpack::is_connection_ready() || ( new Status() )->is_offline_mode();
[221] Fix | Delete
$overrides = Jetpack_Modules_Overrides::instance();
[222] Fix | Delete
foreach ( $available_modules as $module ) {
[223] Fix | Delete
$module_array = Jetpack::get_module( $module );
[224] Fix | Delete
if ( $module_array ) {
[225] Fix | Delete
/**
[226] Fix | Delete
* Filters each module's short description.
[227] Fix | Delete
*
[228] Fix | Delete
* @since 3.0.0
[229] Fix | Delete
*
[230] Fix | Delete
* @param string $module_array['description'] Module description.
[231] Fix | Delete
* @param string $module Module slug.
[232] Fix | Delete
*/
[233] Fix | Delete
$short_desc = apply_filters( 'jetpack_short_module_description', $module_array['description'], $module );
[234] Fix | Delete
// Fix: correct multibyte strings truncate with checking for mbstring extension.
[235] Fix | Delete
$short_desc_trunc = ( function_exists( 'mb_strlen' ) )
[236] Fix | Delete
? ( ( mb_strlen( $short_desc ) > 143 )
[237] Fix | Delete
? mb_substr( $short_desc, 0, 140 ) . '...'
[238] Fix | Delete
: $short_desc )
[239] Fix | Delete
: ( ( strlen( $short_desc ) > 143 )
[240] Fix | Delete
? substr( $short_desc, 0, 140 ) . '...'
[241] Fix | Delete
: $short_desc );
[242] Fix | Delete
[243] Fix | Delete
$module_array['module'] = $module;
[244] Fix | Delete
[245] Fix | Delete
$is_available = self::is_module_available( $module_array );
[246] Fix | Delete
[247] Fix | Delete
$module_array['activated'] = ( $jetpack_active ? in_array( $module, $active_modules, true ) : false );
[248] Fix | Delete
$module_array['deactivate_nonce'] = wp_create_nonce( 'jetpack_deactivate-' . $module );
[249] Fix | Delete
$module_array['activate_nonce'] = wp_create_nonce( 'jetpack_activate-' . $module );
[250] Fix | Delete
$module_array['available'] = $is_available;
[251] Fix | Delete
$module_array['unavailable_reason'] = $is_available ? false : self::get_module_unavailable_reason( $module_array );
[252] Fix | Delete
$module_array['short_description'] = $short_desc_trunc;
[253] Fix | Delete
$module_array['configure_url'] = Jetpack::module_configuration_url( $module );
[254] Fix | Delete
$module_array['override'] = $overrides->get_module_override( $module );
[255] Fix | Delete
$module_array['disabled'] = $is_available ? '' : 'disabled="disabled"';
[256] Fix | Delete
[257] Fix | Delete
ob_start();
[258] Fix | Delete
/**
[259] Fix | Delete
* Allow the display of a "Learn More" button.
[260] Fix | Delete
* The dynamic part of the action, $module, is the module slug.
[261] Fix | Delete
*
[262] Fix | Delete
* @since 3.0.0
[263] Fix | Delete
*/
[264] Fix | Delete
do_action( 'jetpack_learn_more_button_' . $module );
[265] Fix | Delete
$module_array['learn_more_button'] = ob_get_clean();
[266] Fix | Delete
[267] Fix | Delete
ob_start();
[268] Fix | Delete
/**
[269] Fix | Delete
* Allow the display of information text when Jetpack is connected to WordPress.com.
[270] Fix | Delete
* The dynamic part of the action, $module, is the module slug.
[271] Fix | Delete
*
[272] Fix | Delete
* @since 3.0.0
[273] Fix | Delete
*/
[274] Fix | Delete
do_action( 'jetpack_module_more_info_' . $module );
[275] Fix | Delete
[276] Fix | Delete
/**
[277] Fix | Delete
* Filter the long description of a module.
[278] Fix | Delete
*
[279] Fix | Delete
* @since 3.5.0
[280] Fix | Delete
*
[281] Fix | Delete
* @param string ob_get_clean() The module long description.
[282] Fix | Delete
* @param string $module The module name.
[283] Fix | Delete
*/
[284] Fix | Delete
$module_array['long_description'] = apply_filters( 'jetpack_long_module_description', ob_get_clean(), $module );
[285] Fix | Delete
[286] Fix | Delete
ob_start();
[287] Fix | Delete
/**
[288] Fix | Delete
* Filter the search terms for a module
[289] Fix | Delete
*
[290] Fix | Delete
* Search terms are typically added to the module headers, under "Additional Search Queries".
[291] Fix | Delete
*
[292] Fix | Delete
* Use syntax:
[293] Fix | Delete
* function jetpack_$module_search_terms( $terms ) {
[294] Fix | Delete
* $terms = _x( 'term 1, term 2', 'search terms', 'jetpack' );
[295] Fix | Delete
* return $terms;
[296] Fix | Delete
* }
[297] Fix | Delete
* add_filter( 'jetpack_search_terms_$module', 'jetpack_$module_search_terms' );
[298] Fix | Delete
*
[299] Fix | Delete
* @since 3.5.0
[300] Fix | Delete
*
[301] Fix | Delete
* @param string The search terms (comma separated).
[302] Fix | Delete
*/
[303] Fix | Delete
echo apply_filters( 'jetpack_search_terms_' . $module, $module_array['additional_search_queries'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
[304] Fix | Delete
$module_array['search_terms'] = ob_get_clean();
[305] Fix | Delete
[306] Fix | Delete
$module_array['configurable'] = false;
[307] Fix | Delete
if (
[308] Fix | Delete
current_user_can( 'manage_options' ) &&
[309] Fix | Delete
/**
[310] Fix | Delete
* Allow the display of a configuration link in the Jetpack Settings screen.
[311] Fix | Delete
*
[312] Fix | Delete
* @since 3.0.0
[313] Fix | Delete
*
[314] Fix | Delete
* @param string $module Module name.
[315] Fix | Delete
* @param bool false Should the Configure module link be displayed? Default to false.
[316] Fix | Delete
*/
[317] Fix | Delete
apply_filters( 'jetpack_module_configurable_' . $module, false )
[318] Fix | Delete
) {
[319] Fix | Delete
$module_array['configurable'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $module_array['configure_url'] ), __( 'Configure', 'jetpack' ) );
[320] Fix | Delete
}
[321] Fix | Delete
[322] Fix | Delete
$modules[ $module ] = $module_array;
[323] Fix | Delete
}
[324] Fix | Delete
}
[325] Fix | Delete
[326] Fix | Delete
uasort( $modules, array( 'Jetpack', 'sort_modules' ) );
[327] Fix | Delete
[328] Fix | Delete
if ( ! Jetpack::is_connection_ready() ) {
[329] Fix | Delete
uasort( $modules, array( __CLASS__, 'sort_requires_connection_last' ) );
[330] Fix | Delete
}
[331] Fix | Delete
[332] Fix | Delete
return $modules;
[333] Fix | Delete
}
[334] Fix | Delete
[335] Fix | Delete
/**
[336] Fix | Delete
* Check if a module is available.
[337] Fix | Delete
*
[338] Fix | Delete
* @param array $module Module data.
[339] Fix | Delete
*/
[340] Fix | Delete
public static function is_module_available( $module ) {
[341] Fix | Delete
if ( ! is_array( $module ) || empty( $module ) ) {
[342] Fix | Delete
return false;
[343] Fix | Delete
}
[344] Fix | Delete
[345] Fix | Delete
/**
[346] Fix | Delete
* We never want to show VaultPress as activatable through Jetpack.
[347] Fix | Delete
*/
[348] Fix | Delete
if ( 'vaultpress' === $module['module'] ) {
[349] Fix | Delete
return false;
[350] Fix | Delete
}
[351] Fix | Delete
[352] Fix | Delete
/*
[353] Fix | Delete
* WooCommerce Analytics should only be available
[354] Fix | Delete
* when running WooCommerce 3+
[355] Fix | Delete
*/
[356] Fix | Delete
if (
[357] Fix | Delete
'woocommerce-analytics' === $module['module']
[358] Fix | Delete
&& (
[359] Fix | Delete
! class_exists( 'WooCommerce' )
[360] Fix | Delete
|| version_compare( WC_VERSION, '3.0', '<' )
[361] Fix | Delete
)
[362] Fix | Delete
) {
[363] Fix | Delete
return false;
[364] Fix | Delete
}
[365] Fix | Delete
[366] Fix | Delete
/*
[367] Fix | Delete
* In Offline mode, modules that require a site or user
[368] Fix | Delete
* level connection should be unavailable.
[369] Fix | Delete
*/
[370] Fix | Delete
if ( ( new Status() )->is_offline_mode() ) {
[371] Fix | Delete
return ! ( $module['requires_connection'] || $module['requires_user_connection'] );
[372] Fix | Delete
}
[373] Fix | Delete
[374] Fix | Delete
/*
[375] Fix | Delete
* Jetpack not connected.
[376] Fix | Delete
*/
[377] Fix | Delete
if ( ! Jetpack::is_connection_ready() ) {
[378] Fix | Delete
return false;
[379] Fix | Delete
}
[380] Fix | Delete
[381] Fix | Delete
/*
[382] Fix | Delete
* Jetpack connected at a site level only. Make sure to make
[383] Fix | Delete
* modules that require a user connection unavailable.
[384] Fix | Delete
*/
[385] Fix | Delete
if ( ! Jetpack::connection()->has_connected_owner() && $module['requires_user_connection'] ) {
[386] Fix | Delete
return false;
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
return Jetpack_Plan::supports( $module['module'] );
[390] Fix | Delete
}
[391] Fix | Delete
[392] Fix | Delete
/**
[393] Fix | Delete
* Returns why a module is unavailable.
[394] Fix | Delete
*
[395] Fix | Delete
* @param array $module The module.
[396] Fix | Delete
* @return string|false A string stating why the module is not available or false if the module is available.
[397] Fix | Delete
*/
[398] Fix | Delete
public static function get_module_unavailable_reason( $module ) {
[399] Fix | Delete
if ( ! is_array( $module ) || empty( $module ) ) {
[400] Fix | Delete
return false;
[401] Fix | Delete
}
[402] Fix | Delete
[403] Fix | Delete
if ( self::is_module_available( $module ) ) {
[404] Fix | Delete
return false;
[405] Fix | Delete
}
[406] Fix | Delete
[407] Fix | Delete
/**
[408] Fix | Delete
* We never want to show VaultPress as activatable through Jetpack so return an empty string.
[409] Fix | Delete
*/
[410] Fix | Delete
if ( 'vaultpress' === $module['module'] ) {
[411] Fix | Delete
return '';
[412] Fix | Delete
}
[413] Fix | Delete
[414] Fix | Delete
/*
[415] Fix | Delete
* WooCommerce Analytics should only be available
[416] Fix | Delete
* when running WooCommerce 3+
[417] Fix | Delete
*/
[418] Fix | Delete
if (
[419] Fix | Delete
'woocommerce-analytics' === $module['module']
[420] Fix | Delete
&& (
[421] Fix | Delete
! class_exists( 'WooCommerce' )
[422] Fix | Delete
|| version_compare( WC_VERSION, '3.0', '<' )
[423] Fix | Delete
)
[424] Fix | Delete
) {
[425] Fix | Delete
return __( 'Requires WooCommerce 3+ plugin', 'jetpack' );
[426] Fix | Delete
}
[427] Fix | Delete
[428] Fix | Delete
/*
[429] Fix | Delete
* In Offline mode, modules that require a site or user
[430] Fix | Delete
* level connection should be unavailable.
[431] Fix | Delete
*/
[432] Fix | Delete
if ( ( new Status() )->is_offline_mode() ) {
[433] Fix | Delete
if ( $module['requires_connection'] || $module['requires_user_connection'] ) {
[434] Fix | Delete
return __( 'Offline mode', 'jetpack' );
[435] Fix | Delete
}
[436] Fix | Delete
}
[437] Fix | Delete
[438] Fix | Delete
/*
[439] Fix | Delete
* Jetpack not connected.
[440] Fix | Delete
*/
[441] Fix | Delete
if ( ! Jetpack::is_connection_ready() ) {
[442] Fix | Delete
return __( 'Jetpack is not connected', 'jetpack' );
[443] Fix | Delete
}
[444] Fix | Delete
[445] Fix | Delete
/*
[446] Fix | Delete
* Jetpack connected at a site level only and module requires a user connection.
[447] Fix | Delete
*/
[448] Fix | Delete
if ( ! Jetpack::connection()->has_connected_owner() && $module['requires_user_connection'] ) {
[449] Fix | Delete
return __( 'Requires a connected WordPress.com account', 'jetpack' );
[450] Fix | Delete
}
[451] Fix | Delete
[452] Fix | Delete
/*
[453] Fix | Delete
* Plan restrictions.
[454] Fix | Delete
*/
[455] Fix | Delete
if ( ! Jetpack_Plan::supports( $module['module'] ) ) {
[456] Fix | Delete
return __( 'Not supported by current plan', 'jetpack' );
[457] Fix | Delete
}
[458] Fix | Delete
[459] Fix | Delete
return '';
[460] Fix | Delete
}
[461] Fix | Delete
[462] Fix | Delete
/**
[463] Fix | Delete
* Handle an unrecognized action.
[464] Fix | Delete
*
[465] Fix | Delete
* @param string $action Action.
[466] Fix | Delete
*/
[467] Fix | Delete
public function handle_unrecognized_action( $action ) {
[468] Fix | Delete
switch ( $action ) {
[469] Fix | Delete
case 'bulk-activate':
[470] Fix | Delete
check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
[471] Fix | Delete
if ( ! current_user_can( 'jetpack_activate_modules' ) ) {
[472] Fix | Delete
break;
[473] Fix | Delete
}
[474] Fix | Delete
[475] Fix | Delete
$modules = isset( $_GET['modules'] ) ? array_map( 'sanitize_key', wp_unslash( (array) $_GET['modules'] ) ) : array();
[476] Fix | Delete
foreach ( $modules as $module ) {
[477] Fix | Delete
Jetpack::log( 'activate', $module );
[478] Fix | Delete
Jetpack::activate_module( $module, false );
[479] Fix | Delete
}
[480] Fix | Delete
// The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end.
[481] Fix | Delete
wp_safe_redirect( wp_get_referer() );
[482] Fix | Delete
exit( 0 );
[483] Fix | Delete
case 'bulk-deactivate':
[484] Fix | Delete
check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
[485] Fix | Delete
if ( ! current_user_can( 'jetpack_deactivate_modules' ) ) {
[486] Fix | Delete
break;
[487] Fix | Delete
}
[488] Fix | Delete
[489] Fix | Delete
$modules = isset( $_GET['modules'] ) ? array_map( 'sanitize_key', wp_unslash( (array) $_GET['modules'] ) ) : array();
[490] Fix | Delete
foreach ( $modules as $module ) {
[491] Fix | Delete
Jetpack::log( 'deactivate', $module );
[492] Fix | Delete
Jetpack::deactivate_module( $module );
[493] Fix | Delete
Jetpack::state( 'message', 'module_deactivated' );
[494] Fix | Delete
}
[495] Fix | Delete
Jetpack::state( 'module', $modules );
[496] Fix | Delete
wp_safe_redirect( wp_get_referer() );
[497] Fix | Delete
exit( 0 );
[498] Fix | Delete
default:
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function