/var/www/html/wp-content/plugins/woocommerce/src/Internal/Admin/ShippingLabelBannerDisplayRules.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php
/**
 * WooCommerce Shipping Label Banner Display Rules.
 */

namespace Automattic\WooCommerce\Internal\Admin;

/**
 * Determines whether the Shipping Label Banner should be displayed
 */
class ShippingLabelBannerDisplayRules {

    
/**
     * Whether the site is connected to wordpress.com.
     *
     * @var bool
     */
    
private $dotcom_connected;

    
/**
     * Whether installed plugins are incompatible with the banner.
     *
     * @var bool
     */
    
private $no_incompatible_plugins_installed;

    
/**
     * Holds the installed WooCommerce Shipping & Tax version.
     *
     * @var string
     */
    
private $wcs_version;

    
/**
     * Supported countries by USPS, see: https://webpmt.usps.gov/pmt010.cfm
     *
     * @var array
     */
    
private $supported_countries = array( 'US''AS''PR''VI''GU''MP''UM''FM''MH' );

    
/**
     * Array of supported currency codes.
     *
     * @var array
     */
    
private $supported_currencies = array( 'USD' );


    
/**
     * Constructor.
     *
     * @param bool        $dotcom_connected Is site connected to wordpress.com?.
     * @param string|null $wcs_version Installed WooCommerce Shipping version to check, null if not installed.
     * @param bool        $incompatible_plugins_installed Are there any incompatible plugins installed?.
     */
    
public function __construct$dotcom_connected$wcs_version$incompatible_plugins_installed ) {
        
$this->dotcom_connected                  $dotcom_connected;
        
$this->wcs_version                       $wcs_version;
        
$this->no_incompatible_plugins_installed = ! $incompatible_plugins_installed;
    }

    
/**
     * Determines whether banner is eligible for display (does not include a/b logic).
     */
    
public function should_display_banner() {
        return 
$this->banner_not_dismissed() &&
            
$this->dotcom_connected &&
            
$this->no_incompatible_plugins_installed &&
            
$this->order_has_shippable_products() &&
            
$this->store_in_us_and_usd() &&
            
$this->wcs_not_installed();
    }

    
/**
     * Checks if the banner was not dismissed by the user.
     *
     * @return bool
     */
    
private function banner_not_dismissed() {
        
$dismissed_timestamp_ms get_option'woocommerce_shipping_dismissed_timestamp' );

        if ( ! 
is_numeric$dismissed_timestamp_ms ) ) {
            return 
true;
        }
        
$dismissed_timestamp_ms intval$dismissed_timestamp_ms );
        
$dismissed_timestamp    intvalround$dismissed_timestamp_ms 1000 ) );
        
$expired_timestamp      $dismissed_timestamp 24 60 60// 24 hours from click time

        
$dismissed_for_good = -=== $dismissed_timestamp_ms;
        
$dismissed_24h      time() < $expired_timestamp;

        return ! 
$dismissed_for_good && ! $dismissed_24h;
    }

    
/**
     * Checks if there's a shippable product in the current order.
     *
     * @return bool
     */
    
private function order_has_shippable_products() {
        
$order wc_get_order();

        if ( ! 
$order ) {
            return 
false;
        }
        
// At this point (no packaging data), only show if there's at least one existing and shippable product.
        
foreach ( $order->get_items() as $item ) {
            if ( 
$item instanceof \WC_Order_Item_Product ) {
                
$product $item->get_product();

                if ( 
$product && $product->needs_shipping() ) {
                    return 
true;
                }
            }
        }

        return 
false;
    }

    
/**
     * Checks if the store is in the US and has its default currency set to USD.
     *
     * @return bool
     */
    
private function store_in_us_and_usd() {
        
$base_currency get_woocommerce_currency();
        
$base_location wc_get_base_location();

        return 
in_array$base_currency$this->supported_currenciestrue ) && in_array$base_location['country'], $this->supported_countriestrue );
    }

    
/**
     * Checks if WooCommerce Shipping & Tax is not installed.
     *
     * @return bool
     */
    
private function wcs_not_installed() {
        return ! 
$this->wcs_version;
    }
}