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;
}