PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 1.9.6
Subscriptions for WooCommerce with Stripe Recurring Payments v1.9.6
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 1.4.1 1.4.2 1.5.0 1.5.1 All 61 releases
subscription / includes / Frontend / MyAccount.php

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

332 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 $price = $subscription_data['price'] ?? 0;
120 $price_excl_tax = (float) $order_item->get_total();
121 $tax_amount = (float) $order_item->get_total_tax();
122
123 if ( $tax_amount > 0 ) {
124 $price = $price_excl_tax + $tax_amount;
125 $price = number_format( (float) $price, 2, '.', '' );
126 } else {
127 $tax_amount = 0;
128 }
129
130 $is_grace_period = isset( $subscription_data['grace_period'] );
131 $grace_remaining = $subscription_data['grace_period']['remaining_days'] ?? 0;
132 $grace_end_date = $subscription_data['grace_period']['end_date'] ?? '';
133 $grace_end_date = ! empty( $grace_end_date ) ? wp_date( 'F j, Y', strtotime( $grace_end_date ) ) : '';
134
135 $subscrpt_nonce = wp_create_nonce( 'subscrpt_nonce' );
136 $action_buttons = array();
137
138 if ( 'cancelled' !== $status ) {
139 if ( in_array( $status, array( 'pending', 'active', 'on_hold' ), true ) && $user_cancel ) {
140 $label = __( 'Cancel', 'subscription' );
141 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'cancel', $id, $status );
142
143 $action_buttons['cancel'] = array(
144 'url' => subscrpt_get_action_url( 'cancelled', $subscrpt_nonce, $id ),
145 'label' => $label,
146 'class' => 'cancel',
147 );
148 } elseif ( trim( $status ) === trim( 'pe_cancelled' ) ) {
149 $label = __( 'Reactivate', 'subscription' );
150 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'reactivate', $id, $status );
151
152 $action_buttons['reactivate'] = array(
153 'url' => subscrpt_get_action_url( 'reactivate', $subscrpt_nonce, $id ),
154 'label' => $label,
155 );
156 } elseif ( 'expired' === $status && 'pending' !== $order->get_status() ) {
157 // Check if maximum payments reached before showing renew button
158 if ( ! subscrpt_is_max_payments_reached( $id ) ) {
159 $label = __( 'Renew', 'subscription' );
160 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'renew', $id, $status );
161
162 $action_buttons['renew'] = array(
163 'url' => subscrpt_get_action_url( 'renew', $subscrpt_nonce, $id ),
164 'label' => $label,
165 );
166 }
167 }
168
169 if ( 'pending' === $order->get_status() ) {
170 $label = __( 'Pay now', 'subscription' );
171 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'pay_now', $id, $status );
172
173 $action_buttons['pay_now'] = array(
174 'url' => $order->get_checkout_payment_url(),
175 'label' => $label,
176 );
177 }
178 }
179
180 $is_auto_renew = $subscription_data['is_auto_renew'];
181 $renewal_setting = in_array( get_option( 'wp_subscription_auto_renewal_toggle', '1' ), [ 1, '1', 'true', 'yes' ], true );
182
183 $saved_methods = wc_get_customer_saved_methods_list( get_current_user_id() );
184 $has_methods = isset( $saved_methods['cc'] );
185 if ( $has_methods && $renewal_setting && class_exists( 'WC_Stripe' ) && $order && 'stripe' === $order->get_payment_method() ) {
186 // Check maximum payment limit for auto-renewal buttons too
187 if ( ! subscrpt_is_max_payments_reached( $id ) ) {
188 if ( ! $is_auto_renew ) {
189 $label = __( 'Turn on Auto Renewal', 'subscription' );
190 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'auto-renew-on', $id, $status );
191
192 $action_buttons['auto-renew-on'] = array(
193 'url' => subscrpt_get_action_url( 'renew-on', $subscrpt_nonce, $id ),
194 'label' => $label,
195 );
196 } else {
197 $label = __( 'Turn off Auto Renewal', 'subscription' );
198 $label = apply_filters( 'subscrpt_split_payment_button_text', $label, 'auto-renew-off', $id, $status );
199
200 $action_buttons['auto-renew-off'] = array(
201 'url' => subscrpt_get_action_url( 'renew-off', $subscrpt_nonce, $id ),
202 'label' => $label,
203 );
204 }
205 }
206 }
207
208 // Allow programmatically disabling cancel button
209 $disable_cancel = apply_filters( 'subscrpt_split_payment_disable_cancel', false, $id, $status );
210 if ( $disable_cancel && isset( $action_buttons['cancel'] ) ) {
211 unset( $action_buttons['cancel'] );
212 }
213
214 $action_buttons = apply_filters( 'subscrpt_single_action_buttons', $action_buttons, $id, $subscrpt_nonce, $status );
215
216 wc_get_template(
217 'myaccount/single.php',
218 array(
219 'id' => $id,
220 'status' => $status,
221 'verbose_status' => $verbose_status,
222 'start_date' => $start_date,
223 'next_date' => $next_date,
224 'is_grace_period' => $is_grace_period,
225 'grace_remaining' => $grace_remaining,
226 'grace_end_date' => $grace_end_date,
227 'trial' => $trial,
228 'trial_mode' => empty( $trial_mode ) ? 'off' : $trial_mode,
229 'order' => $order,
230 'order_item' => $order_item,
231 'related_orders' => $related_orders,
232 'price' => $price,
233 'price_excl_tax' => $price_excl_tax,
234 'tax' => $tax_amount,
235 'user_cancel' => $user_cancel,
236 'action_buttons' => $action_buttons,
237 'wp_button_class' => wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '',
238 ),
239 'subscription',
240 SUBSCRPT_TEMPLATES
241 );
242 }
243
244 /**
245 * Re-write flush
246 */
247 public function flush_rewrite_rules() {
248 add_rewrite_endpoint( $this->subscriptions_endpoint, EP_ROOT | EP_PAGES );
249 flush_rewrite_rules();
250 }
251
252 /**
253 * Change All Subscriptions Title
254 *
255 * @param string $title Title.
256 *
257 * @return string
258 */
259 public function change_subscriptions_title( string $title ): string {
260 $title = __( 'My Subscriptions', 'subscription' );
261 return $title;
262 }
263
264 /**
265 * Change View Subscription Title
266 *
267 * @param string $title Title.
268 *
269 * @return string
270 */
271 public function change_single_subscription_title( string $title ): string {
272 $subs_id = get_query_var( $this->view_subscriptions_endpoint, 0 );
273
274 /* translators: %s: Subscription ID */
275 $title = sprintf( __( 'Subscription #%s', 'subscription' ), $subs_id );
276 return $title;
277 }
278
279 /**
280 * Filter menu items.
281 *
282 * @param array $items MyAccount menu items.
283 * @return array
284 */
285 public function custom_my_account_menu_items( array $items ): array {
286 // Check if subscriptions menu item already exists to prevent duplicates
287 if ( ! isset( $items[ $this->subscriptions_endpoint ] ) ) {
288 $logout = $items['customer-logout'];
289 unset( $items['customer-logout'] );
290
291 $items[ $this->subscriptions_endpoint ] = __( 'Subscriptions', 'subscription' );
292 $items['customer-logout'] = $logout;
293 }
294 return $items;
295 }
296
297 /**
298 * Subscription Single EndPoint Content.
299 *
300 * @param int $current_page Current Page.
301 */
302 public function subscrpt_endpoint_content( $current_page ) {
303 $current_page = empty( $current_page ) ? 1 : absint( $current_page );
304 $args = array(
305 'author' => get_current_user_id(),
306 'posts_per_page' => 10,
307 'paged' => $current_page,
308 'post_type' => 'subscrpt_order',
309 'post_status' => array( 'pending', 'active', 'on_hold', 'cancelled', 'expired', 'pe_cancelled' ),
310 );
311
312 $postslist = new \WP_Query( $args );
313 wc_get_template(
314 'myaccount/subscriptions.php',
315 array(
316 'wp_button_class' => wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '',
317 'postslist' => $postslist,
318 'current_page' => $current_page,
319 ),
320 'subscription',
321 SUBSCRPT_TEMPLATES
322 );
323 }
324
325 /**
326 * Enqueue assets
327 */
328 public function enqueue_styles() {
329 wp_enqueue_style( 'subscrpt_status_css' );
330 }
331 }
332