diff --git a/includes/admin/class-wc-admin-addons.php b/includes/admin/class-wc-admin-addons.php index 82a96a401e9..fcbf51d2d01 100644 --- a/includes/admin/class-wc-admin-addons.php +++ b/includes/admin/class-wc-admin-addons.php @@ -7,6 +7,7 @@ */ use Automattic\Jetpack\Constants; +use Automattic\WooCommerce\Admin\RemoteInboxNotifications as PromotionRuleEngine; if ( ! defined( 'ABSPATH' ) ) { exit; @@ -81,7 +82,7 @@ class WC_Admin_Addons { * @param string $term Search terms. * @param string $country Store country. * - * @return array of extensions + * @return object of extensions and promotions */ public static function get_extension_data( $category, $term, $country ) { $parameters = self::build_parameter_string( $category, $term, $country ); @@ -99,7 +100,7 @@ class WC_Admin_Addons { ); if ( ! is_wp_error( $raw_extensions ) ) { - $addons = json_decode( wp_remote_retrieve_body( $raw_extensions ) )->products; + $addons = json_decode( wp_remote_retrieve_body( $raw_extensions ) ); } return $addons; } @@ -710,13 +711,33 @@ class WC_Admin_Addons { $sections = self::get_sections(); $theme = wp_get_theme(); $current_section = isset( $_GET['section'] ) ? $section : '_featured'; + $promotions = array(); $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 ); + $category = $section ? $section : null; + $term = $search ? $search : null; + $country = WC()->countries->get_base_country(); + $extension_data = self::get_extension_data( $category, $term, $country ); + $addons = $extension_data->products; + $promotions = ! empty( $extension_data->promotions ) ? $extension_data->promotions : array(); + } + + // We need Automattic\WooCommerce\Admin\RemoteInboxNotifications for the next part, if not remove all promotions. + if ( ! WC()->is_wc_admin_active() ) { + $promotions = array(); + } + // Check for existance of promotions and evaluate out if we should show them. + if ( ! empty( $promotions ) ) { + foreach ( $promotions as $promo_id => $promotion ) { + $evaluator = new PromotionRuleEngine\RuleEvaluator(); + $passed = $evaluator->evaluate( $promotion->rules ); + if ( ! $passed ) { + unset( $promotions[ $promo_id ] ); + } + } + // Tranform promotions to correct format ready for output. + $promotions = self::format_promotions( $promotions ); } /** @@ -811,4 +832,73 @@ class WC_Admin_Addons { return " $admin_body_class woocommerce-page-wc-marketplace "; } + + /** + * Take an action object and return the URL based on properties of the action. + * + * @param object $action Action object. + * @return string URL. + */ + public static function get_action_url( $action ): string { + if ( ! isset( $action->url ) ) { + return ''; + } + + if ( isset( $action->url_is_admin_query ) && $action->url_is_admin_query ) { + return wc_admin_url( $action->url ); + } + + if ( isset( $action->url_is_admin_nonce_query ) && $action->url_is_admin_nonce_query ) { + if ( empty( $action->nonce ) ) { + return ''; + } + return wp_nonce_url( + wc_admin_url( $action->url ), + $action->nonce + ); + } + + return $action->url; + } + + /** + * Format the promotion data ready for display, ie fetch locales and actions. + * + * @param array $promotions Array of promotoin objects. + * @return array Array of formatted promotions ready for output. + */ + public static function format_promotions( array $promotions ): array { + $formatted_promotions = array(); + foreach ( $promotions as $promotion ) { + // Get the matching locale or fall back to en-US. + $locale = PromotionRuleEngine\SpecRunner::get_locale( $promotion->locales ); + if ( null === $locale ) { + continue; + } + + $promotion_actions = array(); + if ( ! empty( $promotion->actions ) ) { + foreach ( $promotion->actions as $action ) { + $action_locale = PromotionRuleEngine\SpecRunner::get_action_locale( $action->locales ); + $url = self::get_action_url( $action ); + + $promotion_actions[] = array( + 'name' => $action->name, + 'label' => $action_locale->label, + 'url' => $url, + 'primary' => isset( $action->is_primary ) ? $action->is_primary : false, + ); + } + } + + $formatted_promotions[] = array( + 'title' => $locale->title, + 'description' => $locale->description, + 'image' => $locale->image, + 'image_alt' => $locale->img_alt, + 'actions' => $promotion_actions, + ); + } + return $formatted_promotions; + } } diff --git a/includes/admin/views/html-admin-page-addons.php b/includes/admin/views/html-admin-page-addons.php index c40e4b024b5..405344e659d 100644 --- a/includes/admin/views/html-admin-page-addons.php +++ b/includes/admin/views/html-admin-page-addons.php @@ -5,8 +5,11 @@ * @package WooCommerce\Admin * @var string $view * @var object $addons + * @var object $promotions */ +use Automattic\WooCommerce\Admin\RemoteInboxNotifications as PromotionRuleEngine; + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -77,16 +80,11 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' ); - -
- -
- - -
- -
- + is_wc_admin_active() ) { + + } + ?>