2013-08-06 13:04:24 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* Addons Page
2013-08-06 13:04:24 +00:00
*
2015-11-20 15:27:52 +00:00
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin
* @ version 2.5 . 0
2013-08-06 13:04:24 +00:00
*/
2014-09-20 19:52:30 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
2015-12-03 13:38:13 +00:00
exit ;
2014-09-20 19:52:30 +00:00
}
2013-08-06 13:04:24 +00:00
/**
2015-11-03 12:28:01 +00:00
* WC_Admin_Addons Class .
2013-08-06 13:04:24 +00:00
*/
class WC_Admin_Addons {
2016-09-20 17:42:46 +00:00
/**
* Get featured for the addons screen
*
* @ return array of objects
*/
public static function get_featured () {
if ( false === ( $featured = get_transient ( 'wc_addons_featured' ) ) ) {
$raw_featured = wp_safe_remote_get ( 'https://d3t0oesq8995hv.cloudfront.net/add-ons/featured.json' , array ( '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 , WEEK_IN_SECONDS );
}
}
}
if ( is_object ( $featured ) ) {
self :: output_featured_sections ( $featured -> sections );
return $featured ;
}
}
2017-11-27 21:11:55 +00:00
/**
* Build transient name
*
* @ return string transient name
*/
public static function build_transient_name ( $category , $term , $country ) {
$transient_name = 'wc_addons_extensions' ;
if ( $category ) {
$transient_name = $transient_name . '_category_' . $category ;
}
if ( $term ) {
$transient_name = $transient_name . '_term_' . $term ;
}
if ( $country ) {
$transient_name = $transient_name . '_country_' . $country ;
}
return $transient_name ;
}
/**
* Build transient name
*
* @ return string transient name
*/
public static function build_parameter_string ( $category , $term , $country ) {
$paramters = array (
'category' => str_replace ( '_' , '-' , $category ),
'term' => $term ,
'country' => $country ,
);
return '?' . http_build_query ( $paramters );
}
/**
* Call API to get extensions
*
* @ return array of extensions
*/
public static function get_extension_data ( $category , $term , $country ) {
$transient_name = self :: build_transient_name ( $category , $term , $country );
$parameters = self :: build_parameter_string ( $category , $term , $country );
$addons = get_transient ( $transient_name );
if ( false === $addons ) {
$raw_extensions = wp_remote_get (
2017-11-29 15:25:34 +00:00
'https://woocommerce.com/wp-json/wccom-extensions/1.0/search' . $parameters
2017-11-27 21:11:55 +00:00
);
if ( ! is_wp_error ( $raw_extensions ) ) {
$addons = json_decode ( wp_remote_retrieve_body ( $raw_extensions ) ) -> products ;
if ( $addons ) {
set_transient ( $transient_name , $addons , WEEK_IN_SECONDS );
}
}
}
return $addons ;
}
2015-11-19 12:27:34 +00:00
/**
2015-12-03 13:38:13 +00:00
* Get sections for the addons screen
2016-09-20 17:42:46 +00:00
*
2015-12-03 13:38:13 +00:00
* @ return array of objects
2015-11-19 12:27:34 +00:00
*/
2015-12-03 13:38:13 +00:00
public static function get_sections () {
2015-12-03 13:42:58 +00:00
if ( false === ( $sections = get_transient ( 'wc_addons_sections' ) ) ) {
2015-12-15 01:20:02 +00:00
$raw_sections = wp_safe_remote_get ( 'https://d3t0oesq8995hv.cloudfront.net/addon-sections.json' , array ( 'user-agent' => 'WooCommerce Addons Page' ) );
2015-12-03 13:38:13 +00:00
if ( ! is_wp_error ( $raw_sections ) ) {
$sections = json_decode ( wp_remote_retrieve_body ( $raw_sections ) );
if ( $sections ) {
2015-12-03 13:42:58 +00:00
set_transient ( 'wc_addons_sections' , $sections , WEEK_IN_SECONDS );
2015-12-03 13:38:13 +00:00
}
}
2015-11-19 12:27:34 +00:00
}
2015-12-03 13:38:13 +00:00
$addon_sections = array ();
2015-12-03 13:42:58 +00:00
if ( $sections ) {
2015-12-03 14:04:36 +00:00
foreach ( $sections as $sections_id => $section ) {
if ( empty ( $sections_id ) ) {
2015-12-03 13:42:58 +00:00
continue ;
}
2015-12-03 14:04:36 +00:00
$addon_sections [ $sections_id ] = new stdClass ;
$addon_sections [ $sections_id ] -> title = wc_clean ( $section -> title );
$addon_sections [ $sections_id ] -> endpoint = wc_clean ( $section -> endpoint );
2015-12-03 13:42:58 +00:00
}
2015-11-19 12:27:34 +00:00
}
2015-12-03 13:38:13 +00:00
return apply_filters ( 'woocommerce_addons_sections' , $addon_sections );
}
/**
2016-01-05 15:24:48 +00:00
* Get section for the addons screen .
*
* @ param string $section_id
*
2015-12-03 13:38:13 +00:00
* @ return object | bool
*/
public static function get_section ( $section_id ) {
$sections = self :: get_sections ();
2015-12-03 14:04:36 +00:00
if ( isset ( $sections [ $section_id ] ) ) {
return $sections [ $section_id ];
2015-12-03 13:38:13 +00:00
}
return false ;
}
/**
2016-01-05 15:24:48 +00:00
* Get section content for the addons screen .
*
* @ param string $section_id
*
2015-12-17 12:57:59 +00:00
* @ return array
2015-12-03 13:38:13 +00:00
*/
public static function get_section_data ( $section_id ) {
$section = self :: get_section ( $section_id );
$section_data = '' ;
if ( ! empty ( $section -> endpoint ) ) {
2015-12-03 13:42:58 +00:00
if ( false === ( $section_data = get_transient ( 'wc_addons_section_' . $section_id ) ) ) {
2015-12-03 13:38:13 +00:00
$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 ) );
2015-12-03 14:04:36 +00:00
if ( ! empty ( $section_data -> products ) ) {
2015-12-03 13:42:58 +00:00
set_transient ( 'wc_addons_section_' . $section_id , $section_data , WEEK_IN_SECONDS );
2015-12-03 13:38:13 +00:00
}
}
}
}
2015-12-03 14:04:36 +00:00
return apply_filters ( 'woocommerce_addons_section_data' , $section_data -> products , $section_id );
2015-12-03 13:38:13 +00:00
}
/**
* Handles the outputting of a contextually aware Storefront link ( points to child themes if Storefront is already active ) .
*/
public static function output_storefront_button () {
2015-12-17 12:57:59 +00:00
$template = get_option ( 'template' );
$stylesheet = get_option ( 'stylesheet' );
2015-12-03 13:38:13 +00:00
if ( 'storefront' === $template ) {
if ( 'storefront' === $stylesheet ) {
2016-07-05 22:52:16 +00:00
$url = 'https://woocommerce.com/product-category/themes/storefront-child-theme-themes/' ;
2015-12-03 13:38:13 +00:00
$text = __ ( 'Need a fresh look? Try Storefront child themes' , 'woocommerce' );
$utm_content = 'nostorefrontchildtheme' ;
} else {
2016-07-05 22:52:16 +00:00
$url = 'https://woocommerce.com/product-category/themes/storefront-child-theme-themes/' ;
2015-12-03 13:38:13 +00:00
$text = __ ( 'View more Storefront child themes' , 'woocommerce' );
$utm_content = 'hasstorefrontchildtheme' ;
}
} else {
2016-07-05 22:52:16 +00:00
$url = 'https://woocommerce.com/storefront/' ;
2015-12-03 13:38:13 +00:00
$text = __ ( 'Need a theme? Try Storefront' , 'woocommerce' );
2015-11-19 14:44:04 +00:00
$utm_content = 'nostorefront' ;
2015-11-19 12:27:34 +00:00
}
2015-11-20 15:27:52 +00:00
$url = add_query_arg ( array (
Updated campaign tags
* Source: setupwizard, helptab, addons, notice (took the terms already
used in WC core and deleted all dashes)
* Medium: product
* Content: videos, docs, storefront, themecompatibility, wcthemes,
wcextensions, about, newsletter, tickets, apidocs (+ different content
for every reference in addons tab)
* Campaign: woocommerceplugin
2016-04-19 09:32:45 +00:00
'utm_source' => 'addons' ,
'utm_medium' => 'product' ,
'utm_campaign' => 'woocommerceplugin' ,
2015-11-20 15:27:52 +00:00
'utm_content' => $utm_content ,
), $url );
2015-11-19 14:44:04 +00:00
2015-11-19 12:35:20 +00:00
echo '<a href="' . esc_url ( $url ) . '" class="add-new-h2">' . esc_html ( $text ) . '</a>' . " \n " ;
2015-11-19 12:27:34 +00:00
}
2016-09-20 17:42:46 +00:00
/**
* Handles the outputting of a banner block .
*
* @ param object $block
*/
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 ) : ?>
< 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 endforeach ; ?>
</ div >
</ div >
< ? php
}
/**
* Handles the outputting of a column .
*
* @ param object $block
*/
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
}
}
/**
* Handles the outputting of a column block .
*
* @ param object $block
*/
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 ) : ?>
< 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 endforeach ; ?>
</ div >
< ? php
}
/**
* Handles the outputting of a small light block .
*
* @ param object $block
*/
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 endforeach ; ?>
</ div >
</ div >
</ div >
< ? php
}
/**
* Handles the outputting of a small dark block .
*
* @ param object $block
*/
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 " >
2016-11-08 20:31:39 +00:00
< ? php if ( ! empty ( $item -> image ) ) : ?>
2016-10-04 15:47:38 +00:00
< div class = " addons-small-dark-item-icon " >
2016-10-04 16:15:52 +00:00
< img class = " addons-img " src = " <?php echo esc_url( $item->image ); ?> " />
2016-10-04 15:47:38 +00:00
</ div >
< ? php endif ; ?>
2016-09-20 17:42:46 +00:00
< ? php
self :: output_button (
$item -> href ,
$item -> button ,
'addons-button-outline-white'
);
?>
</ div >
< ? php endforeach ; ?>
</ div >
</ div >
< ? php
}
2017-05-30 22:33:13 +00:00
/**
* Handles the outputting of the WooCommerce Services banner block .
*
* @ param object $block
*/
2017-06-14 10:24:45 +00:00
public static function output_wcs_banner_block ( $block = array () ) {
2017-05-30 22:33:13 +00:00
$is_active = is_plugin_active ( 'woocommerce-services/woocommerce-services.php' );
2017-05-31 04:56:26 +00:00
$location = wc_get_base_location ();
2017-05-30 22:33:13 +00:00
if (
2017-06-14 10:24:45 +00:00
! in_array ( $location [ 'country' ], array ( 'US' , 'CA' ), true ) ||
2017-05-30 22:33:13 +00:00
$is_active ||
! current_user_can ( 'install_plugins' ) ||
! current_user_can ( 'activate_plugins' )
) {
return ;
}
2017-05-31 05:31:10 +00:00
$button_url = wp_nonce_url (
add_query_arg ( array (
'install-addon' => 'woocommerce-services' ,
) ),
'install-addon_woocommerce-services'
2017-05-30 22:33:13 +00:00
);
2017-05-31 04:59:27 +00:00
$defaults = array (
2017-06-02 21:19:23 +00:00
'image' => WC () -> plugin_url () . '/assets/images/wcs-extensions-banner-3x.png' ,
2017-05-31 04:59:27 +00:00
'image_alt' => __ ( 'WooCommerce Services' , 'woocommerce' ),
2017-06-14 10:24:45 +00:00
'title' => __ ( 'Buy discounted shipping labels — then print them from your dashboard.' , 'woocommerce' ),
'description' => __ ( 'Integrate your store with USPS to buy discounted shipping labels, and print them directly from your WooCommerce dashboard. Powered by WooCommerce Services.' , 'woocommerce' ),
2017-05-31 04:59:27 +00:00
'button' => __ ( 'Free - Install now' , 'woocommerce' ),
'href' => $button_url ,
2017-06-14 10:24:45 +00:00
'logos' => array (),
2017-05-31 04:59:27 +00:00
);
2017-06-14 10:24:45 +00:00
switch ( $location [ 'country' ] ) {
case 'CA' :
$local_defaults = array (
'image' => WC () -> plugin_url () . '/assets/images/wcs-truck-banner-3x.png' ,
'title' => __ ( 'Show Canada Post shipping rates' , 'woocommerce' ),
'description' => __ ( 'Display live rates from Canada Post at checkout to make shipping a breeze. Powered by WooCommerce Services.' , 'woocommerce' ),
'logos' => array_merge ( $defaults [ 'logos' ], array (
array (
'link' => WC () -> plugin_url () . '/assets/images/wcs-canada-post-logo.jpg' ,
'alt' => 'Canada Post logo' ,
),
) ),
);
break ;
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' ,
),
) ),
);
break ;
default :
$local_defaults = array ();
}
$block_data = array_merge ( $defaults , $local_defaults , $block );
2017-05-30 22:33:13 +00:00
?>
< div class = " addons-wcs-banner-block " >
2017-06-05 15:28:28 +00:00
< 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 >
2017-05-30 22:33:13 +00:00
< div class = " addons-wcs-banner-block-content " >
2017-05-31 04:59:27 +00:00
< h1 >< ? php echo esc_html ( $block_data [ 'title' ] ); ?> </h1>
< p >< ? php echo esc_html ( $block_data [ 'description' ] ); ?> </p>
2017-06-14 10:24:45 +00:00
< ul >
< ? php foreach ( $block_data [ 'logos' ] as $logo ) : ?>
< li >
< img
alt = " <?php echo esc_url( $logo['alt'] ); ?> "
class = " wcs-service-logo "
src = " <?php echo esc_url( $logo['link'] ); ?> "
>
</ li >
< ? php endforeach ; ?>
</ ul >
2017-05-30 22:33:13 +00:00
< ? php
self :: output_button (
2017-05-31 04:59:27 +00:00
$block_data [ 'href' ],
$block_data [ 'button' ],
2017-06-05 15:28:28 +00:00
'addons-button-outline-green'
2017-05-30 22:33:13 +00:00
);
?>
</ div >
</ div >
< ? php
}
2016-09-20 17:42:46 +00:00
/**
* Handles the outputting of featured sections
*
* @ param array $sections
*/
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 ;
2017-05-30 22:34:05 +00:00
case 'wcs_banner_block' :
2017-06-14 10:24:45 +00:00
self :: output_wcs_banner_block ( ( array ) $section );
2017-05-30 22:34:05 +00:00
break ;
2016-09-20 17:42:46 +00:00
}
}
}
/**
* Outputs a button .
*
* @ param string $url
* @ param string $text
* @ param string $theme
* @ param string $plugin
*/
public static function output_button ( $url , $text , $theme , $plugin = '' ) {
$theme = __ ( 'Free' , 'woocommerce' ) === $text ? 'addons-button-outline-green' : $theme ;
$theme = is_plugin_active ( $plugin ) ? 'addons-button-installed' : $theme ;
$text = is_plugin_active ( $plugin ) ? __ ( 'Installed' , 'woocommerce' ) : $text ;
?>
< a
class = " addons-button <?php echo esc_attr( $theme ); ?> "
href = " <?php echo esc_url( $url ); ?> " >
< ? php echo esc_html ( $text ); ?>
</ a >
< ? php
}
2013-08-06 13:04:24 +00:00
/**
2015-12-03 13:38:13 +00:00
* Handles output of the addons page in admin .
2013-08-06 13:04:24 +00:00
*/
2014-06-04 10:16:19 +00:00
public static function output () {
2017-05-30 16:46:26 +00:00
if ( isset ( $_GET [ 'section' ] ) && 'helper' === $_GET [ 'section' ] ) {
do_action ( 'woocommerce_helper_output' );
return ;
}
2017-05-31 05:31:10 +00:00
if ( isset ( $_GET [ 'install-addon' ] ) && 'woocommerce-services' === $_GET [ 'install-addon' ] ) {
self :: install_woocommerce_services_addon ();
}
2015-12-03 13:38:13 +00:00
$sections = self :: get_sections ();
$theme = wp_get_theme ();
$section_keys = array_keys ( $sections );
2015-12-03 14:04:36 +00:00
$current_section = isset ( $_GET [ 'section' ] ) ? sanitize_text_field ( $_GET [ 'section' ] ) : current ( $section_keys );
2017-11-27 21:11:55 +00:00
$addons = array ();
if ( 'featured' !== $current_section ) {
$category = isset ( $_GET [ 'section' ] ) ? $_GET [ 'section' ] : null ;
$term = isset ( $_GET [ 'search' ] ) ? $_GET [ 'search' ] : null ;
$country = WC () -> countries -> get_base_country ();
$addons = self :: get_extension_data ( $category , $term , $country );
}
2017-08-23 13:38:00 +00:00
/**
* Addon page view .
*
2017-11-27 21:11:55 +00:00
* @ uses $addons
2017-08-23 13:38:00 +00:00
* @ uses $sections
* @ uses $theme
* @ uses $section_keys
* @ uses $current_section
*/
2016-07-27 10:58:43 +00:00
include_once ( dirname ( __FILE__ ) . '/views/html-admin-page-addons.php' );
2013-08-06 13:04:24 +00:00
}
2017-05-31 05:31:10 +00:00
/**
* Install WooCommerce Services from Extensions screens .
*/
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 ;
}
2014-09-20 19:52:30 +00:00
}