function fs_custom_status_init($statuses) { if (class_exists('Debug_Bar_Panel')) { if (FS_API__LOGGER_ON) { require_once dirname(__FILE__) . '/class-fs-debug-bar-panel.php'; $statuses[] = array('fs_api_requests', __fs('Freemius API'), Freemius_Debug_Bar_Panel::requests_count() . ' ' . __fs('Requests') . ' (' . Freemius_Debug_Bar_Panel::total_time() . ')'); } } return $statuses; }
static function total_time() { if (class_exists('Freemius_Api')) { $logger = Freemius_Api::GetLogger(); } else { $logger = array(); } $total_time = 0.0; foreach ($logger as $l) { $total_time += $l['total']; } return number_format(100 * $total_time, 2) . ' ' . __fs('ms'); }
function fs_message($message, $user_first_name, $plugin_title, $user_login, $site_link, $freemius_link) { return sprintf(__fs('hey-x') . '<br>' . __('Never miss an important update - Opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with freemius.com', 'pootle-page-builder'), $user_first_name, '<b>' . $plugin_title . '</b>', '<b>' . $user_login . '</b>', $site_link, $freemius_link); }
function showPanel(panelType) { $modal.find('.fs-modal-panel').removeClass('active '); $modal.find('[data-panel-id="' + panelType + '"]').addClass('active'); updateButtonLabels(); } function updateButtonLabels() { var $deactivateButton = $modal.find('.button-deactivate'); // Reset the deactivate button's text. if ('confirm' === getCurrentPanel()) { $deactivateButton.text('<?php printf(__fs('deactivation-modal-button-confirm', $slug)); ?> '); } else { $deactivateButton.text('<?php printf(__fs('skip-deactivate', $slug)); ?> '); } } function getCurrentPanel() { return $modal.find('.fs-modal-panel.active').attr('data-panel-id'); } })(jQuery); </script>
/** * Updates information on the "View version x.x details" page with custom data. * * @author Vova Feldman (@svovaf) * @since 1.0.4 * * @uses FS_Api * * @param object $data * @param string $action * @param mixed $args * * @return object */ function plugins_api_filter($data, $action = '', $args = null) { $this->_logger->entrance(); if ('plugin_information' !== $action || !isset($args->slug)) { return $data; } $addon = false; $is_addon = false; if ($this->_fs->get_slug() !== $args->slug) { $addon = $this->_fs->get_addon_by_slug($args->slug); if (!is_object($addon)) { return $data; } $is_addon = true; } $plugin_in_repo = false; if (!$is_addon) { // Try to fetch info from .org repository. $data = self::_fetch_plugin_info_from_repository($action, $args); $plugin_in_repo = false !== $data; } if (!$plugin_in_repo) { $data = $args; // Fetch as much as possible info from local files. $plugin_local_data = $this->_fs->get_plugin_data(); $data->name = $plugin_local_data['Name']; $data->author = $plugin_local_data['Author']; $data->sections = array('description' => 'Upgrade ' . $plugin_local_data['Name'] . ' to latest.'); // @todo Store extra plugin info on Freemius or parse readme.txt markup. /*$info = $this->_fs->get_api_site_scope()->call('/information.json'); if ( !isset($info->error) ) { $data = $info; }*/ } // Get plugin's newest update. $new_version = $this->_fs->_fetch_latest_version($is_addon ? $addon->id : false); if ($is_addon) { $data->name = $addon->title . ' ' . __fs('addon', $this->_fs->get_slug()); $data->slug = $addon->slug; $data->url = WP_FS__ADDRESS; $data->package = $new_version->url; } if (!$plugin_in_repo) { $data->last_updated = !is_null($new_version->updated) ? $new_version->updated : $new_version->created; $data->requires = $new_version->requires_platform_version; $data->tested = $new_version->tested_up_to_version; } $data->version = $new_version->version; $data->download_link = $new_version->url; return $data; }
?> <button class="button button-primary" tabindex="1" type="submit"><?php _efs($is_pending_activation ? 'resend-activation-email' : 'opt-in-connect', $slug); ?> </button> </form> <?php } ?> </div><?php // Set core permission list items. $permissions = array('profile' => array('icon-class' => 'dashicons dashicons-admin-users', 'label' => __fs('permissions-profile'), 'desc' => __fs('permissions-profile_desc'), 'priority' => 5), 'site' => array('icon-class' => 'dashicons dashicons-wordpress', 'label' => __fs('permissions-site'), 'desc' => __fs('permissions-site_desc'), 'priority' => 10), 'events' => array('icon-class' => 'dashicons dashicons-admin-plugins', 'label' => __fs('permissions-events'), 'desc' => __fs('permissions-events_desc'), 'priority' => 20)); // Add newsletter permissions if enabled. if ($fs->is_permission_requested('newsletter')) { $permissions['newsletter'] = array('icon-class' => 'dashicons dashicons-email-alt', 'label' => __fs('permissions-newsletter'), 'desc' => __fs('permissions-newsletter_desc'), 'priority' => 15); } // Allow filtering of the permissions list. $permissions = $fs->apply_filters('permission_list', $permissions); // Sort by priority. uasort($permissions, 'fs_sort_by_priority'); if (!empty($permissions)) { ?> <div class="fs-permissions"> <a class="fs-trigger" href="#"><?php _efs('what-permissions', $slug); ?> </a> <ul><?php foreach ($permissions as $id => $permission) { ?>
/** * Adds Upgrade and Add-Ons links to the main Plugins page link actions collection. * * @author Vova Feldman (@svovaf) * @since 1.0.0 */ function _add_upgrade_action_link() { $this->_logger->entrance(); if ($this->is_registered()) { if (!$this->is_paying() && $this->has_paid_plan()) { $this->add_plugin_action_link(__fs('upgrade', $this->_slug), $this->get_upgrade_url(), false, 20, 'upgrade'); } if ($this->_has_addons()) { $this->add_plugin_action_link(__fs('add-ons', $this->_slug), $this->_get_admin_page_url('addons'), false, WP_FS__DEFAULT_PRIORITY, 'addons'); } } }
echo $site->secret_key; ?> </td> </tr> <?php } ?> </tbody> </table> <?php } $addons = $VARS['addons']; foreach ($addons as $plugin_id => $plugin_addons) { ?> <h2><?php printf(__fs('addons-of-x'), $plugin_id); ?> </h2> <table id="fs_addons" class="widefat"> <thead> <tr> <th><?php _efs('id'); ?> </th> <th><?php _efs('title'); ?> </th> <th><?php _efs('slug');
/** * Display plugin information in dialog box form. * * @since 2.7.0 */ function fs_install_plugin_information() { global $tab; if (empty($_REQUEST['plugin'])) { return; } $args = array('slug' => wp_unslash($_REQUEST['plugin']), 'is_ssl' => is_ssl(), 'fields' => array('banners' => true, 'reviews' => true)); if (is_array($args)) { $args = (object) $args; } if (!isset($args->per_page)) { $args->per_page = 24; } if (!isset($args->locale)) { $args->locale = get_locale(); } $api = apply_filters('fs_plugins_api', false, 'plugin_information', $args); if (is_wp_error($api)) { wp_die($api); } $plugins_allowedtags = array('a' => array('href' => array(), 'title' => array(), 'target' => array(), 'class' => array()), 'style' => array(), 'abbr' => array('title' => array()), 'acronym' => array('title' => array()), 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), 'div' => array('class' => array()), 'span' => array('class' => array()), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array('class' => array()), 'i' => array('class' => array()), 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), 'img' => array('src' => array(), 'class' => array(), 'alt' => array())); $plugins_section_titles = array('description' => _x('Description', 'Plugin installer section title'), 'installation' => _x('Installation', 'Plugin installer section title'), 'faq' => _x('FAQ', 'Plugin installer section title'), 'screenshots' => _x('Screenshots', 'Plugin installer section title'), 'changelog' => _x('Changelog', 'Plugin installer section title'), 'reviews' => _x('Reviews', 'Plugin installer section title'), 'other_notes' => _x('Other Notes', 'Plugin installer section title')); // Sanitize HTML // foreach ( (array) $api->sections as $section_name => $content ) { // $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); // } foreach (array('version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug') as $key) { if (isset($api->{$key})) { $api->{$key} = wp_kses($api->{$key}, $plugins_allowedtags); } } // Add after $api->slug is ready. $plugins_section_titles['features'] = __fs('features-and-pricing', $api->slug); $_tab = esc_attr($tab); $section = isset($_REQUEST['section']) ? wp_unslash($_REQUEST['section']) : 'description'; // Default to the Description tab, Do not translate, API returns English. if (empty($section) || !isset($api->sections[$section])) { $section_titles = array_keys((array) $api->sections); $section = array_shift($section_titles); } iframe_header(__('Plugin Install')); $_with_banner = ''; // var_dump($api->banners); if (!empty($api->banners) && (!empty($api->banners['low']) || !empty($api->banners['high']))) { $_with_banner = 'with-banner'; $low = empty($api->banners['low']) ? $api->banners['high'] : $api->banners['low']; $high = empty($api->banners['high']) ? $api->banners['low'] : $api->banners['high']; ?> <style type="text/css"> #plugin-information-title.with-banner { background-image: url( <?php echo esc_url($low); ?> ); } @media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) { #plugin-information-title.with-banner { background-image: url( <?php echo esc_url($high); ?> ); } } </style> <?php } echo '<div id="plugin-information-scrollable">'; echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>"; echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n"; foreach ((array) $api->sections as $section_name => $content) { if ('reviews' === $section_name && (empty($api->ratings) || 0 === array_sum((array) $api->ratings))) { continue; } if (isset($plugins_section_titles[$section_name])) { $title = $plugins_section_titles[$section_name]; } else { $title = ucwords(str_replace('_', ' ', $section_name)); } $class = $section_name === $section ? ' class="current"' : ''; $href = add_query_arg(array('tab' => $tab, 'section' => $section_name)); $href = esc_url($href); $san_section = esc_attr($section_name); echo "\t<a name='{$san_section}' href='{$href}' {$class}>{$title}</a>\n"; } echo "</div>\n"; ?> <div id="<?php echo $_tab; ?> -content" class='<?php echo $_with_banner; ?> '> <div class="fyi"> <?php if (isset($api->plans)) { ?> <div class="plugin-information-pricing"> <?php foreach ($api->plans as $plan) { ?> <h3 data-plan="<?php echo $plan->id; ?> "><?php printf(__fs('x-plan', $api->slug), $plan->title); ?> </h3> <ul> <?php $billing_cycle = 'annual'; ?> <?php if (1 === count($plan->pricing) && 1 == $plan->pricing[0]->licenses) { ?> <?php $pricing = $plan->pricing[0]; ?> <li><label><?php _efs('price', $api->slug); ?> : $<?php if (isset($pricing->annual_price)) { echo $pricing->annual_price . ($plan->is_block_features ? ' / year' : ''); $billing_cycle = 'annual'; } else { if (isset($pricing->monthly_price)) { echo $pricing->monthly_price . ' / mo'; $billing_cycle = 'monthly'; } else { if (isset($pricing->lifetime_price)) { echo $pricing->lifetime_price; $billing_cycle = 'lifetime'; } } } ?> </label></li> <?php } else { ?> <?php $first = true; foreach ($plan->pricing as $pricing) { ?> <li><label><input name="pricing-<?php echo $plan->id; ?> " type="radio" value="<?php echo $pricing->id; ?> "<?php checked($first, true); ?> ><?php switch ($pricing->licenses) { case '1': _efs('license-single-site', $api->slug); break; case null: _efs('license-unlimited', $api->slug); break; default: printf(__fs('license-x-sites', $api->slug), $pricing->licenses); break; } ?> - $<?php if (isset($pricing->annual_price)) { echo $pricing->annual_price . ($plan->is_block_features ? ' / year' : ''); $billing_cycle = 'annual'; } else { if (isset($pricing->monthly_price)) { echo $pricing->monthly_price . ' / mo'; $billing_cycle = 'monthly'; } else { if (isset($pricing->lifetime_price)) { echo $pricing->lifetime_price; $billing_cycle = 'lifetime'; } } } ?> </label></li> <?php $first = false; } ?> <?php } ?> </ul> <?php echo ' <a class="button button-primary right" href="' . esc_url(add_query_arg(array('plugin_id' => $plan->plugin_id, 'plan_id' => $plan->id, 'pricing_id' => $plan->pricing[0]->id, 'billing_cycle' => $billing_cycle), $api->checkout_link)) . '" target="_parent">' . __fs('purchase', $api->slug) . '</a>'; ?> </div> <?php } ?> <?php wp_enqueue_script('jquery'); ?> <script type="text/javascript"> (function ($) { $('.plugin-information-pricing input[type=radio]').click(function () { var checkout_url = '<?php echo esc_url_raw(add_query_arg(array('plugin_id' => $plan->plugin_id, 'billing_cycle' => $billing_cycle), $api->checkout_link)); ?> &plan_id=' + $(this).parents('.plugin-information-pricing').find('h3').attr('data-plan') + '&pricing_id=' + $(this).val(); $('.plugin-information-pricing .button, #plugin-information-footer .button').attr('href', checkout_url); }); })(jQuery); </script> <?php } ?> <div> <h3><?php _efs('details', $api->slug); ?> </h3> <ul> <?php if (!empty($api->version)) { ?> <li><strong><?php _e('Version:'); ?> </strong> <?php echo $api->version; ?> </li> <?php } if (!empty($api->author)) { ?> <li> <strong><?php _e('Author:'); ?> </strong> <?php echo links_add_target($api->author, '_blank'); ?> </li> <?php } if (!empty($api->last_updated)) { ?> <li><strong><?php _e('Last Updated:'); ?> </strong> <span title="<?php echo $api->last_updated; ?> "> <?php printf(__('%s ago'), human_time_diff(strtotime($api->last_updated))); ?> </span></li> <?php } if (!empty($api->requires)) { ?> <li> <strong><?php _e('Requires WordPress Version:'); ?> </strong> <?php printf(__('%s or higher'), $api->requires); ?> </li> <?php } if (!empty($api->tested)) { ?> <li><strong><?php _e('Compatible up to:'); ?> </strong> <?php echo $api->tested; ?> </li> <?php } if (!empty($api->downloaded)) { ?> <li> <strong><?php _e('Downloaded:'); ?> </strong> <?php printf(_n('%s time', '%s times', $api->downloaded), number_format_i18n($api->downloaded)); ?> </li> <?php } if (!empty($api->slug) && empty($api->external)) { ?> <li><a target="_blank" href="https://wordpress.org/plugins/<?php echo $api->slug; ?> /"><?php _e('WordPress.org Plugin Page »'); ?> </a> </li> <?php } if (!empty($api->homepage)) { ?> <li><a target="_blank" href="<?php echo esc_url($api->homepage); ?> "><?php _e('Plugin Homepage »'); ?> </a> </li> <?php } if (!empty($api->donate_link) && empty($api->contributors)) { ?> <li><a target="_blank" href="<?php echo esc_url($api->donate_link); ?> "><?php _e('Donate to this plugin »'); ?> </a> </li> <?php } ?> </ul> </div> <?php if (!empty($api->rating)) { ?> <h3><?php _e('Average Rating'); ?> </h3> <?php wp_star_rating(array('rating' => $api->rating, 'type' => 'percent', 'number' => $api->num_ratings)); ?> <small><?php printf(_n('(based on %s rating)', '(based on %s ratings)', $api->num_ratings), number_format_i18n($api->num_ratings)); ?> </small> <?php } if (!empty($api->ratings) && array_sum((array) $api->ratings) > 0) { foreach ($api->ratings as $key => $ratecount) { // Avoid div-by-zero. $_rating = $api->num_ratings ? $ratecount / $api->num_ratings : 0; ?> <div class="counter-container"> <span class="counter-label"><a href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?> ?filter=<?php echo $key; ?> " target="_blank" title="<?php echo esc_attr(sprintf(_n('Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $key), $key)); ?> "><?php printf(_n('%d star', '%d stars', $key), $key); ?> </a></span> <span class="counter-back"> <span class="counter-bar" style="width: <?php echo 92 * $_rating; ?> px;"></span> </span> <span class="counter-count"><?php echo number_format_i18n($ratecount); ?> </span> </div> <?php } } if (!empty($api->contributors)) { ?> <h3><?php _e('Contributors'); ?> </h3> <ul class="contributors"> <?php foreach ((array) $api->contributors as $contrib_username => $contrib_profile) { if (empty($contrib_username) && empty($contrib_profile)) { continue; } if (empty($contrib_username)) { $contrib_username = preg_replace('/^.+\\/(.+)\\/?$/', '\\1', $contrib_profile); } $contrib_username = sanitize_user($contrib_username); if (empty($contrib_profile)) { echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</li>"; } else { echo "<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</a></li>"; } } ?> </ul> <?php if (!empty($api->donate_link)) { ?> <a target="_blank" href="<?php echo esc_url($api->donate_link); ?> "><?php _e('Donate to this plugin »'); ?> </a> <?php } ?> <?php } ?> </div> <div id="section-holder" class="wrap"> <?php if (!empty($api->tested) && version_compare(substr($GLOBALS['wp_version'], 0, strlen($api->tested)), $api->tested, '>')) { echo '<div class="notice notice-warning"><p>' . '<strong>' . __('Warning:') . '</strong> ' . __('This plugin has not been tested with your current version of WordPress.') . '</p></div>'; } else { if (!empty($api->requires) && version_compare(substr($GLOBALS['wp_version'], 0, strlen($api->requires)), $api->requires, '<')) { echo '<div class="notice notice-warning"><p>' . '<strong>' . __('Warning:') . '</strong> ' . __('This plugin has not been marked as compatible with your version of WordPress.') . '</p></div>'; } } foreach ((array) $api->sections as $section_name => $content) { $content = links_add_base_url($content, 'https://wordpress.org/plugins/' . $api->slug . '/'); $content = links_add_target($content, '_blank'); $san_section = esc_attr($section_name); $display = $section_name === $section ? 'block' : 'none'; echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n"; echo $content; echo "\t</div>\n"; } echo "</div>\n"; echo "</div>\n"; echo "</div>\n"; // #plugin-information-scrollable echo "<div id='{$tab}-footer'>\n"; if (current_user_can('install_plugins') || current_user_can('update_plugins')) { if (!empty($api->checkout_link) && isset($api->plans) && 0 < is_array($api->plans)) { echo ' <a class="button button-primary right" href="' . esc_url(add_query_arg(array('plugin_id' => $plan->plugin_id, 'plan_id' => $plan->id, 'pricing_id' => $plan->pricing[0]->id, 'billing_cycle' => $billing_cycle), $api->checkout_link)) . '" target="_parent">' . __fs('purchase', $api->slug) . '</a>'; // @todo Add Cart concept. // echo ' <a class="button right" href="' . $status['url'] . '" target="_parent">' . __( 'Add to Cart' ) . '</a>'; } else { if (!empty($api->download_link)) { $status = install_plugin_install_status($api); switch ($status['status']) { case 'install': if ($status['url']) { echo '<a class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __('Install Now') . '</a>'; } break; case 'update_available': if ($status['url']) { echo '<a class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __('Install Update Now') . '</a>'; } break; case 'newer_installed': echo '<a class="button button-primary right disabled">' . sprintf(__('Newer Version (%s) Installed'), $status['version']) . '</a>'; break; case 'latest_installed': echo '<a class="button button-primary right disabled">' . __('Latest Version Installed') . '</a>'; break; } } } } echo "</div>\n"; iframe_footer(); exit; }
echo $slug; ?> /assets/icon-256x256.jpg" type="image/png"> <img src="//wimg.freemius.com/plugin-icon.png"/> </object> </object> </object> </object> </div> <i class="dashicons dashicons-plus fs-second"></i> <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/> </div> <div class="fs-content"> <p><?php echo $fs->apply_filters('pending_activation_message', sprintf(__fs('thanks-x', $slug) . '<br>' . __fs('pending-activation-message', $slug), $first_name, '<b>' . $fs->get_plugin_name() . '</b>', '<b>' . $current_user->user_email . '</b>')); ?> </p> </div> <div class="fs-actions"> <?php $fs_user = Freemius::_get_user_by_email($current_user->user_email); ?> <form method="post" action="<?php echo WP_FS__ADDRESS; ?> /action/service/user/install/"> <?php $params = array('user_firstname' => $current_user->user_firstname, 'user_lastname' => $current_user->user_lastname, 'user_nickname' => $current_user->user_nicename, 'user_email' => $current_user->user_email, 'plugin_slug' => $slug, 'plugin_id' => $fs->get_id(), 'plugin_public_key' => $fs->get_public_key(), 'plugin_version' => $fs->get_plugin_version(), 'return_url' => wp_nonce_url($fs->_get_admin_page_url('', array('fs_action' => $slug . '_activate_new')), $slug . '_activate_new'), 'account_url' => wp_nonce_url($fs->_get_admin_page_url('account', array('fs_action' => 'sync_user')), 'sync_user'), 'site_url' => get_site_url(), 'site_name' => get_bloginfo('name'), 'platform_version' => get_bloginfo('version'), 'language' => get_bloginfo('language'), 'charset' => get_bloginfo('charset')); ?> <?php
<div class="fs-content"> <p><?php $filter = 'connect_message'; $default_optin_message = 'connect-message'; if ($fs->is_plugin_update()) { // If Freemius was added on a plugin update, set different // opt-in message. $default_optin_message = 'connect-message_on-update'; // If user customized the opt-in message on update, use // that message. Otherwise, fallback to regular opt-in // custom message if exist. if ($fs->has_filter('connect_message_on_update')) { $filter = 'connect_message_on_update'; } } echo $fs->apply_filters($filter, sprintf(__fs('hey-x', $slug) . '<br>' . __fs($default_optin_message, $slug), $first_name, '<b>' . $fs->get_plugin_name() . '</b>', '<b>' . $current_user->user_login . '</b>', '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>', '<a href="' . $freemius_site_url . '" target="_blank">freemius.com</a>'), $first_name, $fs->get_plugin_name(), $current_user->user_login, '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>', '<a href="' . $freemius_site_url . '" target="_blank">freemius.com</a>'); ?> </p> </div> <div class="fs-actions"> <?php if ($fs->enable_anonymous()) { ?> <a href="<?php echo wp_nonce_url($fs->_get_admin_page_url('', array('fs_action' => $slug . '_skip_activation')), $slug . '_skip_activation'); ?> " class="button button-secondary" tabindex="2"><?php _efs('skip', $slug); ?> </a>
if (!empty($plan->support_email) || !empty($plan->support_skype) || !empty($plan->support_phone) || true === $plan->is_success_manager) { if (!isset($features_plan_map['support'])) { $support_feature = new stdClass(); $support_feature->id = 'support'; $support_feature->title = __fs('Support', $plugin->slug); $features_plan_map[$support_feature->id] = array('feature' => $support_feature, 'plans' => array()); } else { $support_feature = $features_plan_map['support']; } $features_plan_map[$support_feature->id]['plans'][$plan->id] = $support_feature; } } // Add updates as a feature for all plans. $updates_feature = new stdClass(); $updates_feature->id = 'updates'; $updates_feature->title = __fs('unlimited-updates', $plugin->slug); $features_plan_map[$updates_feature->id] = array('feature' => $updates_feature, 'plans' => array()); foreach ($plans as $plan) { $features_plan_map[$updates_feature->id]['plans'][$plan->id] = $updates_feature; } ?> <div class="fs-features"> <table> <thead> <tr> <th></th> <?php foreach ($plans as $plan) { ?> <th> <?php
function showPanel(panelType) { $modal.find('.fs-modal-panel').removeClass('active '); $modal.find('[data-panel-id="' + panelType + '"]').addClass('active'); updateButtonLabels(); } function updateButtonLabels() { var $deactivateButton = $modal.find('.button-deactivate'); // Reset the deactivate button's text. if ('confirm' === getCurrentPanel()) { $deactivateButton.text('<?php printf(__fs('deactivation-modal-button-confirm', $slug)); ?> '); } else { $deactivateButton.text('<?php printf(__fs('deactivate', $slug)); ?> '); } } function getCurrentPanel() { return $modal.find('.fs-modal-panel.active').attr('data-panel-id'); } })(jQuery); </script>
// Add newsletter permissions if enabled. if ($fs->is_permission_requested('newsletter')) { $permissions['newsletter'] = array('icon-class' => 'dashicons dashicons-email-alt', 'label' => __fs('permissions-newsletter'), 'desc' => __fs('permissions-newsletter_desc'), 'priority' => 15); } // Allow filtering of the permissions list. $permissions = $fs->apply_filters('permission_list', $permissions); // Sort by priority. uasort($permissions, 'fs_sort_by_priority'); if (!empty($permissions)) { ?> <div class="fs-permissions"> <?php if ($require_license_key) { ?> <p class="fs-license-sync-disclaimer"><?php printf(__fs('license-sync-disclaimer', $slug), $freemius_link); ?> </p> <?php } ?> <a class="fs-trigger" href="#" tabindex="1"><?php _efs('what-permissions', $slug); ?> </a> <ul><?php foreach ($permissions as $id => $permission) { ?> <li id="fs-permission-<?php esc_attr_e($id); ?>
$screenshots = $VARS['screenshots']; ?> <ol> <?php $i = 0; foreach ($screenshots as $s => $url) { ?> <?php // Relative URLs are replaced with WordPress.org base URL // therefore we need to set absolute URLs. $url = 'http' . (WP_FS__IS_HTTPS ? 's' : '') . ':' . $url; ?> <li> <a href="<?php echo $url; ?> " title="<?php printf(__fs('view-full-size-x'), $i); ?> "><img src="<?php echo $url; ?> "></a> </li> <?php $i++; } ?> </ol>
function nf_fs_custom_message($message, $user_first_name, $plugin_title, $user_login, $site_link, $freemius_link) { return sprintf(__fs('hey-x') . '<br>' . __('Please help us improve %2$s! If you opt-in, some data about your installation of %2$s will be sent to %5$s (this does NOT include your submissions). If you skip this, that\'s okay! %2$s will still work just fine.', 'ninja-forms'), $user_first_name, '<b>' . $plugin_title . '</b>', '<b>' . $user_login . '</b>', $site_link, $freemius_link); }
/** * Leverage backtrace to find caller plugin main file path. * * @author Vova Feldman (@svovaf) * @since 1.0.6 * * @return string */ function fs_find_caller_plugin_file() { /** * All the code below will be executed once on activation. * If the user changes the main plugin's file name, the file_exists() * will catch it. */ if (!function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); $all_plugins_paths = array(); // Get active plugin's main files real full names (might be symlinks). foreach ($all_plugins as $relative_path => &$data) { $all_plugins_paths[] = fs_normalize_path(realpath(WP_PLUGIN_DIR . '/' . $relative_path)); } $plugin_file = null; for ($i = 1, $bt = debug_backtrace(), $len = count($bt); $i < $len; $i++) { if (in_array(fs_normalize_path($bt[$i]['file']), $all_plugins_paths)) { $plugin_file = $bt[$i]['file']; break; } } if (is_null($plugin_file)) { // Throw an error to the developer in case of some edge case dev environment. wp_die(__fs('failed-finding-main-path'), __fs('error'), array('back_link' => true)); } return $plugin_file; }
echo $log['function']; ?> </code></b></td> <td> <?php printf('<a href="#" style="color: darkorange !important;" onclick="jQuery(this).parent().find(\'div\').toggle(); return false;"><nobr>%s</nobr></a>', substr($log['msg'], 0, 32) . (32 < strlen($log['msg']) ? '...' : '')); ?> <div style="display: none;"> <b style="color: darkorange;"><?php echo $log['msg']; ?> </b> </div> </td> <td><?php if (isset($log['file'])) { echo substr($log['file'], $log['logger']->get_file()) . ':' . $log['line'] . ')'; } ?> </td> <td><?php echo number_format(100 * ($log['timestamp'] - WP_FS__SCRIPT_START_TIME), 2) . ' ' . __fs('ms'); ?> </td> </tr> <?php $i++; } ?> </tbody> </table>
<div class="fs-inner"> <ul> <li class="fs-card-banner" style="background-image: url('<?php echo $addon->info->card_banner_url; ?> ');"></li> <!-- <li class="fs-tag"></li>--> <li class="fs-title"><?php echo $addon->title; ?> </li> <li class="fs-offer"> <span class="fs-price"><?php echo 0 == $price ? __fs('free', $slug) : '$' . number_format($price, 2) . ($plan->has_trial() ? ' - ' . __fs('trial', $slug) : ''); ?> </span> </li> <li class="fs-description"><?php echo !empty($addon->info->short_description) ? $addon->info->short_description : 'SHORT DESCRIPTION'; ?> </li> <li class="fs-cta"><a class="button"><?php _efs('view-details', $slug); ?> </a></li> </ul> </div> </li> <?php
} ?> "> <div class="fs-visual"> <b class="fs-site-icon"><i class="dashicons dashicons-wordpress"></i></b> <i class="dashicons dashicons-plus fs-first"></i> <?php $vars = array('slug' => $slug); fs_require_once_template('plugin-icon.php', $vars); ?> <i class="dashicons dashicons-plus fs-second"></i> <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/> </div> <div class="fs-content"> <p><?php echo $fs->apply_filters('connect_message', sprintf(__fs('hey-x') . '<br>' . __fs('connect-message'), $first_name, '<b>' . $fs->get_plugin_name() . '</b>', '<b>' . $current_user->user_login . '</b>', '<a href="' . get_site_url() . '" target="_blank">' . $site_url . '</a>', '<a href="https://freemius.com/wordpress/" target="_blank">freemius.com</a>')); ?> </p> </div> <div class="fs-actions"> <?php if ($fs->enable_anonymous()) { ?> <a href="<?php echo wp_nonce_url($fs->_get_admin_page_url('', array('fs_action' => $slug . '_skip_activation')), $slug . '_skip_activation'); ?> " class="button button-secondary" tabindex="2"><?php _efs('skip'); ?> </a>
?> <div class="fs-inner"> <ul> <li class="fs-card-banner" style="background-image: url('<?php echo $addon->info->card_banner_url; ?> ');"></li> <li class="fs-title"><?php echo $addon->title; ?> </li> <li class="fs-offer"> <span class="fs-price"><?php echo 0 == $price ? __fs('free', $slug) : '$' . number_format($price, 2); ?> </span> </li> <li class="fs-description"><?php echo !empty($addon->info->short_description) ? $addon->info->short_description : 'SHORT DESCRIPTION'; ?> </li> </ul> </div> </li> <?php } ?> </ul> <?php
#section-description .fs-screenshots <?php echo ".fs-screenshot-{$i}"; ?> { background-image: url('<?php echo $url; ?> '); } </style> <a href="<?php echo $url; ?> " title="<?php printf(__fs('view-full-size-x', $plugin->slug), $i); ?> " class="fs-screenshot-<?php echo $i; ?> "></a> </li> <?php $i++; } ?> </ul> </div> <?php }
if (WP_FS__SCRIPT_START_TIME < $cron['last']) { printf(__fs('in-x'), $human_diff); } else { printf(__fs('x-ago'), $human_diff); } // echo ' ' . $cron['last']; } ?> </td> <td><?php if (is_numeric($cron['next'])) { $diff = abs(WP_FS__SCRIPT_START_TIME - $cron['next']); $human_diff = $diff < MINUTE_IN_SECONDS ? $diff . ' ' . __fs('sec') : human_time_diff(WP_FS__SCRIPT_START_TIME, $cron['next']); if (WP_FS__SCRIPT_START_TIME < $cron['next']) { printf(__fs('in-x'), $human_diff); } else { printf(__fs('x-ago'), $human_diff); } } ?> </td> </tr> <?php } ?> <?php } ?> </tbody> </table>
*/ $after_license_activation_url = $fs->get_account_url(); } $cant_find_license_key_text = __fs('cant-find-license-key', $slug); $message_above_input_field = __fs('activate-license-message', $slug); $message_below_input_field = ''; $header_title = __fs($fs->is_free_plan() ? 'activate-license' : 'update-license', $slug); if ($fs->is_registered()) { $activate_button_text = $header_title; } else { $freemius_site_url = $fs->has_paid_plan() ? 'https://freemius.com/wordpress/' : 'https://freemius.com/wordpress/usage-tracking/'; $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="0">freemius.com</a>'; $message_below_input_field = sprintf(__fs('license-sync-disclaimer', $slug), $freemius_link); $activate_button_text = __fs('agree-activate-license', $slug); } $license_key_text = __fs('license-key', $slug); $modal_content_html = <<<HTML \t<div class="notice notice-error inline license-activation-message"><p></p></div> \t<p>{$message_above_input_field}</p> \t<input class="license_key" type="text" placeholder="{$license_key_text}" tabindex="1" /> \t<a class="show-license-resend-modal show-license-resend-modal-{$slug}" href="!#" tabindex="2">{$cant_find_license_key_text}</a> \t<p>{$message_below_input_field}</p> HTML; fs_enqueue_local_style('dialog-boxes', '/admin/dialog-boxes.css'); ?> <script type="text/javascript"> (function( $ ) { $( document ).ready(function() { var modalContentHtml = <?php echo json_encode($modal_content_html); ?>
<div id="fs_connect" class="wrap<?php if (!$fs->enable_anonymous()) { echo ' fs-anonymous-disabled'; } ?> " style="width: 75%;" > <div class="fs-content"> <p><?php echo $fs->apply_filters('connect_message', sprintf(__fs('cfc_welcome') . '</br></br>' . __fs('cfc_connect_allow') . '</br></br>' . __fs('cfc_connect_customize') . '</br></br>', $first_name, '<b>' . $fs->get_plugin_name() . '</b>', '<a href="' . get_site_url() . '" target="_blank">' . $site_url . '</a>')); ?> </p> </div> <div class="fs-actions"> <?php if ($fs->enable_anonymous()) { ?> <a href="<?php echo wp_nonce_url($fs->_get_admin_page_url('', array('fs_action' => $slug . '_skip_activation')), $slug . '_skip_activation'); ?> " class="button button-secondary" tabindex="2"><?php _efs('skip'); ?> </a>
function showPanel( panelType ) { $modal.find( '.fs-modal-panel' ).removeClass( 'active '); $modal.find( '[data-panel-id="' + panelType + '"]' ).addClass( 'active' ); updateButtonLabels(); } function updateButtonLabels() { var $deactivateButton = $modal.find( '.button-deactivate' ); // Reset the deactivate button's text. if ( 'confirm' === getCurrentPanel() ) { $deactivateButton.text( '<?php printf(__fs('deactivation-modal-button-confirm')); ?> ' ); } else { $deactivateButton.text( '<?php printf(__fs('deactivation-modal-button-deactivate')); ?> ' ); } } function getCurrentPanel() { return $modal.find( '.fs-modal-panel.active' ).attr( 'data-panel-id' ); } })( jQuery ); </script>
?> <?php } ?> </td> <?php } ?> <?php if (defined('WP_FS__DEV_MODE') && WP_FS__DEV_MODE) { ?> <td> <!-- Optional Delete Action --> <?php if ($is_addon_activated) { fs_ui_action_button($slug, 'account', 'delete_account', __fs('delete', $slug), array('plugin_id' => $addon_id), false); } ?> </td> <?php } ?> </tr> <?php $odd = !$odd; } ?> </tbody> </table> </div> </div>
/** * Display plugin information in dialog box form. * * Based on core install_plugin_information() function. * * @author Vova Feldman (@svovaf) * @since 1.0.6 */ function install_plugin_information() { global $tab; if (empty($_REQUEST['plugin'])) { return; } $args = array('slug' => wp_unslash($_REQUEST['plugin']), 'is_ssl' => is_ssl(), 'fields' => array('banners' => true, 'reviews' => true, 'downloaded' => false, 'active_installs' => true)); if (is_array($args)) { $args = (object) $args; } if (!isset($args->per_page)) { $args->per_page = 24; } if (!isset($args->locale)) { $args->locale = get_locale(); } $api = apply_filters('fs_plugins_api', false, 'plugin_information', $args); if (is_wp_error($api)) { wp_die($api); } $plugins_allowedtags = array('a' => array('href' => array(), 'title' => array(), 'target' => array(), 'class' => array()), 'style' => array(), 'abbr' => array('title' => array()), 'acronym' => array('title' => array()), 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), 'div' => array('class' => array()), 'span' => array('class' => array()), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array('class' => array()), 'i' => array('class' => array()), 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), 'img' => array('src' => array(), 'class' => array(), 'alt' => array())); $plugins_section_titles = array('description' => _x('Description', 'Plugin installer section title'), 'installation' => _x('Installation', 'Plugin installer section title'), 'faq' => _x('FAQ', 'Plugin installer section title'), 'screenshots' => _x('Screenshots', 'Plugin installer section title'), 'changelog' => _x('Changelog', 'Plugin installer section title'), 'reviews' => _x('Reviews', 'Plugin installer section title'), 'other_notes' => _x('Other Notes', 'Plugin installer section title')); // Sanitize HTML // foreach ( (array) $api->sections as $section_name => $content ) { // $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); // } foreach (array('version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug') as $key) { if (isset($api->{$key})) { $api->{$key} = wp_kses($api->{$key}, $plugins_allowedtags); } } // Add after $api->slug is ready. $plugins_section_titles['features'] = __fs('features-and-pricing', $api->slug); $_tab = esc_attr($tab); $section = isset($_REQUEST['section']) ? wp_unslash($_REQUEST['section']) : 'description'; // Default to the Description tab, Do not translate, API returns English. if (empty($section) || !isset($api->sections[$section])) { $section_titles = array_keys((array) $api->sections); $section = array_shift($section_titles); } iframe_header(__('Plugin Install')); $_with_banner = ''; // var_dump($api->banners); if (!empty($api->banners) && (!empty($api->banners['low']) || !empty($api->banners['high']))) { $_with_banner = 'with-banner'; $low = empty($api->banners['low']) ? $api->banners['high'] : $api->banners['low']; $high = empty($api->banners['high']) ? $api->banners['low'] : $api->banners['high']; ?> <style type="text/css"> #plugin-information-title.with-banner { background-image: url( <?php echo esc_url($low); ?> ); } @media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) { #plugin-information-title.with-banner { background-image: url( <?php echo esc_url($high); ?> ); } } </style> <?php } echo '<div id="plugin-information-scrollable">'; echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>"; echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n"; foreach ((array) $api->sections as $section_name => $content) { if ('reviews' === $section_name && (empty($api->ratings) || 0 === array_sum((array) $api->ratings))) { continue; } if (isset($plugins_section_titles[$section_name])) { $title = $plugins_section_titles[$section_name]; } else { $title = ucwords(str_replace('_', ' ', $section_name)); } $class = $section_name === $section ? ' class="current"' : ''; $href = add_query_arg(array('tab' => $tab, 'section' => $section_name)); $href = esc_url($href); $san_section = esc_attr($section_name); echo "\t<a name='{$san_section}' href='{$href}' {$class}>{$title}</a>\n"; } echo "</div>\n"; ?> <div id="<?php echo $_tab; ?> -content" class='<?php echo $_with_banner; ?> '> <div class="fyi"> <?php if ($api->is_paid) { ?> <?php if (isset($api->plans)) { ?> <div class="plugin-information-pricing"> <?php foreach ($api->plans as $plan) { ?> <?php /** * @var FS_Plugin_Plan $plan */ ?> <?php $first_pricing = $plan->pricing[0]; ?> <?php $is_multi_cycle = $first_pricing->is_multi_cycle(); ?> <div class="fs-plan<?php if (!$is_multi_cycle) { echo ' fs-single-cycle'; } ?> " data-plan-id="<?php echo $plan->id; ?> "> <h3 data-plan="<?php echo $plan->id; ?> "><?php printf(__fs('x-plan', $api->slug), $plan->title); ?> </h3> <?php $has_annual = $first_pricing->has_annual(); ?> <?php $has_monthly = $first_pricing->has_monthly(); ?> <div class="nav-tab-wrapper"> <?php $billing_cycles = array('monthly', 'annual', 'lifetime'); ?> <?php $i = 0; foreach ($billing_cycles as $cycle) { ?> <?php $prop = "{$cycle}_price"; if (isset($first_pricing->{$prop})) { ?> <?php $is_featured = 'annual' === $cycle && $is_multi_cycle; ?> <?php $prices = array(); foreach ($plan->pricing as $pricing) { if (isset($pricing->{$prop})) { $prices[] = array('id' => $pricing->id, 'licenses' => $pricing->licenses, 'price' => $pricing->{$prop}); } } ?> <a class="nav-tab" data-billing-cycle="<?php echo $cycle; ?> " data-pricing="<?php esc_attr_e(json_encode($prices)); ?> "> <?php if ($is_featured) { ?> <label>★ <?php _efs('best', $api->slug); ?> ★</label> <?php } ?> <?php _efs($cycle, $api->slug); ?> </a> <?php } ?> <?php $i++; } ?> <?php wp_enqueue_script('jquery'); ?> <script type="text/javascript"> (function ($, undef) { var _formatBillingFrequency = function (cycle) { switch (cycle) { case 'monthly': return '<?php printf(__fs('billed-x', $api->slug), __fs('monthly', $api->slug)); ?> '; case 'annual': return '<?php printf(__fs('billed-x', $api->slug), __fs('annually', $api->slug)); ?> '; case 'lifetime': return '<?php printf(__fs('billed-x', $api->slug), __fs('once', $api->slug)); ?> '; } }, _formatLicensesTitle = function (pricing) { switch (pricing.licenses) { case 1: return '<?php _efs('license-single-site', $api->slug); ?> '; case null: return '<?php _efs('license-unlimited', $api->slug); ?> '; default: return '<?php _efs('license-x-sites', $api->slug); ?> '.replace('%s', pricing.licenses); } }, _formatPrice = function (pricing, cycle, multipleLicenses) { if (undef === multipleLicenses) multipleLicenses = true; var priceCycle; switch (cycle) { case 'monthly': priceCycle = ' / <?php _efs('mo', $api->slug); ?> '; break; case 'lifetime': priceCycle = ''; break; case 'annual': default: priceCycle = ' / <?php _efs('year', $api->slug); ?> '; break; } if (!multipleLicenses && 1 == pricing.licenses) { return '$' + pricing.price + priceCycle; } return _formatLicensesTitle(pricing) + ' - <var class="fs-price">$' + pricing.price + priceCycle + '</var>'; }, _checkoutUrl = function (plan, pricing, cycle) { return '<?php echo esc_url_raw(remove_query_arg('billing_cycle', add_query_arg(array('plugin_id' => $plan->plugin_id), $api->checkout_link))); ?> ' + '&plan_id=' + plan + '&pricing_id=' + pricing + '&billing_cycle=' + cycle<?php if ($plan->has_trial()) { echo " + '&trial=true'"; } ?> ; }, _updateCtaUrl = function (plan, pricing, cycle) { $('.plugin-information-pricing .button, #plugin-information-footer .button').attr('href', _checkoutUrl(plan, pricing, cycle)); }; $(document).ready(function () { var $plan = $('.plugin-information-pricing .fs-plan[data-plan-id=<?php echo $plan->id; ?> ]'); $plan.find('input[type=radio]').live('click', function () { _updateCtaUrl( $plan.attr('data-plan-id'), $(this).val(), $plan.find('.nav-tab-active').attr('data-billing-cycle') ); $plan.find('.fs-trial-terms .fs-price').html( $(this).parents('label').find('.fs-price').html() ); }); $plan.find('.nav-tab').click(function () { if ($(this).hasClass('nav-tab-active')) return; var $this = $(this), billingCycle = $this.attr('data-billing-cycle'), pricing = JSON.parse($this.attr('data-pricing')), $pricesList = $this.parents('.fs-plan').find('.fs-pricing-body .fs-licenses'), html = ''; // Un-select previously selected tab. $plan.find('.nav-tab').removeClass('nav-tab-active'); // Select current tab. $this.addClass('nav-tab-active'); // Render licenses prices. if (1 == pricing.length) { html = '<li><label><?php _efs('price', $api->slug); ?> : ' + _formatPrice(pricing[0], billingCycle, false) + '</label></li>'; } else { for (var i = 0; i < pricing.length; i++) { html += '<li><label><input name="pricing-<?php echo $plan->id; ?> " type="radio" value="' + pricing[i].id + '">' + _formatPrice(pricing[i], billingCycle) + '</label></li>'; } } $pricesList.html(html); if (1 < pricing.length) { // Select first license option. $pricesList.find('li:first input').click(); } else { _updateCtaUrl( $plan.attr('data-plan-id'), pricing[0].id, billingCycle ); } // Update billing frequency. $plan.find('.fs-billing-frequency').html(_formatBillingFrequency(billingCycle)); if ('annual' === billingCycle) { $plan.find('.fs-annual-discount').show(); } else { $plan.find('.fs-annual-discount').hide(); } }); <?php if ($has_annual) { ?> // Select annual by default. $plan.find('.nav-tab[data-billing-cycle=annual]').click(); <?php } else { ?> // Select first tab. $plan.find('.nav-tab:first').click(); <?php } ?> }); }(jQuery)); </script> </div> <div class="fs-pricing-body"> <span class="fs-billing-frequency"></span> <?php $annual_discount = $has_annual && $has_monthly ? $plan->pricing[0]->annual_discount_percentage() : 0; ?> <?php if ($annual_discount > 0) { ?> <span class="fs-annual-discount"><?php printf(__fs('save-x', $api->slug), $annual_discount . '%'); ?> </span> <?php } ?> <ul class="fs-licenses"> </ul> <?php echo $this->get_plugin_cta($api, $plan); ?> <div style="clear:both"></div> <?php if ($plan->has_trial()) { ?> <?php $trial_period = $this->get_trial_period($plan); ?> <ul class="fs-trial-terms"> <li> <i class="dashicons dashicons-yes"></i><?php printf(__fs('no-commitment-x', $api->slug), $trial_period); ?> </li> <li> <i class="dashicons dashicons-yes"></i><?php printf(__fs('after-x-pay-as-little-y', $api->slug), $trial_period, '<var class="fs-price">' . $this->get_price_tag($plan, $plan->pricing[0]) . '</var>'); ?> </li> </ul> <?php } ?> </div> </div> </div> <?php } ?> <?php } ?> <?php } ?> <div> <h3><?php _efs('details', $api->slug); ?> </h3> <ul> <?php if (!empty($api->version)) { ?> <li><strong><?php _e('Version:'); ?> </strong> <?php echo $api->version; ?> </li> <?php } if (!empty($api->author)) { ?> <li> <strong><?php _e('Author:'); ?> </strong> <?php echo links_add_target($api->author, '_blank'); ?> </li> <?php } if (!empty($api->last_updated)) { ?> <li><strong><?php _e('Last Updated:'); ?> </strong> <span title="<?php echo $api->last_updated; ?> "> <?php printf(__('%s ago'), human_time_diff(strtotime($api->last_updated))); ?> </span></li> <?php } if (!empty($api->requires)) { ?> <li> <strong><?php _e('Requires WordPress Version:'); ?> </strong> <?php printf(__('%s or higher'), $api->requires); ?> </li> <?php } if (!empty($api->tested)) { ?> <li><strong><?php _e('Compatible up to:'); ?> </strong> <?php echo $api->tested; ?> </li> <?php } if (!empty($api->downloaded)) { ?> <li> <strong><?php _e('Downloaded:'); ?> </strong> <?php printf(_n('%s time', '%s times', $api->downloaded), number_format_i18n($api->downloaded)); ?> </li> <?php } if (!empty($api->slug) && empty($api->external)) { ?> <li><a target="_blank" href="https://wordpress.org/plugins/<?php echo $api->slug; ?> /"><?php _e('WordPress.org Plugin Page »'); ?> </a> </li> <?php } if (!empty($api->homepage)) { ?> <li><a target="_blank" href="<?php echo esc_url($api->homepage); ?> "><?php _e('Plugin Homepage »'); ?> </a> </li> <?php } if (!empty($api->donate_link) && empty($api->contributors)) { ?> <li><a target="_blank" href="<?php echo esc_url($api->donate_link); ?> "><?php _e('Donate to this plugin »'); ?> </a> </li> <?php } ?> </ul> </div> <?php if (!empty($api->rating)) { ?> <h3><?php _e('Average Rating'); ?> </h3> <?php wp_star_rating(array('rating' => $api->rating, 'type' => 'percent', 'number' => $api->num_ratings)); ?> <small><?php printf(_n('(based on %s rating)', '(based on %s ratings)', $api->num_ratings), number_format_i18n($api->num_ratings)); ?> </small> <?php } if (!empty($api->ratings) && array_sum((array) $api->ratings) > 0) { foreach ($api->ratings as $key => $ratecount) { // Avoid div-by-zero. $_rating = $api->num_ratings ? $ratecount / $api->num_ratings : 0; ?> <div class="counter-container"> <span class="counter-label"><a href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?> ?filter=<?php echo $key; ?> " target="_blank" title="<?php echo esc_attr(sprintf(_n('Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $key), $key)); ?> "><?php printf(_n('%d star', '%d stars', $key), $key); ?> </a></span> <span class="counter-back"> <span class="counter-bar" style="width: <?php echo 92 * $_rating; ?> px;"></span> </span> <span class="counter-count"><?php echo number_format_i18n($ratecount); ?> </span> </div> <?php } } if (!empty($api->contributors)) { ?> <h3><?php _e('Contributors'); ?> </h3> <ul class="contributors"> <?php foreach ((array) $api->contributors as $contrib_username => $contrib_profile) { if (empty($contrib_username) && empty($contrib_profile)) { continue; } if (empty($contrib_username)) { $contrib_username = preg_replace('/^.+\\/(.+)\\/?$/', '\\1', $contrib_profile); } $contrib_username = sanitize_user($contrib_username); if (empty($contrib_profile)) { echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</li>"; } else { echo "<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</a></li>"; } } ?> </ul> <?php if (!empty($api->donate_link)) { ?> <a target="_blank" href="<?php echo esc_url($api->donate_link); ?> "><?php _e('Donate to this plugin »'); ?> </a> <?php } ?> <?php } ?> </div> <div id="section-holder" class="wrap"> <?php if (!empty($api->tested) && version_compare(substr($GLOBALS['wp_version'], 0, strlen($api->tested)), $api->tested, '>')) { echo '<div class="notice notice-warning"><p>' . '<strong>' . __('Warning:') . '</strong> ' . __('This plugin has not been tested with your current version of WordPress.') . '</p></div>'; } else { if (!empty($api->requires) && version_compare(substr($GLOBALS['wp_version'], 0, strlen($api->requires)), $api->requires, '<')) { echo '<div class="notice notice-warning"><p>' . '<strong>' . __('Warning:') . '</strong> ' . __('This plugin has not been marked as compatible with your version of WordPress.') . '</p></div>'; } } foreach ((array) $api->sections as $section_name => $content) { $content = links_add_base_url($content, 'https://wordpress.org/plugins/' . $api->slug . '/'); $content = links_add_target($content, '_blank'); $san_section = esc_attr($section_name); $display = $section_name === $section ? 'block' : 'none'; if ('description' === $section_name && (!$api->external && $api->wp_org_missing || $api->external && $api->fs_missing)) { $missing_notice = array('type' => 'error', 'id' => md5(microtime()), 'message' => __fs($api->is_paid ? 'paid-addon-not-deployed' : 'free-addon-not-deployed', $api->slug)); fs_require_template('admin-notice.php', $missing_notice); } echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n"; echo $content; echo "\t</div>\n"; } echo "</div>\n"; echo "</div>\n"; echo "</div>\n"; // #plugin-information-scrollable echo "<div id='{$tab}-footer'>\n"; echo $this->get_plugin_cta($api); echo "</div>\n"; iframe_footer(); exit; }
/** * Helper function that returns the final steps for the upgrade completion. * * If the module is already running the premium code, returns an empty string. * * @author Vova Feldman (@svovaf) * @since 1.2.1 * * @param string $plan_title * * @return string */ private function get_complete_upgrade_instructions($plan_title = '') { if ($this->is_premium()) { return ''; } if (empty($plan_title)) { $plan_title = $this->_site->plan->title; } return sprintf(' %s: <ol><li>%s.</li><li>%s.</li><li>%s (<a href="%s" target="_blank">%s</a>).</li></ol>', __fs('follow-steps-to-complete-upgrade', $this->_slug), $this->_get_latest_download_link(sprintf(__fs('download-latest-x-version', $this->_slug), $plan_title)), __fs('deactivate-free-version', $this->_slug), __fs('upload-and-activate', $this->_slug), '//bit.ly/upload-wp-plugin', __fs('howto-upload-activate', $this->_slug)); }
/** * Customize the opt-in message. * * @author Vova Feldman (@svovaf) * @since 2.1.32 * * @param string $message * @param string $user_first_name * @param string $plugin_title * @param string $user_login * @param string $site_link * @param string $freemius_link * * @return string */ function ngg_fs_custom_connect_message($message, $user_first_name, $plugin_title, $user_login, $site_link, $freemius_link) { return sprintf(__fs('hey-x') . '<br>' . __('Allow %6$s to collect some usage data with %5$s to make the plugin even more awesome. If you skip this, that\'s okay! %2$s will still work just fine.', 'nggallery'), $user_first_name, '<b>' . __('NextGEN Gallery', 'nggallery') . '</b>', '<b>' . $user_login . '</b>', $site_link, $freemius_link, '<b>' . __('Imagely', 'nggallery') . '</b>'); }