PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.1.36
OttoKit: All-in-One Automation Platform v1.1.36
1.1.36 1.1.35 1.1.34 1.1.33 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Integrations / memberpress / triggers / coupon-code-redeemed.php
suretriggers / src / Integrations / memberpress / triggers Last commit date
coupon-code-redeemed.php 3 weeks ago membership-cancelled.php 2 years ago membership-paused.php 2 years ago membership-signup-completed.php 2 months ago purchase-membership.php 1 year ago
coupon-code-redeemed.php
181 lines
1 <?php
2 /**
3 * CouponCodeRedeemed.
4 * php version 5.6
5 *
6 * @category CouponCodeRedeemed
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Integrations\MemberPress\Triggers;
15
16 use MeprTransaction;
17 use SureTriggers\Controllers\AutomationController;
18 use SureTriggers\Integrations\MemberPress\MemberPress;
19 use SureTriggers\Integrations\WordPress\WordPress;
20 use SureTriggers\Traits\SingletonLoader;
21
22 if ( ! class_exists( 'CouponCodeRedeemed' ) ) :
23
24 /**
25 * CouponCodeRedeemed
26 *
27 * @category CouponCodeRedeemed
28 * @package SureTriggers
29 * @author BSF <username@example.com>
30 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
31 * @link https://www.brainstormforce.com/
32 * @since 1.0.0
33 */
34 class CouponCodeRedeemed {
35
36
37 /**
38 * Integration type.
39 *
40 * @var string
41 */
42 public $integration = 'MemberPress';
43
44 /**
45 * Trigger name.
46 *
47 * @var string
48 */
49 public $trigger = 'mepr-coupon-code-redeemed';
50
51 use SingletonLoader;
52
53
54 /**
55 * Constructor
56 *
57 * @since 1.0.0
58 */
59 public function __construct() {
60 add_filter( 'sure_trigger_register_trigger', [ $this, 'register' ] );
61 }
62
63 /**
64 * Register action.
65 *
66 * @param array $triggers trigger data.
67 * @return array
68 */
69 public function register( $triggers ) {
70
71 $triggers[ $this->integration ][ $this->trigger ] = [
72 'label' => __( 'Coupon Code Redeemed', 'suretriggers' ),
73 'action' => $this->trigger,
74 'common_action' => [
75 'mepr-event-transaction-completed',
76 'mepr_txn_transition_status',
77 ],
78 'function' => [ $this, 'trigger_listener' ],
79 'priority' => 10,
80 'accepted_args' => 3,
81 ];
82
83 return $triggers;
84
85 }
86
87
88 /**
89 * Trigger listener
90 * This will trigger for both recurring and non-recurring transactions.
91 *
92 * Handles two WordPress hooks with different signatures:
93 * - `mepr-event-transaction-completed` ($event) fires for transactions that are
94 * charged and completed immediately.
95 * - `mepr_txn_transition_status` ($old_status, $new_status, $txn) is also needed
96 * because a coupon that grants a free trial (0 due today) never reaches the
97 * "complete" status at signup - MemberPress only marks it "confirmed" and the
98 * "transaction-completed" event isn't recorded until the trial converts to a
99 * paid charge days later. Watching the status transition catches the coupon
100 * redemption at the moment it actually happens.
101 *
102 * @param object $event_or_old_status MeprEvent instance, or the previous transaction status string.
103 * @param string|null $new_status The new transaction status (only set for the status-transition hook).
104 * @param object|null $txn The MeprTransaction instance (only set for the status-transition hook).
105 *
106 * @return void
107 */
108 public function trigger_listener( $event_or_old_status, $new_status = null, $txn = null ) {
109 if ( ! class_exists( 'MeprTransaction' ) ) {
110 return;
111 }
112
113 if ( class_exists( 'MeprEvent' ) && $event_or_old_status instanceof \MeprEvent ) {
114 $transaction = $event_or_old_status->get_data();
115 } elseif ( $txn instanceof MeprTransaction ) {
116 $old_status = $event_or_old_status;
117 // Only act the moment the transaction first becomes "confirmed".
118 if ( MeprTransaction::$confirmed_str !== $new_status || MeprTransaction::$confirmed_str === $old_status ) {
119 return;
120 }
121
122 // "confirmed" is also used as a generic placeholder status for every new
123 // subscription, trial or not - a non-trial signup gets a *separate*
124 // transaction row with status "complete" in the same request, which the
125 // other hook above already handles. Only continue here for a genuine
126 // zero-cost trial, since that is the one case where "complete" never
127 // fires at signup time (it only fires days later when the trial converts
128 // to a real charge). This keeps the two hooks from firing for the same
129 // coupon redemption.
130 $sub = $txn->subscription();
131 if (
132 ! $sub
133 || ! isset( $sub->trial, $sub->trial_amount )
134 || ! $sub->trial
135 || (float) $sub->trial_amount > 0.00
136 ) {
137 return;
138 }
139
140 $transaction = $txn;
141 } else {
142 return;
143 }
144
145 if ( ! ( $transaction instanceof MeprTransaction ) || empty( $transaction->coupon() ) ) {
146 return;
147 }
148
149 // Defensive dedupe in case something in a customized checkout flow ends up
150 // calling this for the same transaction more than once.
151 $dedupe_key = 'st_mepr_coupon_redeemed_' . $transaction->id;
152 if ( get_transient( $dedupe_key ) ) {
153 return;
154 }
155 set_transient( $dedupe_key, 1, DAY_IN_SECONDS );
156
157 $context = array_merge(
158 WordPress::get_user_context( $transaction->user_id ),
159 MemberPress::get_membership_context( $transaction )
160 );
161 $context['coupon_id'] = $transaction->coupon()->ID;
162 $context['coupon'] = get_post( $transaction->coupon()->ID );
163 AutomationController::sure_trigger_handle_trigger(
164 [
165 'trigger' => $this->trigger,
166 'context' => $context,
167 ]
168 );
169 }
170
171 }
172
173 /**
174 * Ignore false positive
175 *
176 * @psalm-suppress UndefinedMethod
177 */
178 CouponCodeRedeemed::get_instance();
179
180 endif;
181