<?php
use Automattic\Jetpack\Constants;
if (!defined('ABSPATH')) {
exit;
}
class WC_Admin_Addons
{
public static function get_featured()
{
$featured = get_transient('wc_addons_featured');
if (false === $featured) {
$headers = array();
$auth = WC_Helper_Options::get('auth');
if (!empty($auth['access_token'])) {
$headers['Authorization'] = 'Bearer ' . $auth['access_token'];
}
$raw_featured = wp_safe_remote_get('https://woocommerce.com/wp-json/wccom-extensions/1.0/featured', array('headers' => $headers, 'user-agent' => 'WooCommerce Addons Page'));
if (!is_wp_error($raw_featured)) {
$featured = json_decode(wp_remote_retrieve_body($raw_featured));
if ($featured) {
set_transient('wc_addons_featured', $featured, DAY_IN_SECONDS);
}
}
}
if (is_object($featured)) {
self::output_featured_sections($featured->sections);
return $featured;
}
}
public static function build_parameter_string($category, $term, $country)
{
$parameters = array('category' => $category, 'term' => $term, 'country' => $country);
return '?' . http_build_query($parameters);
}
public static function get_extension_data($category, $term, $country)
{
$parameters = self::build_parameter_string($category, $term, $country);
$headers = array();
$auth = WC_Helper_Options::get('auth');
if (!empty($auth['access_token'])) {
$headers['Authorization'] = 'Bearer ' . $auth['access_token'];
}
$raw_extensions = wp_safe_remote_get('https://woocommerce.com/wp-json/wccom-extensions/1.0/search' . $parameters, array('headers' => $headers));
if (!is_wp_error($raw_extensions)) {
$addons = json_decode(wp_remote_retrieve_body($raw_extensions))->products;
}
return $addons;
}
public static function get_sections()
{
$addon_sections = get_transient('wc_addons_sections');
if (false === $addon_sections) {
$raw_sections = wp_safe_remote_get('https://woocommerce.com/wp-json/wccom-extensions/1.0/categories');
if (!is_wp_error($raw_sections)) {
$addon_sections = json_decode(wp_remote_retrieve_body($raw_sections));
if ($addon_sections) {
set_transient('wc_addons_sections', $addon_sections, WEEK_IN_SECONDS);
}
}
}
return apply_filters('woocommerce_addons_sections', $addon_sections);
}
public static function get_section($section_id)
{
$sections = self::get_sections();
if (isset($sections[$section_id])) {
return $sections[$section_id];
}
return false;
}
public static function get_section_data($section_id)
{
$section = self::get_section($section_id);
$section_data = '';
if (!empty($section->endpoint)) {
$section_data = get_transient('wc_addons_section_' . $section_id);
if (false === $section_data) {
$raw_section = wp_safe_remote_get(esc_url_raw($section->endpoint), array('user-agent' => 'WooCommerce Addons Page'));
if (!is_wp_error($raw_section)) {
$section_data = json_decode(wp_remote_retrieve_body($raw_section));
if (!empty($section_data->products)) {
set_transient('wc_addons_section_' . $section_id, $section_data, WEEK_IN_SECONDS);
}
}
}
}
return apply_filters('woocommerce_addons_section_data', $section_data->products, $section_id);
}
public static function output_storefront_button()
{
$template = get_option('template');
$stylesheet = get_option('stylesheet');
if ('storefront' === $template) {
if ('storefront' === $stylesheet) {
$url = 'https://woocommerce.com/product-category/themes/storefront-child-theme-themes/';
$text = __('Need a fresh look? Try Storefront child themes', 'woocommerce');
$utm_content = 'nostorefrontchildtheme';
} else {
$url = 'https://woocommerce.com/product-category/themes/storefront-child-theme-themes/';
$text = __('View more Storefront child themes', 'woocommerce');
$utm_content = 'hasstorefrontchildtheme';
}
} else {
$url = 'https://woocommerce.com/storefront/';
$text = __('Need a theme? Try Storefront', 'woocommerce');
$utm_content = 'nostorefront';
}
$url = add_query_arg(array('utm_source' => 'addons', 'utm_medium' => 'product', 'utm_campaign' => 'woocommerceplugin', 'utm_content' => $utm_content), $url);
echo '<a href="' . esc_url($url) . '" class="add-new-h2">' . esc_html($text) . '</a>' . "\n";
}
public static function output_banner_block($block)
{
?>
<div class="addons-banner-block">
<h1><?php
echo esc_html($block->title);
?></h1>
<p><?php
echo esc_html($block->description);
?></p>
<div class="addons-banner-block-items">
<?php
foreach ($block->items as $item) {
?>
<?php
if (self::show_extension($item)) {
?>
<div class="addons-banner-block-item">
<div class="addons-banner-block-item-icon">
<img class="addons-img" src="<?php
echo esc_url($item->image);
?>" />
</div>
<div class="addons-banner-block-item-content">
<h3><?php
echo esc_html($item->title);
?></h3>
<p><?php
echo esc_html($item->description);
?></p>
<?php
self::output_button($item->href, $item->button, 'addons-button-solid', $item->plugin);
?>
</div>
</div>
<?php
}
?>
<?php
}
?>
</div>
</div>
<?php
}
public static function output_column($block)
{
if (isset($block->container) && 'column_container_start' === $block->container) {
?>
<div class="addons-column-section">
<?php
}
if ('column_start' === $block->module) {
?>
<div class="addons-column">
<?php
} else {
?>
</div>
<?php
}
if (isset($block->container) && 'column_container_end' === $block->container) {
?>
</div>
<?php
}
}
public static function output_column_block($block)
{
?>
<div class="addons-column-block">
<h1><?php
echo esc_html($block->title);
?></h1>
<p><?php
echo esc_html($block->description);
?></p>
<?php
foreach ($block->items as $item) {
?>
<?php
if (self::show_extension($item)) {
?>
<div class="addons-column-block-item">
<div class="addons-column-block-item-icon">
<img class="addons-img" src="<?php
echo esc_url($item->image);
?>" />
</div>
<div class="addons-column-block-item-content">
<h2><?php
echo esc_html($item->title);
?></h2>
<?php
self::output_button($item->href, $item->button, 'addons-button-solid', $item->plugin);
?>
<p><?php
echo esc_html($item->description);
?></p>
</div>
</div>
<?php
}
?>
<?php
}
?>
</div>
<?php
}
public static function output_small_light_block($block)
{
?>
<div class="addons-small-light-block">
<img class="addons-img" src="<?php
echo esc_url($block->image);
?>" />
<div class="addons-small-light-block-content">
<h1><?php
echo esc_html($block->title);
?></h1>
<p><?php
echo esc_html($block->description);
?></p>
<div class="addons-small-light-block-buttons">
<?php
foreach ($block->buttons as $button) {
?>
<?php
self::output_button($button->href, $button->text, 'addons-button-solid');
?>
<?php
}
?>
</div>
</div>
</div>
<?php
}
public static function output_small_dark_block($block)
{
?>
<div class="addons-small-dark-block">
<h1><?php
echo esc_html($block->title);
?></h1>
<p><?php
echo esc_html($block->description);
?></p>
<div class="addons-small-dark-items">
<?php
foreach ($block->items as $item) {
?>
<div class="addons-small-dark-item">
<?php
if (!empty($item->image)) {
?>
<div class="addons-small-dark-item-icon">
<img class="addons-img" src="<?php
echo esc_url($item->image);
?>" />
</div>
<?php
}
?>
<?php
self::output_button($item->href, $item->button, 'addons-button-outline-white');
?>
</div>
<?php
}
?>
</div>
</div>
<?php
}
public static function output_wcs_banner_block($block = array())
{
$is_active = is_plugin_active('woocommerce-services/woocommerce-services.php');
$location = wc_get_base_location();
if (!in_array($location['country'], array('US'), true) || $is_active || !current_user_can('install_plugins') || !current_user_can('activate_plugins')) {
return;
}
$button_url = wp_nonce_url(add_query_arg(array('install-addon' => 'woocommerce-services')), 'install-addon_woocommerce-services');
$defaults = array('image' => WC()->plugin_url() . '/assets/images/wcs-extensions-banner-3x.jpg', 'image_alt' => __('WooCommerce Shipping', 'woocommerce'), 'title' => __('Save time and money with WooCommerce Shipping', 'woocommerce'), 'description' => __('Print discounted USPS and DHL labels straight from your WooCommerce dashboard and save on shipping.', 'woocommerce'), 'button' => __('Free - Install now', 'woocommerce'), 'href' => $button_url, 'logos' => array());
switch ($location['country']) {
case 'US':
$local_defaults = array('logos' => array_merge($defaults['logos'], array(array('link' => WC()->plugin_url() . '/assets/images/wcs-usps-logo.png', 'alt' => 'USPS logo'), array('link' => WC()->plugin_url() . '/assets/images/wcs-dhlexpress-logo.png', 'alt' => 'DHL Express logo'))));
break;
default:
$local_defaults = array();
}
$block_data = array_merge($defaults, $local_defaults, $block);
?>
<div class="addons-wcs-banner-block">
<div class="addons-wcs-banner-block-image is-full-image">
<img
class="addons-img"
src="<?php
echo esc_url($block_data['image']);
?>"
alt="<?php
echo esc_attr($block_data['image_alt']);
?>"
/>
</div>
<div class="addons-wcs-banner-block-content">
<h1><?php
echo esc_html($block_data['title']);
?></h1>
<p><?php
echo esc_html($block_data['description']);
?></p>
<ul class="wcs-logos-container">
<?php
foreach ($block_data['logos'] as $logo) {
?>
<li>
<img
alt="<?php
echo esc_attr($logo['alt']);
?>"
class="wcs-service-logo"
src="<?php
echo esc_url($logo['link']);
?>"
>
</li>
<?php
}
?>
</ul>
<?php
self::output_button($block_data['href'], $block_data['button'], 'addons-button-outline-purple');
?>
</div>
</div>
<?php
}
public static function output_wcpay_banner_block($block = array())
{
$is_active = is_plugin_active('woocommerce-payments/woocommerce-payments.php');
$location = wc_get_base_location();
if (!in_array($location['country'], array('US'), true) || $is_active || !current_user_can('install_plugins') || !current_user_can('activate_plugins')) {
return;
}
$button_url = wp_nonce_url(add_query_arg(array('install-addon' => 'woocommerce-payments')), 'install-addon_woocommerce-payments');
$defaults = array('image' => WC()->plugin_url() . '/assets/images/wcpayments-icon-secure.png', 'image_alt' => __('WooCommerce Payments', 'woocommerce'), 'title' => __('Payments made simple, with no monthly fees — exclusively for WooCommerce stores.', 'woocommerce'), 'description' => __('Securely accept cards in your store. See payments, track cash flow into your bank account, and stay on top of disputes – right from your dashboard.', 'woocommerce'), 'button' => __('Free - Install now', 'woocommerce'), 'href' => $button_url, 'logos' => array());
$block_data = array_merge($defaults, $block);
?>
<div class="addons-wcs-banner-block">
<div class="addons-wcs-banner-block-image">
<img
class="addons-img"
src="<?php
echo esc_url($block_data['image']);
?>"
alt="<?php
echo esc_attr($block_data['image_alt']);
?>"
/>
</div>
<div class="addons-wcs-banner-block-content">
<h1><?php
echo esc_html($block_data['title']);
?></h1>
<p><?php
echo esc_html($block_data['description']);
?></p>
<?php
self::output_button($block_data['href'], $block_data['button'], 'addons-button-outline-purple');
?>
</div>
</div>
<?php
}
public static function output_promotion_block($section)
{
if (!current_user_can('install_plugins') || !current_user_can('activate_plugins')) {
return;
}
$section_object = (object) $section;
if (!empty($section_object->geowhitelist)) {
$section_object->geowhitelist = explode(',', $section_object->geowhitelist);
}
if (!empty($section_object->geoblacklist)) {
$section_object->geoblacklist = explode(',', $section_object->geoblacklist);
}
if (!self::show_extension($section_object)) {
return;
}
?>
<div class="addons-banner-block addons-promotion-block">
<img
class="addons-img"
src="<?php
echo esc_url($section['image']);
?>"
alt="<?php
echo esc_attr($section['image_alt']);
?>"
/>
<div class="addons-promotion-block-content">
<h1 class="addons-promotion-block-title"><?php
echo esc_html($section['title']);
?></h1>
<div class="addons-promotion-block-description">
<?php
echo wp_kses_post($section['description']);
?>
</div>
<div class="addons-promotion-block-buttons">
<?php
if ($section['button_1']) {
self::output_button($section['button_1_href'], $section['button_1'], 'addons-button-expandable addons-button-solid', $section['plugin']);
}
if ($section['button_2']) {
self::output_button($section['button_2_href'], $section['button_2'], 'addons-button-expandable addons-button-outline-purple', $section['plugin']);
}
?>
</div>
</div>
</div>
<?php
}
public static function output_featured_sections($sections)
{
foreach ($sections as $section) {
switch ($section->module) {
case 'banner_block':
self::output_banner_block($section);
break;
case 'column_start':
self::output_column($section);
break;
case 'column_end':
self::output_column($section);
break;
case 'column_block':
self::output_column_block($section);
break;
case 'small_light_block':
self::output_small_light_block($section);
break;
case 'small_dark_block':
self::output_small_dark_block($section);
break;
case 'wcs_banner_block':
self::output_wcs_banner_block((array) $section);
break;
case 'wcpay_banner_block':
self::output_wcpay_banner_block((array) $section);
break;
case 'promotion_block':
self::output_promotion_block((array) $section);
break;
}
}
}
public static function get_in_app_purchase_url_params()
{
$back_admin_path = add_query_arg(array());
return array('wccom-site' => site_url(), 'wccom-back' => rawurlencode($back_admin_path), 'wccom-woo-version' => Constants::get_constant('WC_VERSION'), 'wccom-connect-nonce' => wp_create_nonce('connect'));
}
public static function add_in_app_purchase_url_params($url)
{
return add_query_arg(self::get_in_app_purchase_url_params(), $url);
}
public static function output_button($url, $text, $style, $plugin = '')
{
$style = __('Free', 'woocommerce') === $text ? 'addons-button-outline-purple' : $style;
$style = is_plugin_active($plugin) ? 'addons-button-installed' : $style;
$text = is_plugin_active($plugin) ? __('Installed', 'woocommerce') : $text;
$url = self::add_in_app_purchase_url_params($url);
?>
<a
class="addons-button <?php
echo esc_attr($style);
?>"
href="<?php
echo esc_url($url);
?>">
<?php
echo esc_html($text);
?>
</a>
<?php
}
public static function output()
{
$section = isset($_GET['section']) ? sanitize_text_field(wp_unslash($_GET['section'])) : '_featured';
$search = isset($_GET['search']) ? sanitize_text_field(wp_unslash($_GET['search'])) : '';
if (isset($_GET['section']) && 'helper' === $_GET['section']) {
do_action('woocommerce_helper_output');
return;
}
if (isset($_GET['install-addon'])) {
switch ($_GET['install-addon']) {
case 'woocommerce-services':
self::install_woocommerce_services_addon();
break;
case 'woocommerce-payments':
self::install_woocommerce_payments_addon($section);
break;
default:
break;
}
}
$sections = self::get_sections();
$theme = wp_get_theme();
$current_section = isset($_GET['section']) ? $section : '_featured';
$addons = array();
if ('_featured' !== $current_section) {
$category = $section ? $section : null;
$term = $search ? $search : null;
$country = WC()->countries->get_base_country();
$addons = self::get_extension_data($category, $term, $country);
}
include_once dirname(__FILE__) . '/views/html-admin-page-addons.php';
}
public static function install_woocommerce_services_addon()
{
check_admin_referer('install-addon_woocommerce-services');
$services_plugin_id = 'woocommerce-services';
$services_plugin = array('name' => __('WooCommerce Services', 'woocommerce'), 'repo-slug' => 'woocommerce-services');
WC_Install::background_installer($services_plugin_id, $services_plugin);
wp_safe_redirect(remove_query_arg(array('install-addon', '_wpnonce')));
exit;
}
public static function install_woocommerce_payments_addon($section = '_featured')
{
check_admin_referer('install-addon_woocommerce-payments');
$wcpay_plugin_id = 'woocommerce-payments';
$wcpay_plugin = array('name' => __('WooCommerce Payments', 'woocommerce'), 'repo-slug' => 'woocommerce-payments');
WC_Install::background_installer($wcpay_plugin_id, $wcpay_plugin);
do_action('woocommerce_addon_installed', $wcpay_plugin_id, $section);
wp_safe_redirect(remove_query_arg(array('install-addon', '_wpnonce')));
exit;
}
public static function show_extension($item)
{
$location = WC()->countries->get_base_country();
if (isset($item->geowhitelist) && !in_array($location, $item->geowhitelist, true)) {
return false;
}
if (isset($item->geoblacklist) && in_array($location, $item->geoblacklist, true)) {
return false;
}
if (is_plugin_active($item->plugin)) {
return false;
}
return true;
}
public static function filter_admin_body_classes(string $admin_body_class = '') : string
{
if (isset($_GET['section']) && 'helper' === $_GET['section']) {
return " {$admin_body_class} woocommerce-page-wc-subscriptions ";
}
return " {$admin_body_class} woocommerce-page-wc-marketplace ";
}
}