PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.14.1
GiveWP – Donation Plugin and Fundraising Platform v3.14.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 2 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 StellarSaleBanners.php 2 years ago
SaleBanners.php
376 lines
1 <?php
2
3 namespace Give\Promotions\InPluginUpsells;
4
5 use DateTimeImmutable;
6 use DateTimeZone;
7 use Exception;
8
9 /**
10 * @since 2.17.0
11 */
12 class SaleBanners
13 {
14 /**
15 * @var string
16 */
17 private $optionName = 'give_hidden_sale_banners';
18
19 /**
20 * @var array
21 */
22 private $hiddenBanners;
23
24 /**
25 * @since 2.17.0
26 */
27 public function __construct()
28 {
29 $this->hiddenBanners = get_option($this->optionName, []);
30 }
31
32 /**
33 * Get banners definitions
34 *
35 * @since 3.1.0 add Giving Tuesday 2023 banner
36 * @since 2.23.2 add Giving Tuesday 2022 banner
37 * @since 2.17.0
38 *
39 * @note id must be unique for each definition
40 */
41 public function getBanners(): array
42 {
43 return [
44 [
45 'id' => 'bfgt2023',
46 'giveIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/give-logo-icon.svg',
47 'discountIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/discount-icon.svg',
48 'backgroundImageLargeURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-lg.svg',
49 'backgroundImageMediumURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-md.svg',
50 'backgroundImageSmallURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/background-image-s.svg',
51 'shoppingCartIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/shopping-cart-icon.svg',
52 'dismissIconURL' => GIVE_PLUGIN_URL . 'assets/dist/images/admin/promotions/bfcm-banner/dismiss-icon.svg',
53 'accessibleLabel' => __('Black Friday/Giving Tuesday Sale', 'give'),
54 'leadText' => self::getDataByPricingPlan(
55 [
56 'Free' => __(
57 'Upgrade to a Pricing Plan for Recurring Donations, Fee Recovery, and more.',
58 'give'
59 ),
60 'Basic' => __(
61 'Upgrade to a Plus Plan to get all must-have add-ons.',
62 'give'
63 ),
64 'Plus' => __(
65 'Upgrade to Pro and get Peer-to-Peer fundraising.',
66 'give'
67 ),
68 'default' => __(
69 'Upgrade to a Pricing Plan for Recurring Donations, Fee Recovery, and more.',
70 'give'
71 ),
72 ]
73 ),
74 'actionText' => __('Shop Now', 'give'),
75 'actionURL' => self::getDataByPricingPlan(
76 [
77 'Free' => 'https://go.givewp.com/bf23',
78 'Basic' => 'https://go.givewp.com/bfup23',
79 'Plus' => 'https://go.givewp.com/bfup23',
80 'default' => 'https://go.givewp.com/bfup23',
81 ]
82 ),
83 'startDate' => '2023-11-20 00:00',
84 'endDate' => '2023-11-29 23:59',
85 ],
86 ];
87 }
88
89 /**
90 * Get the banners that should be displayed.
91 *
92 * @since 3.1.0 hide banners for users with Pro tier accounts.
93 * @since 2.17.0
94 */
95 public function getVisibleBanners(): array
96 {
97 $currentDateTime = current_datetime();
98 $currentUserId = get_current_user_id();
99 $giveWPWebsiteTimezone = new DateTimeZone('America/Los_Angeles');
100
101 return array_filter(
102 $this->getBanners(),
103 function ($banner) use ($currentDateTime, $currentUserId, $giveWPWebsiteTimezone) {
104 $isHidden = in_array($banner['id'] . $currentUserId, $this->hiddenBanners, true);
105
106 try {
107 $isFuture = $currentDateTime < new DateTimeImmutable($banner['startDate'], $giveWPWebsiteTimezone);
108 $isPast = $currentDateTime > new DateTimeImmutable($banner['endDate'], $giveWPWebsiteTimezone);
109 } catch (Exception $exception) {
110 return false;
111 }
112
113 return !($isHidden || $isFuture || $isPast);
114 }
115 );
116 }
117
118 /**
119 * Marks the given banner id as hidden for the current user so it will not display again.
120 *
121 * @since 2.17.0
122 *
123 * @return void
124 */
125 public function hideBanner(string $banner)
126 {
127 $this->hiddenBanners[] = $banner;
128
129 update_option(
130 $this->optionName,
131 array_unique($this->hiddenBanners)
132 );
133 }
134
135 /**
136 * Render admin page
137 *
138 * @since 2.17.0
139 */
140 public function render()
141 {
142 $banners = $this->getVisibleBanners();
143
144 if (!empty($banners)) {
145 include __DIR__ . '/resources/views/sale-banners.php';
146 }
147 }
148
149 /**
150 * Load scripts
151 *
152 * @since 2.17.0
153 */
154 public function loadScripts()
155 {
156 wp_enqueue_script(
157 'give-in-plugin-upsells-sale-banners',
158 GIVE_PLUGIN_URL . 'assets/dist/js/admin-upsell-sale-banner.js',
159 [],
160 GIVE_VERSION,
161 true
162 );
163
164 wp_localize_script(
165 'give-in-plugin-upsells-sale-banners',
166 'GiveSaleBanners',
167 [
168 'apiRoot' => esc_url_raw(rest_url('give-api/v2/sale-banner')),
169 'apiNonce' => wp_create_nonce('wp_rest'),
170 ]
171 );
172
173 wp_enqueue_style('givewp-admin-fonts');
174 }
175
176 /**
177 * Helper function to determine if the current page Give admin page
178 *
179 * @since 2.17.0
180 */
181 public static function isShowing(): bool
182 {
183 return isset($_GET['post_type']) && $_GET['post_type'] === 'give_forms';
184 }
185
186 /**
187 * @since 3.13.0 remove all_access_pass.
188 * @since 3.1.0 retrieve licensed plugin slugs.
189 */
190 public static function getLicensedPluginSlugs(): array
191 {
192 $pluginSlugs = [];
193 $licenses = get_option("give_licenses", []);
194
195 foreach ($licenses as $license) {
196 foreach ($license['download'] as $plugin) {
197 $pluginSlugs[] = $plugin['plugin_slug'];
198 }
199 }
200
201 return $pluginSlugs;
202 }
203
204 /**
205 * @since 3.1.0 determines user pricing plan from licensed plugin slugs.
206 */
207 public static function getUserPricingPlan(): string
208 {
209 $plan = 'Free';
210
211 $pricingPlans = [
212 'Basic' => self::getBasicLicenseSlugs(),
213 'Plus' => self::getPlusLicenseSlugs(),
214 'Pro' => self::getProLicenseSlugs(),
215 ];
216
217 $licensedPluginSlugs = self::getLicensedPluginSlugs();
218
219 foreach ($pricingPlans as $planName => $requiredLicenses) {
220 $missingLicenses = array_diff($requiredLicenses, $licensedPluginSlugs);
221 if (empty($missingLicenses)) {
222 $plan = $planName;
223 }
224 }
225
226 return $plan;
227 }
228
229 /**
230 * @since 3.13.0 add type for $data.
231 * @since 3.1.0 return data by user pricing plan.
232 */
233 public static function getDataByPricingPlan(array $data): string
234 {
235 $userPricingPlan = self::getUserPricingPlan();
236
237 if (array_key_exists($userPricingPlan, $data)) {
238
239 return $data[$userPricingPlan];
240 }
241
242 return $data['default'];
243 }
244
245 /**
246 * @since 3.13.0
247 *
248 * This method cycles through the visible banners, selecting the next banner in the list
249 * on each call. If no banners are visible, or if the session index is not set, it returns
250 * all visible banners.
251 */
252 public function alternateVisibleBanners(): array
253 {
254 $visibleBanners = $this->getVisibleBanners();
255 $bannerCount = count($visibleBanners);
256
257 if ($bannerCount > 0) {
258 $currentIndex = $_SESSION['banner_index'] ?? 0;
259
260 $selectedBanner = $visibleBanners[$currentIndex];
261
262 $currentIndex = ($currentIndex + 1) % $bannerCount;
263
264 $_SESSION['banner_index'] = $currentIndex;
265
266 if( !$selectedBanner){
267 $this->destroySession();
268 return $visibleBanners;
269 }
270
271 return [$selectedBanner];
272 }
273
274 return $visibleBanners;
275 }
276
277 /**
278 * @since 3.13.0
279 */
280 public function startSession(): void
281 {
282 if (!session_id()) {
283 session_start();
284 }
285 }
286
287 /**
288 * @since 3.13.0
289 */
290 public function destroySession(): void
291 {
292 if (session_id()) {
293 session_destroy();
294 }
295 }
296
297
298 /**
299 * @since 3.13.0
300 */
301 public static function getBasicLicenseSlugs(): array
302 {
303 return [
304 'give-bitpay',
305 'give-text-to-give',
306 'give-activecampaign',
307 'give-moneris',
308 'give-square',
309 'give-mollie',
310 'give-payfast',
311 'give-sofort',
312 'give-americloud-payments',
313 'give-paytm',
314 'give-gocardless',
315 'give-razorpay',
316 'give-payumoney',
317 'give-convertkit',
318 'give-aweber',
319 'give-per-form-gateways',
320 'give-email-reports',
321 'give-manual-donations',
322 'give-zapier',
323 'give-google-analytics',
324 'ccavenue' => 'give-ccavenue',
325 'give-constant-contact',
326 'give-braintree',
327 'give-iats',
328 'give-2checkout',
329 'give-pdf-receipts',
330 'give-paymill',
331 'give-stripe',
332 'give-authorize-net',
333 'give-mailchimp',
334 ];
335 }
336
337 /**
338 * @since 3.13.0
339 */
340 public static function getPlusLicenseSlugs(): array
341 {
342 $basicLicenseSlugs = self::getBasicLicenseSlugs();
343
344 $plusLicenseSlugs = [
345 'give-webhooks',
346 'give-salesforce',
347 'give-funds',
348 'give-annual-receipts',
349 'give-currency-switcher',
350 'give-donation-upsells-woocommerce',
351 'give-tributes',
352 'give-fee-recovery',
353 'give-email-reports',
354 'give-gift-aid',
355 'give-recurring',
356 'give-form-field-manager',
357 ];
358
359 return array_merge($basicLicenseSlugs, $plusLicenseSlugs);
360 }
361
362 /**
363 * @since 3.13.0
364 */
365 public static function getProLicenseSlugs(): array
366 {
367 $plusLicenseSlugs = self::getPlusLicenseSlugs();
368
369 $proLicenseSlugs = ['give-peer-to-peer'];
370
371 return array_merge($plusLicenseSlugs, $proLicenseSlugs);
372 }
373
374 }
375
376