Skip to content

Commit

Permalink
WooCommerce Services JITM (#6183)
Browse files Browse the repository at this point in the history
* Start implementing class for installing WooCommerce Hosted Services

* Add WooCommerce Services JITM for US and Canada-based merchants.

* Remove check for testing class.

* Remove “Hello World” notice.

* Hook up “Install WooCommerce Services” button.

* Add WooCommerce-specific JITM emblem.

* Add a nonce to the WC Services install link, use “safe” redirect method after install.

* Show an error message if the WooCommerce Services install fails, change entry hook to `admin_init`.

* Don’t open a new tab when installing WooCommerce Services from JITM.

* Remove usage of `filter_input()` in favor of the `$_GET` super global.

* Ensure that JITMs are only shown to users who can install plugins.

* Add a truthy return to WC Services installation method.

* Prune unnecessary variable usage.

* No need to explicitly call Jetpack::do_stats().

* Use the singleton pattern to allow for easier unit testing. Move hook attachment to constructor.

* Use a switch statement for WC Services JITM country detection, allowing for easier addition of future target markets.

* Explicitly base the post-install redirect on the referring URL.

* Update WooCommerce Services plugin slug for install and activation.

* Add PHPDoc comments to WooCommerce Services installer class.
  • Loading branch information
jeffstieler authored and dereksmart committed Jan 31, 2017
1 parent 6a57df2 commit 0fe1b5f
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 0 deletions.
1 change: 1 addition & 0 deletions 3rd-party/3rd-party.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@

// We can't load this conditionally since polldaddy add the call in class constuctor.
require_once( JETPACK__PLUGIN_DIR . '3rd-party/polldaddy.php' );
require_once( JETPACK__PLUGIN_DIR . '3rd-party/woocommerce-services.php' );
102 changes: 102 additions & 0 deletions 3rd-party/woocommerce-services.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

if ( ! defined( 'ABSPATH' ) ) {
exit;
}

class WC_Services_Installer {

/**
* @var WC_Services_Installer
**/
private static $instance = null;

static function init() {
if ( is_null( self::$instance ) ) {
self::$instance = new WC_Services_Installer();
}
return self::$instance;
}

public function __construct() {
add_action( 'admin_init', array( $this, 'add_error_notice' ) );
add_action( 'admin_init', array( $this, 'try_install' ) );
}

/**
* Verify the intent to install WooCommerce Services, and kick off installation.
*/
public function try_install() {
if ( isset( $_GET['wc-services-action'] ) && ( 'install' === $_GET['wc-services-action'] ) ) {
check_admin_referer( 'wc-services-install' );

if ( ! current_user_can( 'install_plugins' ) ) {
return;
}

$result = $this->install();
$redirect = wp_get_referer();

if ( false === $result ) {
$redirect = add_query_arg( 'wc-services-install-error', true, $redirect );
}

wp_safe_redirect( $redirect );

exit;
}
}

/**
* Set up installation error admin notice.
*/
public function add_error_notice() {
if ( ! empty( $_GET['wc-services-install-error'] ) ) {
add_action( 'admin_notices', array( $this, 'error_notice' ) );
}
}

/**
* Notify the user that the installation of WooCommerce Services failed.
*/
public function error_notice() {
?>
<div class="notice notice-error is-dismissible">
<p><?php _e( 'There was an error installing WooCommerce Services.', 'jetpack' ); ?></p>
</div>
<?php
}

/**
* Download, install, and activate the WooCommerce Services plugin.
*
* @return bool result of installation/activation
*/
private function install() {
include_once( ABSPATH . '/wp-admin/includes/admin.php' );
include_once( ABSPATH . '/wp-admin/includes/plugin-install.php' );
include_once( ABSPATH . '/wp-admin/includes/plugin.php' );
include_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' );
include_once( ABSPATH . '/wp-admin/includes/class-plugin-upgrader.php' );

$api = plugins_api( 'plugin_information', array( 'slug' => 'woocommerce-services' ) );

if ( is_wp_error( $api ) ) {
return false;
}

$upgrader = new Plugin_Upgrader( new Automatic_Upgrader_Skin() );
$result = $upgrader->install( $api->download_link );

if ( true !== $result ) {
return false;
}

$result = activate_plugin( 'woocommerce-services/woocommerce-services.php' );

// activate_plugin() returns null on success
return is_null( $result );
}
}

WC_Services_Installer::init();
66 changes: 66 additions & 0 deletions class.jetpack-jitm.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ function prepare_jitms( $screen ) {
add_action( 'admin_enqueue_scripts', array( $this, 'jitm_enqueue_files' ) );
add_action( 'admin_notices', array( $this, 'backups_updates_msg' ) );
}
elseif ( ! Jetpack::is_plugin_active( 'woocommerce-services/woocommerce-services.php' ) ) {
$pages_to_display = array(
'woocommerce_page_wc-settings', // WooCommerce > Settings
'edit-shop_order', // WooCommerce > Orders
'shop_order', // WooCommerce > Edit Order
);

if ( in_array( $screen->id, $pages_to_display ) ) {
add_action( 'admin_enqueue_scripts', array( $this, 'jitm_enqueue_files' ) );
add_action( 'admin_notices', array( $this, 'woocommerce_services_msg' ) );
}
}
}

