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 ;
}
}
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
*/
public static function output_wcs_banner_block ( $block = null ) {
$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-05-31 04:58:11 +00:00
! in_array ( $location [ 'country' ], array ( 'US' , 'CA' ) ) ||
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 (
'image' => WC () -> plugin_url () . '/assets/images/wcs-extensions-banner.png' ,
'image_alt' => __ ( 'WooCommerce Services' , 'woocommerce' ),
'title' => __ ( 'Transform your store into a shipping and fulfillment machine' , 'woocommerce' ),
'description' => __ ( 'WooCommerce Services makes shipping a breeze. Print a label, take advantage of discounted shipping rates, and send tracking information to your customer right as you process your order, all from the convenience of your WordPress dashboard.' , 'woocommerce' ),
'button' => __ ( 'Free - Install now' , 'woocommerce' ),
'href' => $button_url ,
);
$block_data = wp_parse_args ( $block , $defaults );
2017-05-30 22:33:13 +00:00
?>
< div class = " addons-wcs-banner-block " >
< img
class = " addons-img "
2017-05-31 04:59:27 +00:00
src = " <?php echo esc_url( $block_data['image'] ); ?> "
alt = " <?php echo esc_attr( $block_data['image_alt'] ); ?> "
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-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-05-30 22:33:13 +00:00
'addons-button-solid'
);
?>
</ 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' :
self :: output_wcs_banner_block ( $section );
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 );
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
}