PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 1.11.1
Subscriptions for WooCommerce with Stripe Recurring Payments v1.11.1
2.4.0 2.3.0 2.2.0 2.1.0 2.0.0 1.11.2 1.11.1 1.11.0 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.6 1.9.5 trunk 1.3.0 1.3.1 1.3.2 1.4.0 All 65 releases
subscription / includes / Frontend / MyAccount.php

MyAccount.php in Subscriptions for WooCommerce with Stripe Recurring Payments 1.11.1, at includes/Frontend/MyAccount.php

330 lines 11.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SpringDevs\Subscription\Frontend;
4
5 use SpringDevs\Subscription\Illuminate\Helper;
6 use SpringDevs\Subscription\Illuminate\Subscription\Subscription;
7
8 // HPOS: This file is compatible with WooCommerce High-Performance Order Storage (HPOS).
9 // All WooCommerce order data is accessed via WooCommerce CRUD methods (wc_get_order, wc_get_order_item_meta, etc.).
10 // All direct post meta access is for subscription data only, not WooCommerce order data.
11 // If you add new order data access, use WooCommerce CRUD for HPOS compatibility.
12
13 /**
14 * Class MyAccount
15 *
16 * @package SpringDevs\Subscription\Frontend
17 */
18 class MyAccount {
19 /**
20 * Subscriptions endpoint slug.
21 *
22 * @var string
23 */
24 private $subscriptions_endpoint = 'subscriptions';
25
26 /**
27 * View Subscriptions endpoint slug.
28 *
29 * @var string
30 */
31 private $view_subscriptions_endpoint = 'view-subscription';
32
33
34 /**
35 * Initialize the class
36 */
37 public function __construct() {
38 // Assign endpoint slug from settings.
39 $this->subscriptions_endpoint = Subscription::get_user_endpoint( 'subs_list' );
40 $this->view_subscriptions_endpoint = Subscription::get_user_endpoint( 'view_subs' );
41
42 // Flush rewrite rules on init.
43 add_action( 'init', array( $this, 'flush_rewrite_rules' ) );
44
45 // Add My Subscriptions menu item.
46 add_filter( 'woocommerce_account_menu_items', array( $this, 'custom_my_account_menu_items' ), 200 );
47
48 // Add subscription url endpoints to query vars.
49 add_filter( 'woocommerce_get_query_vars', array( $this, 'custom_query_vars' ) );
50
51 // Subscription EndPoint Content.
52 add_action( "woocommerce_account_{$this->subscriptions_endpoint}_endpoint", array( $this, 'subscrpt_endpoint_content' ) );
53 add_action( "woocommerce_account_{$this->view_subscriptions_endpoint}_endpoint", array( $this, 'view_subscrpt_content' ) );
54
55 // Subscription page titles
56 add_filter( "woocommerce_endpoint_{$this->subscriptions_endpoint}_title", array( $this, 'change_subscriptions_title' ) );
57 add_filter( "woocommerce_endpoint_{$this->view_subscriptions_endpoint}_title", array( $this, 'change_single_subscription_title' ) );
58
59 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) );
60 }
61
62 /**
63 * Add custom url on MyAccount.
64 *
65 * @param array $query_vars query_vars.
66 *
67 * @return array
68 */
69 public function custom_query_vars( array $query_vars ): array {
70 $query_vars[ $this->subscriptions_endpoint ] = $this->subscriptions_endpoint;
71 $query_vars[ $this->view_subscriptions_endpoint ] = $this->view_subscriptions_endpoint;
72
73 return $query_vars;
74 }
75
76 /**
77 * Display Subscription Content.
78 *
79 * @param Int $id Post ID.
80 */
81 public function view_subscrpt_content( int $id ) {
82 $subs_post = get_post( $id );
83 $author_id = $subs_post ? (int) $subs_post->post_author : 0;
84 $current_user_id = get_current_user_id();
85 $user_is_admin = current_user_can( 'manage_options' );
86
87 if ( ! $user_is_admin && (int) $author_id !== (int) $current_user_id ) {
88 return wp_safe_redirect( '/404' );
89 }
90
91 $subscription_id = $id;
92 $subscription_data = Helper::get_subscription_data( $subscription_id );
93 $related_orders = Helper::get_related_orders( $subscription_id );
94
95 $status = $subscription_data['status'] ?? '';
96 $verbose_status = Helper::get_verbose_status( $status );
97
98 $order_id = $subscription_data['order']['order_id'] ?? 0;
99 $order_item_id = $subscription_data['order']['order_item_id'] ?? 0;
100
101 $order = wc_get_order( $order_id );
102 $order_item = $order ? $order->get_item( $order_item_id ) : null;
103
104 if ( ! $order || ! $order_item ) {
105 return wp_safe_redirect( '/404' );
106 }
107
108 $user_cancel = $subscription_data['can_user_cancel'] ?? false;
109
110 $start_date = $subscription_data['start_date'] ?? '';
111 $start_date = ! empty( $start_date ) ? wp_date( 'F j, Y', strtotime( $start_date ) ) : '-';
112
113 $next_date = $subscription_data['next_date'] ?? '';
114 $next_date = ! empty( $next_date ) ? wp_date( 'F j, Y', strtotime( $next_date ) ) : '-';
115
116 $trial = get_post_meta( $id, '_subscrpt_trial', true );
117 $trial_mode = get_post_meta( $id, '_subscrpt_trial_mode', true );
118
119 // Undiscounted subtotal, the discount that recurs, tax on the discounted amount, and the renewal total.
120 $display_totals = Helper::get_subscription_display_totals( $id, $order_item );
121
122 $price = $display_totals['total'];
123 $price_excl_tax = $display_totals['full_excl'];
124 $tax_amount = $display_totals['tax'];
125 $discount = $display_totals['discount'];
126
127 $is_grace_period = isset( $subscription_data['grace_period'] );
128 $grace_remaining = $subscription_data['grace_period']['remaining_days'] ?? 0;
129 $grace_end_date = $subscription_data['grace_period']['end_date'] ?? '';
130 $grace_end_date = ! empty( $grace_end_date ) ? wp_date( 'F j, Y', strtotime( $grace_end_date ) ) : '';
131
132 $subscrpt_nonce = wp_create_nonce( 'subscrpt_nonce' );
133 $action_buttons = array();
134
135 if ( 'cancelled' !== $status ) {
136 if ( in_array( $status, array( 'pending', 'active', 'on_hold' ), true ) && $user_cancel ) {
137 $label = __( 'Cancel', 'subscription' );
138 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'cancel', $id, $status );
139
140 $action_buttons['cancel'] = array(
141 'url' => subscrpt_get_action_url( 'cancelled', $subscrpt_nonce, $id ),
142 'label' => $label,
143 'class' => 'cancel',
144 );
145 } elseif ( trim( $status ) === trim( 'pe_cancelled' ) ) {
146 $label = __( 'Reactivate', 'subscription' );
147 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'reactivate', $id, $status );
148
149 $action_buttons['reactivate'] = array(
150 'url' => subscrpt_get_action_url( 'reactivate', $subscrpt_nonce, $id ),
151 'label' => $label,
152 );
153 } elseif ( 'expired' === $status && 'pending' !== $order->get_status() ) {
154 // Check if maximum payments reached before showing renew button
155 if ( ! subscrpt_is_max_payments_reached( $id ) ) {
156 $label = __( 'Renew', 'subscription' );
157 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'renew', $id, $status );
158
159 $action_buttons['renew'] = array(
160 'url' => subscrpt_get_action_url( 'renew', $subscrpt_nonce, $id ),
161 'label' => $label,
162 );
163 }
164 }
165
166 if ( 'pending' === $order->get_status() ) {
167 $label = __( 'Pay now', 'subscription' );
168 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'pay_now', $id, $status );
169
170 $action_buttons['pay_now'] = array(
171 'url' => $order->get_checkout_payment_url(),
172 'label' => $label,
173 );
174 }
175 }
176
177 $is_auto_renew = $subscription_data['is_auto_renew'];
178 $renewal_setting = in_array( get_option( 'wp_subscription_auto_renewal_toggle', '1' ), [ 1, '1', 'true', 'yes' ], true );
179
180 $saved_methods = wc_get_customer_saved_methods_list( get_current_user_id() );
181 $has_methods = isset( $saved_methods['cc'] );
182 if ( $has_methods && $renewal_setting && class_exists( 'WC_Stripe' ) && $order && 'stripe' === $order->get_payment_method() ) {
183 // Check maximum payment limit for auto-renewal buttons too
184 if ( ! subscrpt_is_max_payments_reached( $id ) ) {
185 if ( ! $is_auto_renew ) {
186 $label = __( 'Turn on Auto Renewal', 'subscription' );
187 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'auto-renew-on', $id, $status );
188
189 $action_buttons['auto-renew-on'] = array(
190 'url' => subscrpt_get_action_url( 'renew-on', $subscrpt_nonce, $id ),
191 'label' => $label,
192 );
193 } else {
194 $label = __( 'Turn off Auto Renewal', 'subscription' );
195 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'auto-renew-off', $id, $status );
196
197 $action_buttons['auto-renew-off'] = array(
198 'url' => subscrpt_get_action_url( 'renew-off', $subscrpt_nonce, $id ),
199 'label' => $label,
200 );
201 }
202 }
203 }
204
205 // Allow programmatically disabling cancel button
206 $disable_cancel = apply_filters( 'subscrpt_split_payment_disable_cancel', false, $id, $status );
207 if ( $disable_cancel && isset( $action_buttons['cancel'] ) ) {
208 unset( $action_buttons['cancel'] );
209 }
210
211 $action_buttons = apply_filters( 'subscrpt_single_action_buttons', $action_buttons, $id, $subscrpt_nonce, $status );
212
213 wc_get_template(
214 'myaccount/single.php',
215 array(
216 'id' => $id,
217 'status' => $status,
218 'verbose_status' => $verbose_status,
219 'start_date' => $start_date,
220 'next_date' => $next_date,
221 'is_grace_period' => $is_grace_period,
222 'grace_remaining' => $grace_remaining,
223 'grace_end_date' => $grace_end_date,
224 'trial' => $trial,
225 'trial_mode' => empty( $trial_mode ) ? 'off' : $trial_mode,
226 'order' => $order,
227 'order_item' => $order_item,
228 'related_orders' => $related_orders,
229 'price' => $price,
230 'price_excl_tax' => $price_excl_tax,
231 'tax' => $tax_amount,
232 'discount' => $discount,
233 'user_cancel' => $user_cancel,
234 'action_buttons' => $action_buttons,
235 'wp_button_class' => wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '',
236 ),
237 'subscription',
238 SUBSCRPT_TEMPLATES
239 );
240 }
241
242 /**
243 * Re-write flush
244 */
245 public function flush_rewrite_rules() {
246 add_rewrite_endpoint( $this->subscriptions_endpoint, EP_ROOT | EP_PAGES );
247 flush_rewrite_rules();
248 }
249
250 /**
251 * Change All Subscriptions Title
252 *
253 * @param string $title Title.
254 *
255 * @return string
256 */
257 public function change_subscriptions_title( string $title ): string {
258 $title = __( 'My Subscriptions', 'subscription' );
259 return $title;
260 }
261
262 /**
263 * Change View Subscription Title
264 *
265 * @param string $title Title.
266 *
267 * @return string
268 */
269 public function change_single_subscription_title( string $title ): string {
270 $subs_id = get_query_var( $this->view_subscriptions_endpoint, 0 );
271
272 /* translators: %s: Subscription ID */
273 $title = sprintf( __( 'Subscription #%s', 'subscription' ), $subs_id );
274 return $title;
275 }
276
277 /**
278 * Filter menu items.
279 *
280 * @param array $items MyAccount menu items.
281 * @return array
282 */
283 public function custom_my_account_menu_items( array $items ): array {
284 // Check if subscriptions menu item already exists to prevent duplicates
285 if ( ! isset( $items[ $this->subscriptions_endpoint ] ) ) {
286 $logout = $items['customer-logout'];
287 unset( $items['customer-logout'] );
288
289 $items[ $this->subscriptions_endpoint ] = __( 'Subscriptions', 'subscription' );
290 $items['customer-logout'] = $logout;
291 }
292 return $items;
293 }
294
295 /**
296 * Subscription Single EndPoint Content.
297 *
298 * @param int $current_page Current Page.
299 */
300 public function subscrpt_endpoint_content( $current_page ) {
301 $current_page = empty( $current_page ) ? 1 : absint( $current_page );
302 $args = array(
303 'author' => get_current_user_id(),
304 'posts_per_page' => 10,
305 'paged' => $current_page,
306 'post_type' => 'subscrpt_order',
307 'post_status' => array( 'pending', 'active', 'on_hold', 'cancelled', 'expired', 'pe_cancelled' ),
308 );
309
310 $postslist = new \WP_Query( $args );
311 wc_get_template(
312 'myaccount/subscriptions.php',
313 array(
314 'wp_button_class' => wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '',
315 'postslist' => $postslist,
316 'current_page' => $current_page,
317 ),
318 'subscription',
319 SUBSCRPT_TEMPLATES
320 );
321 }
322
323 /**
324 * Enqueue assets
325 */
326 public function enqueue_styles() {
327 wp_enqueue_style( 'subscrpt_status_css' );
328 }
329 }
330