PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / trunk
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress vtrunk
4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / src / Membership / Controllers / FrontendController.php
wp-user-avatar / src / Membership / Controllers Last commit date
BaseController.php 3 years ago CheckoutController.php 1 month ago CheckoutResponse.php 3 years ago CheckoutSessionData.php 3 years ago CheckoutTrait.php 1 month ago FrontendController.php 1 week ago SubscriptionPlanController.php 2 months ago index.php 3 years ago
FrontendController.php
184 lines
1 <?php
2
3 namespace ProfilePress\Core\Membership\Controllers;
4
5 use ProfilePress\Core\Membership\Models\Customer\CustomerFactory;
6 use ProfilePress\Core\Membership\Models\Group\GroupFactory;
7 use ProfilePress\Core\Membership\Models\Plan\PlanFactory;
8 use ProfilePress\Core\Membership\Models\Subscription\SubscriptionFactory;
9
10 class FrontendController extends BaseController
11 {
12 public function __construct()
13 {
14 add_action('wp', [$this, 'prevent_caching'], 0);
15 add_action('wp', [$this, 'change_plan_shim'], 0);
16 add_filter('Yoast\WP\SEO\allowlist_permalink_vars', [$this, 'yoast_allowlist_checkout_vars']);
17 }
18
19 public function yoast_allowlist_checkout_vars($allowed_vars)
20 {
21 return array_merge(
22 $allowed_vars,
23 ['plan', 'group', 'change_plan', 'default', 'ppress_file', 'ppress-listener', 'token', 'ttl', 'redirect_to', 'pp_social_login', 'form_id', 'token', 'uid', 'user_id', 'activation_code', 'ppress-2fa-reset']
24 );
25 }
26
27 public function change_plan_shim()
28 {
29 if (ppress_is_checkout()) {
30
31 if (is_user_logged_in() && (isset($_GET['plan']) || !empty($_GET['group']))) {
32
33 $plan_group_id = !empty($_GET['group']) ? absint($_GET['group']) : PlanFactory::fromId(intval($_GET['plan']))->get_group_id();
34
35 if (is_int($plan_group_id)) {
36
37 $plan_group = GroupFactory::fromId($plan_group_id);
38
39 $customer = CustomerFactory::fromUserId(get_current_user_id());
40
41 foreach ($plan_group->get_plan_ids() as $plan_id) {
42 if ($sub = $customer->has_active_subscription($plan_id, true)) {
43 wp_safe_redirect(ppress_plan_checkout_url($sub->get_id(), true));
44 exit;
45 }
46 }
47 }
48 }
49
50 if (isset($_GET['change_plan'])) {
51 $sub = SubscriptionFactory::fromId(intval($_GET['change_plan']));
52 if ($sub->exists()) {
53 $_GET['plan'] = $sub->get_plan_id();
54 }
55 }
56
57 if (isset($_GET['group'])) {
58 $group = GroupFactory::fromId(intval($_GET['group']));
59 if ($group->exists()) {
60 $group_plan_ids = $group->get_plan_ids();
61 if (!empty($group_plan_ids)) {
62 $_GET['plan'] = $group->get_default_plan_id();
63 if (isset($_GET['default']) && in_array(intval($_GET['default']), $group_plan_ids)) {
64 $_GET['plan'] = intval($_GET['default']);
65 }
66 }
67 }
68 }
69 }
70 }
71
72 /**
73 * Prevent caching on dynamic pages.
74 */
75 public function prevent_caching()
76 {
77 if (!is_blog_installed()) {
78 return;
79 }
80
81 $page_ids = array_filter([
82 ppress_settings_by_key('set_login_url', false, true),
83 ppress_settings_by_key('set_registration_url', false, true),
84 ppress_settings_by_key('checkout_page_id', false, true),
85 ppress_settings_by_key('payment_success_page_id', false, true),
86 ppress_settings_by_key('edit_user_profile_url', false, true)
87 ]);
88
89 $do_not_cache = apply_filters('ppress_no_cache', (!empty($page_ids)) ? true : false);
90
91 if (apply_filters('ppress_is_prevent_cache', $do_not_cache && is_page($page_ids))) {
92
93 add_filter('nocache_headers', [$this, 'additional_nocache_headers'], 99);
94
95 ppress_maybe_define_constant('DONOTCACHEPAGE', true);
96 ppress_maybe_define_constant('DONOTCACHEOBJECT', true);
97 ppress_maybe_define_constant('DONOTCACHEDB', true);
98 nocache_headers();
99 $this->exclude_page_from_wpe_server_cache();
100 $this->exclude_page_from_pantheon_server_cache();
101 remove_filter('nocache_headers', [$this, 'additional_nocache_headers'], 99);
102 }
103 }
104
105 /**
106 * Set additional nocache headers.
107 *
108 * @param array $headers {
109 * Header names and field values.
110 *
111 * @type string $Expires Expires header.
112 * @type string $Cache -Control Cache-Control header.
113 * }
114 * @return array
115 * @see wp_get_nocache_headers()
116 *
117 */
118 public function additional_nocache_headers($headers)
119 {
120 // First tree are the default ones.
121 $nocache_headers_cache_control = array(
122 'no-cache',
123 'must-revalidate',
124 'max-age=0',
125 'no-store',
126 );
127
128 if (!empty($headers['Cache-Control'])) {
129 $original_headers_cache_control = array_map('trim', explode(',', $headers['Cache-Control']));
130 // Merge original headers with our nocache headers.
131 $nocache_headers_cache_control = array_merge($nocache_headers_cache_control, $original_headers_cache_control);
132 // Avoid duplicates.
133 $nocache_headers_cache_control = array_unique($nocache_headers_cache_control);
134 }
135
136 $headers['Cache-Control'] = implode(', ', $nocache_headers_cache_control);
137
138 return $headers;
139
140 }
141
142 /**
143 * Sets a browser cookie that tells WP Engine to exclude a page from server caching.
144 *
145 * @see https://wpengine.com/support/cache/#Default_Cache_Exclusions
146 * @see https://wpengine.com/support/determining-wp-engine-environment/
147 *
148 * @return void
149 */
150 public function exclude_page_from_wpe_server_cache()
151 {
152 if (function_exists('is_wpe') && is_wpe()) {
153 /*
154 * If "Settings -> Permalinks" is "Plain", i.e. the `permalink_structure` option is '',
155 * allow the entire site to be cached by WP Engine.
156 * Note: This will prevent users from being able to successfully use the "Lost your password?" feature.
157 */
158 if (isset($GLOBALS['wp_rewrite']) && !$GLOBALS['wp_rewrite']->using_permalinks()) {
159 return;
160 }
161
162 $path = wp_parse_url(get_permalink(), PHP_URL_PATH);
163 $cookie_domain = !defined('COOKIE_DOMAIN') ? false : COOKIE_DOMAIN;
164 setcookie('wordpress_wpe_no_cache', '1', 0, $path, $cookie_domain, is_ssl(), true);
165 }
166 }
167
168 /**
169 * Sets a browser cookie that tells Pantheon to exclude a page from server caching.
170 *
171 * @see https://docs.pantheon.io/cookies#disable-caching-for-specific-pages
172 *
173 * @return void
174 */
175 public function exclude_page_from_pantheon_server_cache()
176 {
177 if (apply_filters('ppress_enable_pantheon_caching_exclusion', true) && !empty($_ENV['PANTHEON_ENVIRONMENT'])) {
178 $domain = $_SERVER['HTTP_HOST'];
179 $path = wp_parse_url(get_permalink(), PHP_URL_PATH);
180 setcookie('NO_CACHE', '1', time() + 0, $path, $domain);
181 }
182 }
183 }
184