PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.4.1
GiveWP – Donation Plugin and Fundraising Platform v3.4.1
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Promotions / InPluginUpsells / SaleBanners.php
give / src / Promotions / InPluginUpsells Last commit date
Endpoints 3 years ago resources 2 years ago AddonsAdminPage.php 3 years ago AddonsRepository.php 4 years ago LegacyFormEditor.php 2 years ago PaymentGateways.php 3 years ago SaleBanners.php 2 years ago
SaleBanners.php
258 lines
1 <?php
2
3 namespace Give\Promotions\InPluginUpsells;
4
5 use DateTimeImmutable;
6 use DateTimeZone;
7 use Exception;
8 use Give\Framework\Shims\Shim;
9
10 /**
11 * @since 2.17.0
12 */
13 class SaleBanners
14 {
15 /**
16 * @var string
17 */
18 private $optionName = 'give_hidden_sale_banners';
19
20 /**
21 * @var array
22 */
23 private $hiddenBanners;
24
25 /**
26 * @since 2.17.0
27 */
28 public function __construct()
29 {
30 $this->hiddenBanners = get_option($this->optionName, []);
31 }
32
33 /**
34 * Get banners definitions
35 *
36 * @since 3.1.0 add Giving Tuesday 2023 banner
37 * @since 2.23.2 add Giving Tuesday 2022 banner
38 * @since 2.17.0
39 *
40 * @note id must be unique for each definition
41 */
42 public function getBanners(): array
43 {
44 return [
45 [
46 'id' => 'bfgt2023',
47 'giveIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/give-logo-icon.svg',
48 'discountIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/discount-icon.svg',
49 'backgroundImageLargeURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-lg.svg',
50 'backgroundImageMediumURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-md.svg',
51 'backgroundImageSmallURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-s.svg',
52 'shoppingCartIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/shopping-cart-icon.svg',
53 'dismissIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/dismiss-icon.svg',
54 'accessibleLabel' => __('Black Friday/Giving Tuesday Sale', 'give'),
55 'leadText' => self::getDataByPricingPlan(
56 [
57 'Free' => __(
58 'Upgrade to a Pricing Plan for Recurring Donations, Fee Recovery, and more.',
59 'give'
60 ),
61 'Basic' => __(
62 'Upgrade to a Plus Plan to get all must-have add-ons.',
63 'give'
64 ),
65 'Plus' => __(
66 'Upgrade to Pro and get Peer-to-Peer fundraising.',
67 'give'
68 ),
69 'default' => __(
70 'Upgrade to a Pricing Plan for Recurring Donations, Fee Recovery, and more.',
71 'give'
72 ),
73 ]
74 ),
75 'actionText' => __('Shop Now', 'give'),
76 'actionURL' => self::getDataByPricingPlan(
77 [
78 'Free' => 'https://go.givewp.com/bf23',
79 'Basic' => 'https://go.givewp.com/bfup23',
80 'Plus' => 'https://go.givewp.com/bfup23',
81 'Default' => 'https://go.givewp.com/bfup23',
82 ]
83 ),
84 'startDate' => '2023-11-20 00:00',
85 'endDate' => '2023-11-29 23:59',
86 ],
87 ];
88 }
89
90 /**
91 * Get the banners that should be displayed.
92 *
93 * @since 3.1.0 hide banners for users with Pro tier accounts.
94 * @since 2.17.0
95 */
96 public function getVisibleBanners(): array
97 {
98 if (self::getUserPricingPlan() === 'Pro') {
99 return [];
100 }
101
102 $currentDateTime = current_datetime();
103 $currentUserId = get_current_user_id();
104 $giveWPWebsiteTimezone = new DateTimeZone('America/Los_Angeles');
105
106 return array_filter(
107 $this->getBanners(),
108 function ($banner) use ($currentDateTime, $currentUserId, $giveWPWebsiteTimezone) {
109 $isHidden = in_array($banner['id'] . $currentUserId, $this->hiddenBanners, true);
110
111 try {
112 $isFuture = $currentDateTime < new DateTimeImmutable($banner['startDate'], $giveWPWebsiteTimezone);
113 $isPast = $currentDateTime > new DateTimeImmutable($banner['endDate'], $giveWPWebsiteTimezone);
114 } catch (Exception $exception) {
115 return false;
116 }
117
118 return !($isHidden || $isFuture || $isPast);
119 }
120 );
121 }
122
123 /**
124 * Marks the given banner id as hidden for the current user so it will not display again.
125 *
126 * @since 2.17.0
127 *
128 * @return void
129 */
130 public function hideBanner(string $banner)
131 {
132 $this->hiddenBanners[] = $banner;
133
134 update_option(
135 $this->optionName,
136 array_unique($this->hiddenBanners)
137 );
138 }
139
140 /**
141 * Render admin page
142 *
143 * @since 2.17.0
144 */
145 public function render()
146 {
147 $banners = $this->getVisibleBanners();
148
149 if (!empty($banners)) {
150 include __DIR__ . '/resources/views/sale-banners.php';
151 }
152 }
153
154 /**
155 * Load scripts
156 *
157 * @since 2.17.0
158 */
159 public function loadScripts()
160 {
161 wp_enqueue_script(
162 'give-in-plugin-upsells-sale-banners',
163 GIVE_PLUGIN_URL . 'assets/dist/js/admin-upsell-sale-banner.js',
164 [],
165 GIVE_VERSION,
166 true
167 );
168
169 wp_localize_script(
170 'give-in-plugin-upsells-sale-banners',
171 'GiveSaleBanners',
172 [
173 'apiRoot' => esc_url_raw(rest_url('give-api/v2/sale-banner')),
174 'apiNonce' => wp_create_nonce('wp_rest'),
175 ]
176 );
177
178 wp_enqueue_style('givewp-admin-fonts');
179 }
180
181 /**
182 * Helper function to determine if the current page Give admin page
183 *
184 * @since 2.17.0
185 */
186 public static function isShowing(): bool
187 {
188 return isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms';
189 }
190
191 /**
192 * @since 3.1.0 retrieve licensed plugin slugs.
193 */
194 public static function getLicensedPluginSlugs(): array
195 {
196 $pluginSlugs = [];
197 $licenses = get_option("give_licenses", []);
198
199 foreach ($licenses as $license) {
200 if (isset($license['is_all_access_pass']) && $license['is_all_access_pass'] && !empty($license['download'])) {
201 $pluginSlugs = ['is_all_access_pass'];
202 } else {
203 $pluginSlugs[] = $license['plugin_slug'];
204 }
205 }
206
207 return $pluginSlugs;
208 }
209
210 /**
211 * @since 3.1.0 determines user pricing plan from licensed plugin slugs.
212 */
213 public static function getUserPricingPlan(): string
214 {
215 $plan = 'Free';
216
217 $pricingPlans = [
218 'Basic' => ['pdf' => 'give-pdf-receipts'],
219 'Plus' => [
220 'pdf_receipts' => 'give-pdf-receipts',
221 'recurring_donations' => 'give-recurring',
222 'fee_recovery' => 'give-fee-recovery',
223 'form_field_manager' => 'give-form-field-manager',
224 'tributes' => 'give-tributes',
225 'annual_receipts' => 'give-annual-receipts',
226 'peer_to_peer' => 'give-peer-to-peer',
227 ],
228 'Pro' => ['is_all_access_pass'],
229 ];
230
231 $licensedPluginSlugs = self::getLicensedPluginSlugs();
232
233 foreach ($pricingPlans as $planName => $requiredLicenses) {
234 $missingLicenses = array_diff($requiredLicenses, $licensedPluginSlugs);
235 if (empty($missingLicenses)) {
236 $plan = $planName;
237 }
238 }
239
240 return $plan;
241 }
242
243 /**
244 * @since 3.1.0 return data by user pricing plan.
245 */
246 public static function getDataByPricingPlan($data): string
247 {
248 $userPricingPlan = self::getUserPricingPlan();
249
250 if (array_key_exists($userPricingPlan, $data)) {
251 return $data[$userPricingPlan];
252 }
253
254 return $data['default'];
255 }
256 }
257
258