<?php namespace KrokedilKlarnaPaymentsDeps\Krokedil\SettingsPage; \defined('ABSPATH') || exit; use KrokedilKlarnaPaymentsDeps\Krokedil\SettingsPage\Traits\Layout; /** * Addons class to handle the addons section of the settings page. */ class Addons { use Layout; /** * The addons for the page. * * @var array $addons */ protected $addons = array(); /** * Installed plugins on the site to check if the addons are installed. * * @var array $installed_plugins */ protected $installed_plugins = array(); /** * List of active plugins on the site to check if the addons are active. * * @var array $active_plugins */ protected $active_plugins = array(); /** * Class constructor. * * @param array $addons Addons for the page. * @param array $sidebar Sidebar content. * @param \WC_Payment_Gateway|null $gateway The gateway object. * @return void */ public function __construct($addons, $sidebar, $gateway = null) { $this->gateway = $gateway; $this->title = __('Addons', 'krokedil-settings'); $this->addons = $addons; $this->sidebar = $sidebar; $this->installed_plugins = self::get_installed_plugins(); $this->active_plugins = self::get_active_plugins(); } /** * Parse the list of installed plugins and store the slug only. * * @return array */ private static function get_installed_plugins() { $plugins = get_plugins(); foreach ($plugins as $plugin => $data) { $slug = \explode('/', $plugin); $slug = $slug[0]; $installed_plugins[] = $slug; } return $installed_plugins; } /** * Parse the list of active plugins and get the slug only. * * @return array */ private static function get_active_plugins() { $active_plugins = get_option('active_plugins'); foreach ($active_plugins as $plugin) { $slug = \explode('/', $plugin); $slug = $slug[0]; $active_plugins[] = $slug; } return $active_plugins; } /** * Check if the plugin is installed. * * @param string $slug The plugin slug. * * @return bool */ private function is_plugin_installed($slug) { return \in_array($slug, $this->installed_plugins, \true); } /** * Check if the plugin is active. * * @param string $slug The plugin slug. * * @return bool */ private function is_plugin_active($slug) { return \in_array($slug, $this->active_plugins, \true); } /** * Output the addons HTML. * * @return void */ public function output_page_content() { global $hide_save_button; $hide_save_button = \true; wp_enqueue_style('krokedil-addons-page'); // Include the plugin-installer script from WordPress. wp_enqueue_script('plugin-install'); add_thickbox(); // Required for the plugin installer to work. $addons = $this->addons['items']; ?> <div class="krokedil_addons"> <?php // translators: %s is the plugin name. ?> <div class='krokedil_addons__cards'> <?php foreach ($addons as $addon) { ?> <?php $this->print_addon_card($addon); ?> <?php } ?> </div> </div> <?php } /** * Output the description for the addons page. * * @return void */ public function output_description() { $plugin_name = $this->plugin_name ?? __('the plugin', 'krokedil-settings'); // translators: %s is the plugin name. $description = \sprintf(__('These are other plugins from Krokedil that work well together with %s.', 'krokedil-settings'), $plugin_name); ?> <p class="krokedil_addons__description"><?php echo esc_html($description); ?></p> <?php } /** * Print the output for a single addon card. * * @param array $addon Addon data. * * @return void */ public function print_addon_card($addon) { $title = $addon['title']; $read_more = $addon['links']['read_more'] ?? array(); $description = self::get_description($addon['description']); $image = self::get_image($addon['image'] ?? array()); ?> <div class="krokedil_addons__card"> <div class="krokedil_addons__card_image"> <?php echo $image; // phpcs:ignore ?> </div> <div class="krokedil_addons__card_content"> <h3 class="krokedil_addons__card_title"><?php echo esc_html($title); ?></h3> <p class="krokedil_addons__card_description"><?php echo wp_kses_post($description); ?> <br /> <span class='krokedil_addons__read_more'> <?php echo wp_kses_post(self::get_link($read_more)); ?> </span> </p> </div> <?php $this->print_addon_actions($addon); ?> </div> <?php } /** * Print the action buttons/links for the addon card. * * @param array $addon Addon data. * * @return void */ public function print_addon_actions($addon) { $buy_now = $addon['links']['buy_now'] ?? array(); $price = $addon['price'] ?? array(); $source = $addon['source'] ?? ''; $slug = $addon['slug'] ?? ''; if (empty($slug)) { return; } // If the locale is swedish, then use the sek price. Else use the eur price. if (!empty($price)) { $price = 'sv' === self::get_locale() ? $price['sek'] : $price['eur']; } else { $price = __('Free', 'krokedil-settings'); } $active = self::is_plugin_active($addon['slug']); $installed = self::is_plugin_installed($addon['slug']); $status = $active ? 'active' : ($installed ? 'installed' : 'not-installed'); ?> <div class="krokedil_addons__card_action"> <span class='krokedil_addons__price'><b><?php echo esc_html($price); ?></b></span> <?php self::get_action_button($buy_now, $status, $source, $slug); ?> </div> <?php } /** * Get the action button for the plugin based on the status. * * @param array $link The link resource. * @param string $status The status of the plugin. * @param string $source The plugin source. * @param string $slug The plugin slug. * * @return void */ protected static function get_action_button($link, $status, $source, $slug) { $plugin_page_url = add_query_arg('s', $slug, home_url('/wp-admin/plugins.php')); $text = $link['text'] ?? ''; switch ($status) { case 'active': $text = __('Active', 'krokedil-settings'); $link['class'] = ($link['class'] ?? '') . ' disabled'; break; case 'installed': $text = __('Activate', 'krokedil-settings'); $link['class'] = ($link['class'] ?? '') . ' button-primary'; break; case 'not-installed': if ('wordpress' === $source) { // phpcs:ignore $text = __('Install Now', 'krokedil-settings'); } break; default: break; } $link['text'] = $text; if ('wordpress' !== $source && 'not-installed' !== $status) { // phpcs:ignore foreach ($link['href'] as $key => $value) { $link['href'][$key] = $plugin_page_url; $link['target'] = ''; } } ?> <span class='krokedil_addons__buy_now'> <?php echo wp_kses_post(self::get_link($link)); ?> </span> <?php } }