/*
Expand Down Expand Up @@ -414,6 +426,60 @@ function videopress_media_upload_warning_msg() {
<?php
}

/**
* Display message prompting user to install WooCommerce Services.
*
* @since 4.6
*/
function woocommerce_services_msg() {
if ( ! current_user_can( 'manage_woocommerce' ) || ! current_user_can( 'install_plugins' ) ) {
return;
}

if ( isset( self::$jetpack_hide_jitm['woocommerce_services'] ) ) {
return;
}

if ( ! function_exists( 'wc_get_base_location' ) ) {
return;
}

$base_location = wc_get_base_location();

switch ( $base_location['country'] ) {
case 'US':
$message = __( 'Try our new service for USPS shipping & label-printing.', 'jetpack' );
break;
case 'CA':
$message = __( 'Try our new Canada Post shipping service.', 'jetpack' );
break;
default:
return;
}

$install_url = wp_nonce_url( add_query_arg( array( 'wc-services-action' => 'install' ) ), 'wc-services-install' );

?>
<div class="jp-jitm woo-jitm">
<a href="#" data-module="woocommerce_services" class="dismiss"><span class="genericon genericon-close"></span></a>
<div class="jp-emblem">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0" y="0" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M18,8h-2V7c0-1.105-0.895-2-2-2H4C2.895,5,2,5.895,2,7v10h2c0,1.657,1.343,3,3,3s3-1.343,3-3h4c0,1.657,1.343,3,3,3s3-1.343,3-3h2v-5L18,8z M7,18.5c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5s1.5,0.672,1.5,1.5S7.828,18.5,7,18.5z M4,14V7h10v7H4z M17,18.5c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5s1.5,0.672,1.5,1.5S17.828,18.5,17,18.5z" />
</svg>
</div>
<p class="msg">
<?php echo esc_html( $message ); ?>
</p>
<p>
<a href="<?php echo esc_url( $install_url ); ?>" title="<?php esc_attr_e( 'Install WooCommerce Services', 'jetpack' ); ?>" data-module="woocommerce_services" class="button button-jetpack launch show-after-enable"><?php esc_html_e( 'Install WooCommerce Services', 'jetpack' ); ?></a>
</p>
</div>
<?php
//jitm is being viewed, track it
$jetpack = Jetpack::init();
$jetpack->stat( 'jitm', 'woocommerce_services-viewed-' . JETPACK__VERSION );
}

/*
* Function to enqueue jitm css and js
*/
Expand Down
5 changes: 5 additions & 0 deletions scss/jetpack-admin-jitm.scss
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
fill: #8cc258;
}

// WooCommerce jitm
&.woo-jitm path {
fill: #96588a;
}

.dismiss {
margin: 0;
text-decoration: none;
Expand Down

0 comments on commit 0fe1b5f

Please sign in to comment.