function get_modules() { include_once JETPACK__PLUGIN_DIR . 'modules/module-info.php'; $available_modules = $this->jetpack->get_available_modules(); $active_modules = $this->jetpack->get_active_modules(); $modules = array(); $jetpack_active = Jetpack::is_active() || Jetpack::is_development_mode(); foreach ($available_modules as $module) { if ($module_array = $this->jetpack->get_module($module)) { $short_desc = apply_filters('jetpack_short_module_description', $module_array['description'], $module); // Fix: correct multibyte strings truncate with checking for mbstring extension $short_desc_trunc = function_exists('mb_strlen') ? mb_strlen($short_desc) > 143 ? mb_substr($short_desc, 0, 140) . '...' : $short_desc : (strlen($short_desc) > 143 ? substr($short_desc, 0, 140) . '...' : $short_desc); $module_array['module'] = $module; $module_array['activated'] = $jetpack_active ? in_array($module, $active_modules) : false; $module_array['deactivate_nonce'] = wp_create_nonce('jetpack_deactivate-' . $module); $module_array['activate_nonce'] = wp_create_nonce('jetpack_activate-' . $module); $module_array['available'] = self::is_module_available($module_array); $module_array['short_description'] = $short_desc_trunc; $module_array['configure_url'] = Jetpack::module_configuration_url($module); ob_start(); do_action('jetpack_learn_more_button_' . $module); $module_array['learn_more_button'] = ob_get_clean(); ob_start(); if (Jetpack::is_active() && has_action('jetpack_module_more_info_connected_' . $module)) { do_action('jetpack_module_more_info_connected_' . $module); } else { do_action('jetpack_module_more_info_' . $module); } $module_array['long_description'] = ob_get_clean(); $module_array['configurable'] = false; if (current_user_can('manage_options') && apply_filters('jetpack_module_configurable_' . $module, false)) { $module_array['configurable'] = sprintf('<a href="%1$s">%2$s</a>', esc_url(Jetpack::module_configuration_url($module)), __('Configure', 'jetpack')); } $modules[$module] = $module_array; } } uasort($modules, array($this->jetpack, 'sort_modules')); if (!Jetpack::is_active()) { uasort($modules, array(__CLASS__, 'sort_requires_connection_last')); } return $modules; }
/** * Returns what features are available. Uses the slug of the module files. * * @return array|IXR_Error */ function features_available() { $raw_modules = Jetpack::get_available_modules(); $modules = array(); foreach ($raw_modules as $module) { $modules[] = Jetpack::get_module_slug($module); } return $modules; }
public static function generate_stats_array($prefix = '') { $return = array(); $return["{$prefix}version"] = JETPACK__VERSION; $return["{$prefix}wp-version"] = get_bloginfo('version'); $return["{$prefix}php-version"] = PHP_VERSION; $return["{$prefix}branch"] = floatval(JETPACK__VERSION); $return["{$prefix}wp-branch"] = floatval(get_bloginfo('version')); $return["{$prefix}php-branch"] = floatval(PHP_VERSION); $return["{$prefix}ssl"] = Jetpack::permit_ssl(); $return["{$prefix}language"] = get_bloginfo('language'); $return["{$prefix}charset"] = get_bloginfo('charset'); $return["{$prefix}is-multisite"] = is_multisite() ? 'multisite' : 'singlesite'; $return["{$prefix}identitycrisis"] = Jetpack::check_identity_crisis(1) ? 'yes' : 'no'; $return["{$prefix}plugins"] = implode(',', Jetpack::get_active_plugins()); if (!empty($_SERVER['SERVER_ADDR']) || !empty($_SERVER['LOCAL_ADDR'])) { $ip = !empty($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR']; $ip_arr = array_map('intval', explode('.', $ip)); if (4 == sizeof($ip_arr)) { $return["{$prefix}ip-2-octets"] = implode('.', array_slice($ip_arr, 0, 2)); $return["{$prefix}ip-3-octets"] = implode('.', array_slice($ip_arr, 0, 3)); } } foreach (Jetpack::get_available_modules() as $slug) { $return["{$prefix}module-{$slug}"] = Jetpack::is_module_active($slug) ? 'on' : 'off'; } return $return; }
public function render_network_admin_settings_page() { $this->network_admin_page_header(); $options = wp_parse_args(get_site_option($this->settings_name), $this->setting_defaults); $modules = array(); $module_slugs = Jetpack::get_available_modules(); foreach ($module_slugs as $slug) { $module = Jetpack::get_module($slug); $module['module'] = $slug; $modules[] = $module; } usort($modules, array('Jetpack', 'sort_modules')); if (!isset($options['modules'])) { $options['modules'] = $modules; } $data = array('modules' => $modules, 'options' => $options, 'jetpack_protect_whitelist' => jetpack_protect_format_whitelist()); Jetpack::init()->load_view('admin/network-settings.php', $data); $this->network_admin_page_footer(); }
/** * Validates that the parameter belongs to a list of admitted values. * * @since 4.3.0 * * @param string $value Value to check. * @param WP_REST_Request $request * @param string $param Name of the parameter passed to endpoint holding $value. * * @return bool */ public static function validate_module_list($value = '', $request, $param) { if (!is_array($value)) { return new WP_Error('invalid_param_value', sprintf(esc_html__('%s must be an array', 'jetpack'), $param)); } $modules = Jetpack::get_available_modules(); if (count(array_intersect($value, $modules)) != count($value)) { return new WP_Error('invalid_param_value', sprintf(esc_html__('%s must be a list of valid modules', 'jetpack'), $param)); } return true; }
function admin_screen_list_modules() { require_once dirname(__FILE__) . '/modules/module-info.php'; $jetpack_connected = true; if (!Jetpack::is_active()) { $jetpack_connected = false; } ?> <div class="module-container"> <?php $avail_raw = Jetpack::get_available_modules(); $available = array(); $active = Jetpack::get_active_modules(); $counter = 0; foreach ((array) $avail_raw as $module) { if ($plugin = Jetpack::get_module($module)) { $plugin['module'] = $module; $available[] = $plugin; } } unset($avail_raw); usort($available, array('Jetpack', 'sort_modules')); foreach ((array) $available as $module_data) { $module = $module_data['module']; if (in_array($module, $active)) { $css = 'active'; $toggle = __('Deactivate', 'jetpack'); $toggle_url = wp_nonce_url(Jetpack::admin_url(array('action' => 'deactivate', 'module' => $module)), "jetpack_deactivate-{$module}"); } else { $css = 'inactive'; $toggle = __('Activate', 'jetpack'); $toggle_url = wp_nonce_url(Jetpack::admin_url(array('action' => 'activate', 'module' => $module)), "jetpack_activate-{$module}"); } $file = Jetpack::get_module_path($module); $png = str_replace('.php', '.png', $file); if (is_readable(dirname(__FILE__) . '/_inc/images/icons/' . basename($png))) { $module_img = plugins_url(basename(dirname(__FILE__)) . '/_inc/images/icons/' . basename($png)); } else { $module_img = plugins_url(basename(dirname(__FILE__)) . '/_inc/images/module-blank.png'); } if ($counter % 4 == 0) { $classes = $css . ' jetpack-newline'; $counter = 0; } else { $classes = $css; } if (!$jetpack_connected) { $classes = 'x disabled'; } ?> <div class="jetpack-module jetpack-<?php echo $classes; ?> " id="<?php echo $module; ?> "> <h3><?php echo $module_data['name']; ?> </h3> <div class="jetpack-module-description"> <div class="module-image"> <img src="<?php echo esc_url($module_img); ?> " align="right" width="71" height="45" /> <p><?php _e('Free', 'jetpack'); ?> </p> </div> <p><?php echo apply_filters('jetpack_short_module_description_' . $module, $module_data['description']); ?> </p> </div> <div class="jetpack-module-actions"> <?php if ($jetpack_connected) { $activated = in_array($module, $active); ?> <?php if (!$activated) { ?> <a href="<?php echo esc_url($toggle_url); ?> " class="jetpack-toggle-button<?php echo 'inactive' == $css ? ' button-primary' : ' button'; ?> "><?php echo $toggle; ?> </a> <?php } ?> <?php do_action('jetpack_learn_more_button_' . $module); ?> <?php if (apply_filters('jetpack_module_configurable_' . $module, false)) { echo '<a href="' . esc_attr(Jetpack::module_configuration_url($module)) . '" class="jetpack-configure-button button">' . __('Configure', 'jetpack') . '</a>'; } if ($activated) { ?> <a style="display: none;" href="<?php echo esc_url($toggle_url); ?> " class="jetpack-deactivate-button button"><?php echo $toggle; ?> </a> <?php } ?> <?php } else { ?> <?php do_action('jetpack_learn_more_button_' . $module); ?> <?php } ?> </div> </div> <?php if ('inactive' == $css && $jetpack_connected) { ?> <script type="text/javascript"> jQuery( '#<?php echo esc_js($module); ?> ' ).bind( 'click', function(e){ if ( !jQuery(e.target).hasClass('more-info-link') ) document.location.href = '<?php echo str_replace('&', '&', esc_js(esc_url($toggle_url))); ?> '; } ); </script> <?php } ?> <div id="jp-more-info-<?php echo esc_attr($module); ?> " style="display:none;"> <?php if ($jetpack_connected && has_action('jetpack_module_more_info_connected_' . $module)) { do_action('jetpack_module_more_info_connected_' . $module); } else { do_action('jetpack_module_more_info_' . $module); } ?> </div> <?php $counter++; } // Add in some "Coming soon..." placeholders to fill up the current row and one more for ($i = 0; $i < 15; $i++) { ?> <div class="jetpack-module placeholder"<?php if ($i > 8 - $counter) { echo ' style="display: none;"'; } ?> > <h3><?php _e('Coming soon…', 'jetpack'); ?> </h3> </div> <?php } echo '</div><!-- .module-container -->'; }
function admin_screen_list_modules() { require_once JETPACK__PLUGIN_DIR . 'modules/module-info.php'; $jetpack_connected = true; if (!Jetpack::is_active()) { $jetpack_connected = false; } ?> <div class="module-container"> <?php $avail_raw = Jetpack::get_available_modules(); $available = array(); $active = Jetpack::get_active_modules(); $counter = 0; foreach ((array) $avail_raw as $module) { if ($plugin = Jetpack::get_module($module)) { $plugin['module'] = $module; $available[] = $plugin; } } unset($avail_raw); usort($available, array('Jetpack', 'sort_modules')); $jetpack_version = Jetpack_Options::get_option('version'); if ($jetpack_version) { list($jetpack_version, $jetpack_version_time) = explode(':', $jetpack_version); } else { $jetpack_version = 0; $jetpack_version_time = 0; } $jetpack_old_version = Jetpack_Options::get_option('old_version'); if ($jetpack_old_version) { list($jetpack_old_version) = explode(':', $jetpack_old_version); } else { $jetpack_old_version = 0; } $now = time(); foreach ((array) $available as $module_data) { $module = $module_data['module']; $activated = in_array($module, $active); if ($activated) { $css = 'active'; $toggle = __('Deactivate', 'jetpack'); $toggle_url = wp_nonce_url(Jetpack::admin_url(array('page' => 'jetpack', 'action' => 'deactivate', 'module' => $module)), "jetpack_deactivate-{$module}"); } else { $css = 'inactive'; $toggle = __('Activate', 'jetpack'); $toggle_url = wp_nonce_url(Jetpack::admin_url(array('page' => 'jetpack', 'action' => 'activate', 'module' => $module)), "jetpack_activate-{$module}"); } if ($counter % 4 == 0) { $classes = $css . ' jetpack-newline'; $counter = 0; } else { $classes = $css; } $free_text = esc_html($module_data['free'] ? __('Free', 'jetpack') : __('Purchase', 'jetpack')); $free_text = apply_filters('jetpack_module_free_text_' . $module, $free_text); $badge_text = $free_text; if (!$jetpack_connected && !Jetpack::is_development_mode()) { $classes = 'x disabled'; } elseif ($jetpack_version_time + 604800 > $now) { // 1 week if (version_compare($module_data['introduced'], $jetpack_old_version, '>')) { $badge_text = esc_html__('New', 'jetpack'); $classes .= ' jetpack-new-module'; } elseif (isset($module_data['changed']) && version_compare($module_data['changed'], $jetpack_old_version, '>')) { $badge_text = esc_html__('Updated', 'jetpack'); $classes .= ' jetpack-updated-module'; } else { $badge_text = $free_text; } } ?> <div class="jetpack-module jetpack-<?php echo $classes; ?> " id="<?php echo $module; ?> "> <h3><?php echo esc_html($module_data['name']); ?> </h3> <div class="jetpack-module-description"> <div class="module-image"> <p><span class="module-image-badge"><?php echo $badge_text; ?> </span><span class="module-image-free" style="display: none"><?php echo $free_text; ?> </span></p> </div> <p><?php echo apply_filters('jetpack_short_module_description', $module_data['description'], $module); ?> </p> </div> <div class="jetpack-module-actions"> <?php if ($jetpack_connected || Jetpack::is_development_mode() && !$module_data['requires_connection']) { ?> <?php if (!$activated && current_user_can('manage_options') && apply_filters('jetpack_can_activate_' . $module, true)) { ?> <a href="<?php echo esc_url($toggle_url); ?> " class="<?php echo 'inactive' == $css ? ' button-primary' : ' button-secondary'; ?> "><?php echo $toggle; ?> </a> <?php } ?> <?php do_action('jetpack_learn_more_button_' . $module); ?> <?php if (current_user_can('manage_options') && apply_filters('jetpack_module_configurable_' . $module, false)) { echo '<a href="' . esc_url(Jetpack::module_configuration_url($module)) . '" class="jetpack-configure-button button-secondary">' . __('Configure', 'jetpack') . '</a>'; } if ($activated && $module_data['deactivate'] && current_user_can('manage_options')) { ?> <a style="display: none;" href="<?php echo esc_url($toggle_url); ?> " class="jetpack-deactivate-button button-secondary"><?php echo $toggle; ?> </a> <?php } ?> <?php } else { ?> <?php do_action('jetpack_learn_more_button_' . $module); ?> <?php } ?> </div> </div> <?php if ('inactive' == $css && $jetpack_connected && current_user_can('manage_options') && apply_filters('jetpack_can_activate_' . $module, true)) { ?> <script type="text/javascript"> jQuery( '#<?php echo esc_js($module); ?> ' ).bind( 'click', function(e){ if ( ! jQuery(e.target).hasClass('more-info-link') ) document.location.href = '<?php echo str_replace('&', '&', esc_js(esc_url($toggle_url))); ?> '; } ); </script> <?php } else { ?> <style> #<?php echo $module; ?> { cursor: default; } </style> <?php } ?> <div id="jp-more-info-<?php echo esc_attr($module); ?> " style="display:none;"> <?php if ($jetpack_connected && has_action('jetpack_module_more_info_connected_' . $module)) { do_action('jetpack_module_more_info_connected_' . $module); } else { do_action('jetpack_module_more_info_' . $module); } ?> </div> <?php $counter++; } // Add in some "Coming soon..." placeholders to fill up the current row and one more for ($i = 0; $i < 4; $i++) { ?> <div class="jetpack-module placeholder"<?php if ($i > 8 - $counter) { echo ' style="display: none;"'; } ?> > <h3><?php _e('Coming soon…', 'jetpack'); ?> </h3> </div> <?php } echo '</div><!-- .module-container -->'; }
/** * Manage Jetpack Modules * * ## OPTIONS * * list: View all available modules, and their status. * * activate <module_slug>: Activate a module. * * deactivate <module_slug>: Deactivate a module. * * toggle <module_slug>: Toggle a module on or off. * * ## EXAMPLES * * wp jetpack module list * wp jetpack module activate stats * wp jetpack module deactivate stats * wp jetpack module toggle stats * * @synopsis [list|activate|deactivate|toggle [<module_name>]] */ public function module($args, $assoc_args) { $action = isset($args[0]) ? $args[0] : 'list'; if (!in_array($action, array('list', 'activate', 'deactivate', 'toggle'))) { WP_CLI::error(sprintf(__('%s is not a valid command.', 'jetpack'), $action)); } if (in_array($action, array('activate', 'deactivate', 'toggle'))) { if (isset($args[1])) { $module_slug = $args[1]; if (!Jetpack::is_module($module_slug)) { WP_CLI::error(sprintf(__('%s is not a valid module.', 'jetpack'), $module_slug)); } if ('toggle' == $action) { $action = Jetpack::is_module_active($module_slug) ? 'deactivate' : 'activate'; } } else { WP_CLI::line(__('Please specify a valid module.', 'jetpack')); $action = 'list'; } } switch ($action) { case 'list': WP_CLI::line(__('Available Modules:', 'jetpack')); $modules = Jetpack::get_available_modules(); sort($modules); foreach ($modules as $module_slug) { $active = Jetpack::is_module_active($module_slug) ? __('Active', 'jetpack') : __('Inactive', 'jetpack'); WP_CLI::line("\t" . str_pad($module_slug, 24) . $active); } break; case 'activate': $module = Jetpack::get_module($module_slug); Jetpack::log('activate', $module_slug); Jetpack::activate_module($module_slug, false); WP_CLI::success(sprintf(__('%s has been activated.', 'jetpack'), $module['name'])); break; case 'deactivate': $module = Jetpack::get_module($module_slug); Jetpack::log('deactivate', $module_slug); Jetpack::deactivate_module($module_slug); WP_CLI::success(sprintf(__('%s has been deactivated.', 'jetpack'), $module['name'])); break; case 'toggle': // Will never happen, should have been handled above and changed to activate or deactivate. break; } }
/** * Set up all the data and queue it for the outgoing XML-RPC request */ function sync() { global $wpdb; $jetpack = Jetpack::init(); $available_modules = Jetpack::get_available_modules(); $active_modules = Jetpack::get_active_modules(); $modules = array(); foreach ($available_modules as $available_module) { $modules[$available_module] = in_array($available_module, $active_modules); } $modules['vaultpress'] = class_exists('VaultPress') || function_exists('vaultpress_contact_service'); $sync_data = compact('modules'); if (count($this->sync)) { foreach ($this->sync as $obj => $data) { switch ($obj) { case 'post': $global_post = isset($GLOBALS['post']) ? $GLOBALS['post'] : null; $GLOBALS['post'] = null; foreach ($data as $post => $columns) { $sync_data['post'][$post] = $jetpack->get_post($post, $columns); if (isset($this->post_transitions[$post])) { $sync_data['post'][$post]['transitions'] = $this->post_transitions[$post]; } else { $sync_data['post'][$post]['transitions'] = array(false, false); } } $GLOBALS['post'] = $global_post; unset($global_post); break; case 'delete_post': foreach ($data as $post => $true) { $sync_data['delete_post'][$post] = true; } break; case 'comment': $global_comment = isset($GLOBALS['comment']) ? $GLOBALS['comment'] : null; unset($GLOBALS['comment']); foreach ($data as $comment => $columns) { $sync_data['comment'][$comment] = $jetpack->get_comment($comment, $columns); } $GLOBALS['comment'] = $global_comment; unset($global_comment); break; case 'delete_comment': foreach ($data as $comment => $true) { $sync_data['delete_comment'][$comment] = true; } break; case 'tag': foreach ($data as $taxonomy => $columns) { $sync_data['tag'][$taxonomy] = $jetpack->get_taxonomy($taxonomy, $columns, 'post_tag'); } break; case 'delete_tag': foreach ($data as $taxonomy => $columns) { $sync_data['delete_tag'][$taxonomy] = $columns; } break; case 'category': foreach ($data as $taxonomy => $columns) { $sync_data['category'][$taxonomy] = $jetpack->get_taxonomy($taxonomy, $columns, 'category'); } break; case 'delete_category': foreach ($data as $taxonomy => $columns) { $sync_data['delete_category'][$taxonomy] = $columns; } break; } } Jetpack::xmlrpc_async_call('jetpack.syncContent', $sync_data); } }
/** * Return Jetpack available modules * @since 0.1 * @return array */ private function get_available_modules() { if (null === self::$modules) { if (class_exists('Jetpack')) { //remove_filter( 'jetpack_get_available_modules', array($this, 'blacklist') ); // remove filter useless here because of bug in Jetpack $modules = array(); foreach (Jetpack::get_available_modules() as $slug) { $module = Jetpack::get_module($slug); if ($module) { $modules[$slug] = $module; } } self::$modules = $modules; //add_filter( 'jetpack_get_available_modules', array($this, 'blacklist') ); } else { self::$modules = self::$known_modules; } } return self::$modules; }
public function validate_input($module) { $this->modules = Jetpack::get_available_modules(); return true; }
public static function generate_stats_array($prefix = '') { $return = array(); $return["{$prefix}version"] = JETPACK__VERSION; $return["{$prefix}wp-version"] = get_bloginfo('version'); $return["{$prefix}php-version"] = PHP_VERSION; $return["{$prefix}branch"] = floatval(JETPACK__VERSION); $return["{$prefix}wp-branch"] = floatval(get_bloginfo('version')); $return["{$prefix}php-branch"] = floatval(PHP_VERSION); $return["{$prefix}public"] = Jetpack_Options::get_option('public'); $return["{$prefix}ssl"] = Jetpack::permit_ssl(); $return["{$prefix}is-https"] = is_ssl() ? 'https' : 'http'; $return["{$prefix}language"] = get_bloginfo('language'); $return["{$prefix}charset"] = get_bloginfo('charset'); $return["{$prefix}is-multisite"] = is_multisite() ? 'multisite' : 'singlesite'; $return["{$prefix}identitycrisis"] = Jetpack::check_identity_crisis(1) ? 'yes' : 'no'; $return["{$prefix}plugins"] = implode(',', Jetpack::get_active_plugins()); $return["{$prefix}single-user-site"] = Jetpack::is_single_user_site(); $return["{$prefix}manage-enabled"] = Jetpack::is_module_active('manage'); // is-multi-network can have three values, `single-site`, `single-network`, and `multi-network` $return["{$prefix}is-multi-network"] = 'single-site'; if (is_multisite()) { $return["{$prefix}is-multi-network"] = Jetpack::is_multi_network() ? 'multi-network' : 'single-network'; } if (!empty($_SERVER['SERVER_ADDR']) || !empty($_SERVER['LOCAL_ADDR'])) { $ip = !empty($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR']; $ip_arr = array_map('intval', explode('.', $ip)); if (4 == count($ip_arr)) { $return["{$prefix}ip-2-octets"] = implode('.', array_slice($ip_arr, 0, 2)); } } foreach (Jetpack::get_available_modules() as $slug) { $return["{$prefix}module-{$slug}"] = Jetpack::is_module_active($slug) ? 'on' : 'off'; } return $return; }
public static function generate_stats_array($prefix = '') { $return = array(); $return["{$prefix}version"] = JETPACK__VERSION; $return["{$prefix}wp-version"] = get_bloginfo('version'); $return["{$prefix}php-version"] = PHP_VERSION; $return["{$prefix}branch"] = floatval(JETPACK__VERSION); $return["{$prefix}wp-branch"] = floatval(get_bloginfo('version')); $return["{$prefix}php-branch"] = floatval(PHP_VERSION); $return["{$prefix}public"] = Jetpack_Options::get_option('public'); $return["{$prefix}ssl"] = Jetpack::permit_ssl(); $return["{$prefix}language"] = get_bloginfo('language'); $return["{$prefix}charset"] = get_bloginfo('charset'); $return["{$prefix}is-multisite"] = is_multisite() ? 'multisite' : 'singlesite'; $return["{$prefix}identitycrisis"] = Jetpack::check_identity_crisis(1) ? 'yes' : 'no'; $return["{$prefix}plugins"] = implode(',', Jetpack::get_active_plugins()); switch (Jetpack_Options::get_option('json_api_full_management', null)) { case null: $return["{$prefix}full_manage"] = 'unset'; break; case false: $return["{$prefix}full_manage"] = 'false'; break; case true: $return["{$prefix}full_manage"] = 'true'; break; default: $return["{$prefix}full_manage"] = Jetpack_Options::get_option('json_api_full_management', null); } if (!Jetpack_Options::get_option('public')) { // Also flag things as private since we don't provide the user with option to easy opt into if the site is private $return["{$prefix}full_manage"] = 'private-' . $return["{$prefix}full_manage"]; } // is-multi-network can have three values, `single-site`, `single-network`, and `multi-network` $return["{$prefix}is-multi-network"] = 'single-site'; if (is_multisite()) { $return["{$prefix}is-multi-network"] = Jetpack::is_multi_network() ? 'multi-network' : 'single-network'; } if (!empty($_SERVER['SERVER_ADDR']) || !empty($_SERVER['LOCAL_ADDR'])) { $ip = !empty($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR']; $ip_arr = array_map('intval', explode('.', $ip)); if (4 == count($ip_arr)) { $return["{$prefix}ip-2-octets"] = implode('.', array_slice($ip_arr, 0, 2)); $return["{$prefix}ip-3-octets"] = implode('.', array_slice($ip_arr, 0, 3)); } } foreach (Jetpack::get_available_modules() as $slug) { $return["{$prefix}module-{$slug}"] = Jetpack::is_module_active($slug) ? 'on' : 'off'; } return $return; }
/** * Returns what features are available. Uses the slug of the module files. * * @return array|IXR_Error */ function features_available() { $raw_modules = Jetpack::get_available_modules(); $modules = array(); foreach ($raw_modules as $module) { $modules[] = str_replace(array('/modules/', '.php'), '', $module); } return $modules; }
public static function is_module($module) { return !empty($module) && !validate_file($module, Jetpack::get_available_modules()); }
public function render_network_admin_settings_page() { $this->network_admin_page_header(); $options = wp_parse_args(get_site_option($this->settings_name), $this->setting_defaults); $modules = array(); $module_slugs = Jetpack::get_available_modules(); foreach ($module_slugs as $slug) { $module = Jetpack::get_module($slug); $module['module'] = $slug; $modules[] = $module; } usort($modules, array('Jetpack', 'sort_modules')); if (!isset($options['modules'])) { $options['modules'] = $modules; } require 'views/admin/network-settings.php'; $this->network_admin_page_footer(); }
/** * Handles the page load events for the Jetpack admin page */ function admin_page_load() { $error = false; // Make sure we have the right body class to hook stylings for subpages off of. add_filter('admin_body_class', array(__CLASS__, 'add_jetpack_pagestyles')); if (!empty($_GET['jetpack_restate'])) { // Should only be used in intermediate redirects to preserve state across redirects Jetpack::restate(); } if (isset($_GET['connect_url_redirect'])) { // User clicked in the iframe to link their accounts if (!Jetpack::is_user_connected()) { $connect_url = $this->build_connect_url(true, false, 'iframe'); if (isset($_GET['notes_iframe'])) { $connect_url .= '¬es_iframe'; } wp_redirect($connect_url); exit; } else { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); exit; } } if (isset($_GET['action'])) { switch ($_GET['action']) { case 'authorize': if (Jetpack::is_active() && Jetpack::is_user_connected()) { Jetpack::state('message', 'already_authorized'); wp_safe_redirect(Jetpack::admin_url()); exit; } Jetpack::log('authorize'); $client_server = new Jetpack_Client_Server(); $client_server->client_authorize(); exit; case 'register': if (!current_user_can('jetpack_connect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-register'); Jetpack::log('register'); Jetpack::maybe_set_version_option(); $registered = Jetpack::try_registration(); if (is_wp_error($registered)) { $error = $registered->get_error_code(); Jetpack::state('error_description', $registered->get_error_message()); break; } $from = isset($_GET['from']) ? $_GET['from'] : false; wp_redirect($this->build_connect_url(true, false, $from)); exit; case 'activate': if (!current_user_can('jetpack_activate_modules')) { $error = 'cheatin'; break; } $module = stripslashes($_GET['module']); check_admin_referer("jetpack_activate-{$module}"); Jetpack::log('activate', $module); Jetpack::activate_module($module); // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end. wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'activate_default_modules': check_admin_referer('activate_default_modules'); Jetpack::log('activate_default_modules'); Jetpack::restate(); $min_version = isset($_GET['min_version']) ? $_GET['min_version'] : false; $max_version = isset($_GET['max_version']) ? $_GET['max_version'] : false; $other_modules = isset($_GET['other_modules']) && is_array($_GET['other_modules']) ? $_GET['other_modules'] : array(); Jetpack::activate_default_modules($min_version, $max_version, $other_modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'disconnect': if (!current_user_can('jetpack_disconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-disconnect'); Jetpack::log('disconnect'); Jetpack::disconnect(); wp_safe_redirect(Jetpack::admin_url('disconnected=true')); exit; case 'reconnect': if (!current_user_can('jetpack_reconnect')) { $error = 'cheatin'; break; } check_admin_referer('jetpack-reconnect'); Jetpack::log('reconnect'); $this->disconnect(); wp_redirect($this->build_connect_url(true, false, 'reconnect')); exit; case 'deactivate': if (!current_user_can('jetpack_deactivate_modules')) { $error = 'cheatin'; break; } $modules = stripslashes($_GET['module']); check_admin_referer("jetpack_deactivate-{$modules}"); foreach (explode(',', $modules) as $module) { Jetpack::log('deactivate', $module); Jetpack::deactivate_module($module); Jetpack::state('message', 'module_deactivated'); } Jetpack::state('module', $modules); wp_safe_redirect(Jetpack::admin_url('page=jetpack')); exit; case 'unlink': $redirect = isset($_GET['redirect']) ? $_GET['redirect'] : ''; check_admin_referer('jetpack-unlink'); Jetpack::log('unlink'); $this->unlink_user(); Jetpack::state('message', 'unlinked'); if ('sub-unlink' == $redirect) { wp_safe_redirect(admin_url()); } else { wp_safe_redirect(Jetpack::admin_url(array('page' => $redirect))); } exit; default: /** * Fires when a Jetpack admin page is loaded with an unrecognized parameter. * * @since 2.6.0 * * @param string sanitize_key( $_GET['action'] ) Unrecognized URL parameter. */ do_action('jetpack_unrecognized_action', sanitize_key($_GET['action'])); } } if (!($error = $error ? $error : Jetpack::state('error'))) { self::activate_new_modules(true); } switch ($error) { case 'cheatin': $this->error = __('Cheatin’ uh?', 'jetpack'); break; case 'access_denied': $this->error = sprintf(__('Would you mind telling us why you did not complete the Jetpack connection in this <a href="%s">1 question survey</a>?', 'jetpack'), 'http://jetpack.com/cancelled-connection/') . '<br /><small>' . __('A Jetpack connection is required for our free security and traffic features to work.', 'jetpack') . '</small>'; break; case 'wrong_state': $this->error = __('You need to stay logged in to your WordPress blog while you authorize Jetpack.', 'jetpack'); break; case 'invalid_client': // @todo re-register instead of deactivate/reactivate $this->error = __('We had an issue connecting Jetpack; deactivate then reactivate the Jetpack plugin, then connect again.', 'jetpack'); break; case 'invalid_grant': $this->error = __('There was an issue connecting your Jetpack. Please click “Connect to WordPress.com” again.', 'jetpack'); break; case 'site_inaccessible': case 'site_requires_authorization': $this->error = sprintf(__('Your website needs to be publicly accessible to use Jetpack: %s', 'jetpack'), "<code>{$error}</code>"); break; case 'module_activation_failed': $module = Jetpack::state('module'); if (!empty($module) && ($mod = Jetpack::get_module($module))) { $this->error = sprintf(__('%s could not be activated because it triggered a <strong>fatal error</strong>. Perhaps there is a conflict with another plugin you have installed?', 'jetpack'), $mod['name']); if (isset($this->plugins_to_deactivate[$module])) { $this->error .= ' ' . sprintf(__('Do you still have the %s plugin installed?', 'jetpack'), $this->plugins_to_deactivate[$module][1]); } } else { $this->error = __('Module could not be activated because it triggered a <strong>fatal error</strong>. Perhaps there is a conflict with another plugin you have installed?', 'jetpack'); } if ($php_errors = Jetpack::state('php_errors')) { $this->error .= "<br />\n"; $this->error .= $php_errors; } break; case 'master_user_required': $module = Jetpack::state('module'); $module_name = ''; if (!empty($module) && ($mod = Jetpack::get_module($module))) { $module_name = $mod['name']; } $master_user = Jetpack_Options::get_option('master_user'); $master_userdata = get_userdata($master_user); if ($master_userdata) { if (!in_array($module, Jetpack::get_active_modules())) { $this->error = sprintf(__('%s was not activated.', 'jetpack'), $module_name); } else { $this->error = sprintf(__('%s was not deactivated.', 'jetpack'), $module_name); } $this->error .= ' ' . sprintf(__('This module can only be altered by %s, the user who initiated the Jetpack connection on this site.', 'jetpack'), esc_html($master_userdata->display_name)); } else { $this->error = sprintf(__('Only the user who initiated the Jetpack connection on this site can toggle %s, but that user no longer exists. This should not happen.', 'jetpack'), $module_name); } break; case 'not_public': $this->error = __('<strong>Your Jetpack has a glitch.</strong> Connecting this site with WordPress.com is not possible. This usually means your site is not publicly accessible (localhost).', 'jetpack'); break; case 'wpcom_408': case 'wpcom_5??': case 'wpcom_bad_response': case 'wpcom_outage': $this->error = __('WordPress.com is currently having problems and is unable to fuel up your Jetpack. Please try again later.', 'jetpack'); break; case 'register_http_request_failed': case 'token_http_request_failed': $this->error = sprintf(__('Jetpack could not contact WordPress.com: %s. This usually means something is incorrectly configured on your web host.', 'jetpack'), "<code>{$error}</code>"); break; default: if (empty($error)) { break; } $error = trim(substr(strip_tags($error), 0, 20)); // no break: fall through // no break: fall through case 'no_role': case 'no_cap': case 'no_code': case 'no_state': case 'invalid_state': case 'invalid_request': case 'invalid_scope': case 'unsupported_response_type': case 'invalid_token': case 'no_token': case 'missing_secrets': case 'home_missing': case 'siteurl_missing': case 'gmt_offset_missing': case 'site_name_missing': case 'secret_1_missing': case 'secret_2_missing': case 'site_lang_missing': case 'home_malformed': case 'siteurl_malformed': case 'gmt_offset_malformed': case 'timezone_string_malformed': case 'site_name_malformed': case 'secret_1_malformed': case 'secret_2_malformed': case 'site_lang_malformed': case 'secrets_mismatch': case 'verify_secret_1_missing': case 'verify_secret_1_malformed': case 'verify_secrets_missing': case 'verify_secrets_mismatch': $error = esc_html($error); $this->error = sprintf(__('<strong>Your Jetpack has a glitch.</strong> We’re sorry for the inconvenience. Please try again later, if the issue continues please contact support with this message: %s', 'jetpack'), "<code>{$error}</code>"); if (!Jetpack::is_active()) { $this->error .= '<br />'; $this->error .= sprintf(__('Try connecting again.', 'jetpack')); } break; } $message_code = Jetpack::state('message'); $active_state = Jetpack::state('activated_modules'); if (!empty($active_state)) { $available = Jetpack::get_available_modules(); $active_state = explode(',', $active_state); $active_state = array_intersect($active_state, $available); if (count($active_state)) { foreach ($active_state as $mod) { $this->stat('module-activated', $mod); } } else { $active_state = false; } } if (Jetpack::state('optin-manage')) { $activated_manage = $message_code; $message_code = 'jetpack-manage'; } switch ($message_code) { case 'modules_activated': $this->message = sprintf(__('Welcome to <strong>Jetpack %s</strong>!', 'jetpack'), JETPACK__VERSION); if ($active_state) { $titles = array(); foreach ($active_state as $mod) { if ($mod_headers = Jetpack::get_module($mod)) { $titles[] = '<strong>' . preg_replace('/\\s+(?![^<>]++>)/', ' ', $mod_headers['name']) . '</strong>'; } } if ($titles) { $this->message .= '<br /><br />' . wp_sprintf(__('The following new modules have been activated: %l.', 'jetpack'), $titles); } } if ($reactive_state = Jetpack::state('reactivated_modules')) { $titles = array(); foreach (explode(',', $reactive_state) as $mod) { if ($mod_headers = Jetpack::get_module($mod)) { $titles[] = '<strong>' . preg_replace('/\\s+(?![^<>]++>)/', ' ', $mod_headers['name']) . '</strong>'; } } if ($titles) { $this->message .= '<br /><br />' . wp_sprintf(__('The following modules have been updated: %l.', 'jetpack'), $titles); } } $this->message .= Jetpack::jetpack_comment_notice(); break; case 'jetpack-manage': $this->message = '<strong>' . sprintf(__('You are all set! Your site can now be managed from <a href="%s" target="_blank">wordpress.com/sites</a>.', 'jetpack'), 'https://wordpress.com/sites') . '</strong>'; if ($activated_manage) { $this->message .= '<br /><strong>' . __('Manage has been activated for you!', 'jetpack') . '</strong>'; } break; case 'module_activated': if ($module = Jetpack::get_module(Jetpack::state('module'))) { $this->message = sprintf(__('<strong>%s Activated!</strong> You can deactivate at any time by clicking the Deactivate link next to each module.', 'jetpack'), $module['name']); $this->stat('module-activated', Jetpack::state('module')); } break; case 'module_deactivated': $modules = Jetpack::state('module'); if (!$modules) { break; } $module_names = array(); foreach (explode(',', $modules) as $module_slug) { $module = Jetpack::get_module($module_slug); if ($module) { $module_names[] = $module['name']; } $this->stat('module-deactivated', $module_slug); } if (!$module_names) { break; } $this->message = wp_sprintf(_nx('<strong>%l Deactivated!</strong> You can activate it again at any time using the activate link next to each module.', '<strong>%l Deactivated!</strong> You can activate them again at any time using the activate links next to each module.', count($module_names), '%l = list of Jetpack module/feature names', 'jetpack'), $module_names); break; case 'module_configured': $this->message = __('<strong>Module settings were saved.</strong> ', 'jetpack'); break; case 'already_authorized': $this->message = __('<strong>Your Jetpack is already connected.</strong> ', 'jetpack'); break; case 'authorized': $this->message = __('<strong>You’re fueled up and ready to go, Jetpack is now active.</strong> ', 'jetpack'); $this->message .= Jetpack::jetpack_comment_notice(); break; case 'linked': $this->message = __('<strong>You’re fueled up and ready to go.</strong> ', 'jetpack'); $this->message .= Jetpack::jetpack_comment_notice(); break; case 'unlinked': $user = wp_get_current_user(); $this->message = sprintf(__('<strong>You have unlinked your account (%s) from WordPress.com.</strong>', 'jetpack'), $user->user_login); break; case 'switch_master': global $current_user; $is_master_user = $current_user->ID == Jetpack_Options::get_option('master_user'); $master_userdata = get_userdata(Jetpack_Options::get_option('master_user')); if ($is_master_user) { $this->message = __('You have successfully set yourself as Jetpack’s primary user.', 'jetpack'); } else { $this->message = sprintf(_x('You have successfully set %s as Jetpack’s primary user.', '%s is a username', 'jetpack'), $master_userdata->user_login); } break; } $deactivated_plugins = Jetpack::state('deactivated_plugins'); if (!empty($deactivated_plugins)) { $deactivated_plugins = explode(',', $deactivated_plugins); $deactivated_titles = array(); foreach ($deactivated_plugins as $deactivated_plugin) { if (!isset($this->plugins_to_deactivate[$deactivated_plugin])) { continue; } $deactivated_titles[] = '<strong>' . str_replace(' ', ' ', $this->plugins_to_deactivate[$deactivated_plugin][1]) . '</strong>'; } if ($deactivated_titles) { if ($this->message) { $this->message .= "<br /><br />\n"; } $this->message .= wp_sprintf(_n('Jetpack contains the most recent version of the old %l plugin.', 'Jetpack contains the most recent versions of the old %l plugins.', count($deactivated_titles), 'jetpack'), $deactivated_titles); $this->message .= "<br />\n"; $this->message .= _n('The old version has been deactivated and can be removed from your site.', 'The old versions have been deactivated and can be removed from your site.', count($deactivated_titles), 'jetpack'); } } $this->privacy_checks = Jetpack::state('privacy_checks'); if ($this->message || $this->error || $this->privacy_checks || $this->can_display_jetpack_manage_notice()) { add_action('jetpack_notices', array($this, 'admin_notices')); } if (isset($_GET['configure']) && Jetpack::is_module($_GET['configure']) && current_user_can('manage_options')) { /** * Fires when a module configuration page is loaded. * The dynamic part of the hook is the configure parameter from the URL. * * @since 1.1.0 */ do_action('jetpack_module_configuration_load_' . $_GET['configure']); } add_filter('jetpack_short_module_description', 'wptexturize'); }
</div><?php // j-row ?> <?php if (current_user_can('jetpack_manage_modules')) { ?> <p><?php _e('Jetpack includes many other features that you can use to customize how your site looks and functions. These include Contact Forms, Tiled Photo Galleries, Custom CSS, Image Carousel, and a lot more.', 'jetpack'); ?> </p> <p><a href="<?php echo admin_url('admin.php?page=jetpack_modules'); ?> " class="button full-features-btn" ><?php echo sprintf(__('See the other %s Jetpack features', 'jetpack'), count(Jetpack::get_available_modules()) - count($data['recommended_list'])); ?> </a></p> <?php } ?> <div class="nux-foot j-row"> <div class="j-col j-lrg-8 j-md-8 j-sm-12"> <?php // Get a list of Jetpack Happiness Engineers. $jetpack_hes = array('724cd8eaaa1ef46e4c38c4213ee1d8b7', '623f42e878dbd146ddb30ebfafa1375b', '561be467af56cefa58e02782b7ac7510', 'd8ad409290a6ae7b60f128a0b9a0c1c5', '790618302648bd80fa8a55497dfd8ac8', '6e238edcb0664c975ccb9e8e80abb307', '4e6c84eeab0a1338838a9a1e84629c1a', '9d4b77080c699629e846d3637b3a661c', '4626de7797aada973c1fb22dfe0e5109', '190cf13c9cd358521085af13615382d5'); // Get a fallback profile image. $default_he_img = plugins_url('images/jetpack-icon.jpg', JETPACK__PLUGIN_FILE); printf('<a href="http://jetpack.me/support/" target="_blank"><img src="https://secure.gravatar.com/avatar/%1$s?s=75&d=%2$s" alt="Jetpack Happiness Engineer" /></a>', $jetpack_hes[array_rand($jetpack_hes)], urlencode($default_he_img)); ?>
/** * Manage Jetpack Modules * * ## OPTIONS * * list : View all available modules, and their status. * activate all : Activate all modules * deactivate all: Deactivate all modules * * activate <module_slug> : Activate a module. * deactivate <module_slug> : Deactivate a module. * toggle <module_slug> : Toggle a module on or off. * * ## EXAMPLES * * wp jetpack module list * wp jetpack module activate stats * wp jetpack module deactivate stats * wp jetpack module toggle stats * * wp jetpack module activate all * wp jetpack module deactivate all * * @synopsis <list|activate|deactivate|toggle> [<module_name>] */ public function module($args, $assoc_args) { $action = isset($args[0]) ? $args[0] : 'list'; if (!in_array($action, array('list', 'activate', 'deactivate', 'toggle'))) { WP_CLI::error(sprintf(__('%s is not a valid command.', 'jetpack'), $action)); } if (in_array($action, array('activate', 'deactivate', 'toggle'))) { if (isset($args[1])) { $module_slug = $args[1]; if ('all' !== $module_slug && !Jetpack::is_module($module_slug)) { WP_CLI::error(sprintf(__('%s is not a valid module.', 'jetpack'), $module_slug)); } if ('toggle' == $action) { $action = Jetpack::is_module_active($module_slug) ? 'deactivate' : 'activate'; } // Bulk actions if ('all' == $args[1]) { $action = 'deactivate' == $action ? 'deactivate_all' : 'activate_all'; } // VaultPress needs to be handled elsewhere. if (in_array($action, array('activate', 'deactivate', 'toggle')) && 'vaultpress' == $args[1]) { WP_CLI::error(sprintf(_x('Please visit %s to configure your VaultPress subscription.', '%s is a website', 'jetpack'), esc_url('https://vaultpress.com/jetpack/'))); } } else { WP_CLI::line(__('Please specify a valid module.', 'jetpack')); $action = 'list'; } } switch ($action) { case 'list': WP_CLI::line(__('Available Modules:', 'jetpack')); $modules = Jetpack::get_available_modules(); sort($modules); foreach ($modules as $module_slug) { if ('vaultpress' == $module_slug) { continue; } $active = Jetpack::is_module_active($module_slug) ? __('Active', 'jetpack') : __('Inactive', 'jetpack'); WP_CLI::line("\t" . str_pad($module_slug, 24) . $active); } break; case 'activate': $module = Jetpack::get_module($module_slug); Jetpack::log('activate', $module_slug); Jetpack::activate_module($module_slug, false, false); WP_CLI::success(sprintf(__('%s has been activated.', 'jetpack'), $module['name'])); break; case 'activate_all': $modules = Jetpack::get_available_modules(); Jetpack::update_active_modules($modules); WP_CLI::success(__('All modules activated!', 'jetpack')); break; case 'deactivate': $module = Jetpack::get_module($module_slug); Jetpack::log('deactivate', $module_slug); Jetpack::deactivate_module($module_slug); WP_CLI::success(sprintf(__('%s has been deactivated.', 'jetpack'), $module['name'])); break; case 'deactivate_all': Jetpack::delete_active_modules(); WP_CLI::success(__('All modules deactivated!', 'jetpack')); break; case 'toggle': // Will never happen, should have been handled above and changed to activate or deactivate. break; } }
function get_modules() { include_once JETPACK__PLUGIN_DIR . 'modules/module-info.php'; $available_modules = $this->jetpack->get_available_modules(); $active_modules = $this->jetpack->get_active_modules(); $modules = array(); $jetpack_active = Jetpack::is_active() || Jetpack::is_development_mode(); foreach ($available_modules as $module) { if ($module_array = $this->jetpack->get_module($module)) { $short_desc = apply_filters('jetpack_short_module_description', $module_array['description'], $module); // Fix: correct multibyte strings truncate with checking for mbstring extension $short_desc_trunc = function_exists('mb_strlen') ? mb_strlen($short_desc) > 143 ? mb_substr($short_desc, 0, 140) . '...' : $short_desc : (strlen($short_desc) > 143 ? substr($short_desc, 0, 140) . '...' : $short_desc); $module_array['module'] = $module; $module_array['activated'] = $jetpack_active ? in_array($module, $active_modules) : false; $module_array['deactivate_nonce'] = wp_create_nonce('jetpack_deactivate-' . $module); $module_array['activate_nonce'] = wp_create_nonce('jetpack_activate-' . $module); $module_array['available'] = self::is_module_available($module_array); $module_array['short_description'] = $short_desc_trunc; $module_array['configure_url'] = Jetpack::module_configuration_url($module); ob_start(); do_action('jetpack_learn_more_button_' . $module); $module_array['learn_more_button'] = ob_get_clean(); ob_start(); if (Jetpack::is_active() && has_action('jetpack_module_more_info_connected_' . $module)) { do_action('jetpack_module_more_info_connected_' . $module); } else { do_action('jetpack_module_more_info_' . $module); } /** * Filter the long description of a module. * * @since 3.5.0 * * @param string ob_get_clean() The module long description. * @param string $module The module name. */ $module_array['long_description'] = apply_filters('jetpack_long_module_description', ob_get_clean(), $module); ob_start(); /** * Filter the search terms for a module * * Search terms are be typically added to a module in module-info.php. * * Use syntax: * function jetpack_$module_search_terms( $terms ) { * $terms = _x( 'term 1, term 2', 'search terms', 'jetpack' ); * return $terms; * } * add_filter( 'jetpack_search_terms_$module', 'jetpack_$module_search_terms' ); * * @since 3.5.0 * @param string The search terms (comma separated) */ echo apply_filters('jetpack_search_terms_' . $module, ''); $module_array['search_terms'] = ob_get_clean(); $module_array['configurable'] = false; if (current_user_can('manage_options') && apply_filters('jetpack_module_configurable_' . $module, false)) { $module_array['configurable'] = sprintf('<a href="%1$s">%2$s</a>', esc_url(Jetpack::module_configuration_url($module)), __('Configure', 'jetpack')); } $modules[$module] = $module_array; } } uasort($modules, array($this->jetpack, 'sort_modules')); if (!Jetpack::is_active()) { uasort($modules, array(__CLASS__, 'sort_requires_connection_last')); } return $modules; }
function get_common_sync_data() { $available_modules = Jetpack::get_available_modules(); $active_modules = Jetpack::get_active_modules(); $modules = array(); foreach ($available_modules as $available_module) { $modules[$available_module] = in_array($available_module, $active_modules); } $modules['vaultpress'] = class_exists('VaultPress') || function_exists('vaultpress_contact_service'); $sync_data = array('modules' => $modules, 'version' => JETPACK__VERSION); return $sync_data; }
public function callback($path = '', $_blog_id = 0) { if (is_wp_error($error = $this->validate_call($_blog_id, 'jetpack_manage_modules', false))) { return $error; } $modules = Jetpack::get_available_modules(); $response = array(); $response['found'] = count($modules); foreach ($modules as $module_slug) { $response['modules'][] = self::format_module($module_slug); } return $response; }