Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/paid-memberships-pro/adminpages/pagesettings.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
//only admins can get this
3
+
if (!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_pagesettings"))) {
4
+
die(esc_html__("You do not have permissions to perform this action.", 'paid-memberships-pro' ));
5
+
}
6
+
7
+
global $wpdb, $msg, $msgt;
8
+
9
+
//get/set settings
10
+
global $pmpro_pages;
11
+
12
+
/**
13
+
* Adds additional page settings for use with add-on plugins, etc.
14
+
*
15
+
* @param array $pages {
16
+
* Formatted as array($name => $label)
17
+
*
18
+
* @type string $name Page name. (Letters, numbers, and underscores only.)
19
+
* @type string $label Settings label.
20
+
* }
21
+
* @since 1.8.5
22
+
*/
23
+
$extra_pages = apply_filters('pmpro_extra_page_settings', array());
24
+
25
+
/**
26
+
* @deprecated 3.0 replaced with pmpro_admin_pagesetting_post_type since 2.7.0
27
+
*/
28
+
$post_types = apply_filters_deprecated( 'pmpro_admin_pagesetting_post_type_array', array( array( 'page' ) ), '3.0', 'pmpro_admin_pagesetting_post_type' );
29
+
30
+
// For backward compatibility we extract the first element from the array
31
+
if ( is_array( $post_types ) ) {
32
+
$post_type = reset( $post_types );
33
+
} else {
34
+
$post_type = $post_types;
35
+
}
36
+
37
+
/**
38
+
* Set post type to use for PMPro pages in the page settings dropdown.
39
+
*
40
+
* @since 2.7.0
41
+
* @param string $post_type Accepts existing hierarchical post type
42
+
*/
43
+
$post_type = apply_filters( 'pmpro_admin_pagesetting_post_type', $post_type );
44
+
45
+
//check nonce for saving settings
46
+
if (!empty($_REQUEST['savesettings']) && (empty($_REQUEST['pmpro_pagesettings_nonce']) || !check_admin_referer('savesettings', 'pmpro_pagesettings_nonce'))) {
47
+
$msg = -1;
48
+
$msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' );
49
+
unset($_REQUEST['savesettings']);
50
+
}
51
+
52
+
if (!empty($_REQUEST['savesettings'])) {
53
+
//page ids
54
+
pmpro_setOption("account_page_id", NULL, 'intval');
55
+
pmpro_setOption("billing_page_id", NULL, 'intval');
56
+
pmpro_setOption("cancel_page_id", NULL, 'intval');
57
+
pmpro_setOption("checkout_page_id", NULL, 'intval');
58
+
pmpro_setOption("confirmation_page_id", NULL, 'intval');
59
+
pmpro_setOption("invoice_page_id", NULL, 'intval');
60
+
pmpro_setOption("levels_page_id", NULL, 'intval');
61
+
pmpro_setOption("login_page_id", NULL, 'intval');
62
+
pmpro_setOption("member_profile_edit_page_id", NULL, 'intval');
63
+
64
+
//update the pages array
65
+
$pmpro_pages["account"] = get_option( "pmpro_account_page_id");
66
+
$pmpro_pages["billing"] = get_option( "pmpro_billing_page_id");
67
+
$pmpro_pages["cancel"] = get_option( "pmpro_cancel_page_id");
68
+
$pmpro_pages["checkout"] = get_option( "pmpro_checkout_page_id");
69
+
$pmpro_pages["confirmation"] = get_option( "pmpro_confirmation_page_id");
70
+
$pmpro_pages["invoice"] = get_option( "pmpro_invoice_page_id");
71
+
$pmpro_pages["levels"] = get_option( "pmpro_levels_page_id");
72
+
$pmpro_pages["login"] = get_option( "pmpro_login_page_id");
73
+
$pmpro_pages['member_profile_edit'] = get_option( 'pmpro_member_profile_edit_page_id' );
74
+
75
+
//save additional pages
76
+
if (!empty($extra_pages)) {
77
+
foreach ($extra_pages as $name => $label) {
78
+
pmpro_setOption($name . '_page_id', NULL, 'intval');
79
+
$pmpro_pages[$name] = get_option('pmpro_' . $name . '_page_id');
80
+
}
81
+
}
82
+
83
+
// Save pmpro_use_custom_page_template settings.
84
+
foreach ( $pmpro_pages as $name => $page_id ) {
85
+
if ( isset( $_REQUEST[ 'pmpro_use_custom_page_template_' . $name ] ) ) {
86
+
if ( ! in_array( $_REQUEST[ 'pmpro_use_custom_page_template_' . $name ], array( 'yes', 'no' ) ) ) {
87
+
delete_option( 'pmpro_use_custom_page_template_' . $name );
88
+
} else {
89
+
update_option( 'pmpro_use_custom_page_template_' . $name, sanitize_text_field( $_REQUEST[ 'pmpro_use_custom_page_template_' . $name ] ) );
90
+
}
91
+
}
92
+
}
93
+
94
+
if ( empty( $_REQUEST['pmpro_disable_outdated_template_warning'] ) ) {
95
+
delete_option( 'pmpro_disable_outdated_template_warning' );
96
+
} else {
97
+
update_option( 'pmpro_disable_outdated_template_warning', sanitize_text_field( $_REQUEST['pmpro_disable_outdated_template_warning'] ) );
98
+
}
99
+
100
+
//assume success
101
+
$msg = true;
102
+
$msgt = __("Your page settings have been updated.", 'paid-memberships-pro' );
103
+
}
104
+
105
+
//check nonce for generating pages
106
+
if (!empty($_REQUEST['createpages']) && (empty($_REQUEST['pmpro_pagesettings_nonce']) || !check_admin_referer('createpages', 'pmpro_pagesettings_nonce'))) {
107
+
$msg = -1;
108
+
$msgt = __("Are you sure you want to do that? Try again.", 'paid-memberships-pro' );
109
+
unset($_REQUEST['createpages']);
110
+
}
111
+
112
+
//are we generating pages?
113
+
if (!empty($_REQUEST['createpages'])) {
114
+
115
+
$pages = array();
116
+
117
+
/**
118
+
* These pages were added later, and so we take extra
119
+
* care to make sure we only generate one version of them.
120
+
*/
121
+
$generate_once = array(
122
+
'member_profile_edit' => __( 'Your Profile', 'paid-memberships-pro' ),
123
+
'login' => 'Log In',
124
+
);
125
+
126
+
if(empty($_REQUEST['page_name'])) {
127
+
//default pages
128
+
$pages['account'] = __('Membership Account', 'paid-memberships-pro' );
129
+
$pages['billing'] = __('Membership Billing', 'paid-memberships-pro' );
130
+
$pages['cancel'] = __('Membership Cancel', 'paid-memberships-pro' );
131
+
$pages['checkout'] = __('Membership Checkout', 'paid-memberships-pro' );
132
+
$pages['confirmation'] = __('Membership Confirmation', 'paid-memberships-pro' );
133
+
$pages['invoice'] = __('Membership Orders', 'paid-memberships-pro' );
134
+
$pages['levels'] = __('Membership Levels', 'paid-memberships-pro' );
135
+
$pages['login'] = __('Log In', 'paid-memberships-pro' );
136
+
$pages['member_profile_edit'] = __('Your Profile', 'paid-memberships-pro' );
137
+
} elseif ( in_array( $_REQUEST['page_name'], array_keys( $generate_once ) ) ) {
138
+
$page_name = sanitize_text_field( $_REQUEST['page_name'] );
139
+
if ( ! empty( get_option( $page_name . '_page_generated' ) ) ) {
140
+
// Don't generate again.
141
+
unset( $pages[$page_name] );
142
+
143
+
// Find the old page
144
+
$old_page = get_page_by_path( $page_name );
145
+
if ( ! empty( $old_page ) ) {
146
+
$pmpro_pages[$page_name] = $old_page->ID;
147
+
pmpro_setOption( $page_name . '_page_id', $old_page->ID );
148
+
pmpro_setOption( $page_name . '_page_generated', '1' );
149
+
$msg = true;
150
+
$msgt = sprintf( __( "Found an existing version of the %s page and used that one.", 'paid-memberships-pro' ), $page_name );
151
+
} else {
152
+
$msg = -1;
153
+
$msgt = sprintf( __( "Error generating the %s page. You will have to choose or create one manually.", 'paid-memberships-pro' ), $page_name );
154
+
}
155
+
} else {
156
+
// Generate the new Your Profile page and save an option that it was created.
157
+
$pages[$page_name] = array(
158
+
'title' => $generate_once[$page_name],
159
+
'content' => '[pmpro_' . $page_name . ']',
160
+
);
161
+
pmpro_setOption( $page_name . '_page_generated', '1' );
162
+
}
163
+
} else {
164
+
//generate extra pages one at a time
165
+
$pmpro_page_name = sanitize_text_field($_REQUEST['page_name']);
166
+
$pmpro_page_id = $pmpro_pages[$pmpro_page_name];
167
+
$pages[$pmpro_page_name] = $extra_pages[$pmpro_page_name];
168
+
}
169
+
170
+
$pages_created = pmpro_generatePages($pages);
171
+
172
+
if (!empty($pages_created)) {
173
+
$msg = true;
174
+
$msgt = __("The following pages have been created for you", 'paid-memberships-pro' ) . ": " . implode(", ", $pages_created) . ".";
175
+
}
176
+
}
177
+
178
+
require_once(dirname(__FILE__) . "/admin_header.php"); ?>
179
+
180
+
<form action="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings' ) );?>" method="post" enctype="multipart/form-data">
181
+
<?php wp_nonce_field('savesettings', 'pmpro_pagesettings_nonce');?>
182
+
<hr class="wp-header-end">
183
+
<h1><?php esc_html_e( 'Page Settings', 'paid-memberships-pro' ); ?></h1>
184
+
<?php
185
+
// check if we have all pages
186
+
if ( $pmpro_pages['account'] ||
187
+
$pmpro_pages['billing'] ||
188
+
$pmpro_pages['cancel'] ||
189
+
$pmpro_pages['checkout'] ||
190
+
$pmpro_pages['confirmation'] ||
191
+
$pmpro_pages['invoice'] ||
192
+
$pmpro_pages['levels'] ||
193
+
$pmpro_pages['member_profile_edit'] ) {
194
+
$pmpro_some_pages_ready = true;
195
+
} else {
196
+
$pmpro_some_pages_ready = false;
197
+
}
198
+
199
+
if ( $pmpro_some_pages_ready ) { ?>
200
+
<p><?php esc_html_e('Manage the WordPress pages assigned to each required Paid Memberships Pro page.', 'paid-memberships-pro' ); ?></p>
201
+
<?php } elseif( ! empty( $_REQUEST['manualpages'] ) ) { ?>
202
+
<p><?php esc_html_e('Assign the WordPress pages for each required Paid Memberships Pro page or', 'paid-memberships-pro' ); ?> <a
203
+
href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1' ), 'createpages', 'pmpro_pagesettings_nonce') );?>"><?php esc_html_e('click here to let us generate them for you', 'paid-memberships-pro' ); ?></a>.
204
+
</p>
205
+
<?php } else { ?>
206
+
<div class="pmpro-new-install">
207
+
<h2><?php esc_html_e( 'Manage Pages', 'paid-memberships-pro' ); ?></h2>
208
+
<h4><?php esc_html_e( 'Several frontend pages are required for your Paid Memberships Pro site.', 'paid-memberships-pro' ); ?></h4>
209
+
<a href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin.php?page=pmpro-pagesettings&createpages=1'), 'createpages', 'pmpro_pagesettings_nonce' ) ); ?>" class="button-primary"><?php esc_html_e( 'Generate Pages For Me', 'paid-memberships-pro' ); ?></a>
210
+
<a href="<?php echo esc_url( admin_url( 'admin.php?page=pmpro-pagesettings&manualpages=1' ) ); ?>" class="button"><?php esc_html_e( 'Create Pages Manually', 'paid-memberships-pro' ); ?></a>
211
+
</div> <!-- end pmpro-new-install -->
212
+
<?php } ?>
213
+
214
+
<?php if ( ! empty( $pmpro_some_pages_ready ) || ! empty( $_REQUEST['manualpages'] ) ) { ?>
215
+
<div id="pmpro-page-settings" class="pmpro_section" data-visibility="shown" data-activated="true">
216
+
<div class="pmpro_section_toggle">
217
+
<button class="pmpro_section-toggle-button" type="button" aria-expanded="true">
218
+
<span class="dashicons dashicons-arrow-up-alt2"></span>
219
+
<?php esc_html_e( 'Primary Membership Page Settings', 'paid-memberships-pro' ); ?>
220
+
</button>
221
+
</div>
222
+
<div class="pmpro_section_inside">
223
+
<p><?php
224
+
$frontend_template_customization_link_escaped = '<a title="' . esc_html__( 'Paid Memberships Pro - Frontend Page Templates', 'paid-memberships-pro' ) . '" target="_blank" rel="nofollow noopener" href="https://www.paidmembershipspro.com/documentation/templates/?utm_source=plugin&utm_medium=pmpro-pagesettings&utm_campaign=documentation&utm_content=frontend-page-templates">' . esc_html__( 'how to customize the content of frontend pages', 'paid-memberships-pro' ) . '</a>';
225
+
// translators: %s: Link to Frontend Page Templates docs.
226
+
printf( esc_html__('Click here for documentation on %s beyond the block or shortcode settings.', 'paid-memberships-pro' ), $frontend_template_customization_link_escaped ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
227
+
?></p>
228
+
<table class="form-table">
229
+
<tbody>
230
+
<tr>
231
+
<th scope="row" valign="top">
232
+
<label for="account_page_id"><?php esc_html_e('Account Page', 'paid-memberships-pro' ); ?></label>
233
+
</th>
234
+
<td>
235
+
<?php
236
+
wp_dropdown_pages(
237
+
array(
238
+
'name' => 'account_page_id',
239
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
240
+
'selected' => esc_html( $pmpro_pages['account'] ),
241
+
'post_type' => esc_html( $post_type ),
242
+
)
243
+
);
244
+
?>
245
+
<?php if (!empty($pmpro_pages['account'])) { ?>
246
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['account'] ); ?>&action=edit"
247
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
248
+
249
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['account']) ); ?>"
250
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
251
+
<?php } ?>
252
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_account] <?php esc_html_e('or the Membership Account block', 'paid-memberships-pro' ); ?>.</p>
253
+
</td>
254
+
<tr>
255
+
<th scope="row" valign="top">
256
+
<label for="billing_page_id"><?php esc_html_e('Billing Information Page', 'paid-memberships-pro' ); ?></label>
257
+
</th>
258
+
<td>
259
+
<?php
260
+
wp_dropdown_pages(
261
+
array(
262
+
'name' => 'billing_page_id',
263
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
264
+
'selected' => esc_html( $pmpro_pages['billing'] ),
265
+
'post_type' => esc_html( $post_type ),
266
+
)
267
+
);
268
+
?>
269
+
<?php if (!empty($pmpro_pages['billing'])) { ?>
270
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['billing'] ); ?>&action=edit"
271
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
272
+
273
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['billing']) ); ?>"
274
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
275
+
<?php } ?>
276
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_billing] <?php esc_html_e('or the Membership Billing block', 'paid-memberships-pro' ); ?>.</p>
277
+
</td>
278
+
<tr>
279
+
<th scope="row" valign="top">
280
+
<label for="cancel_page_id"><?php esc_html_e('Cancel Page', 'paid-memberships-pro' ); ?></label>
281
+
</th>
282
+
<td>
283
+
<?php
284
+
wp_dropdown_pages(
285
+
array(
286
+
'name' => 'cancel_page_id',
287
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
288
+
'selected' => esc_html( $pmpro_pages['cancel'] ),
289
+
'post_type' => esc_html( $post_type ),
290
+
)
291
+
);
292
+
?>
293
+
<?php if (!empty($pmpro_pages['cancel'])) { ?>
294
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['cancel'] ); ?>&action=edit"
295
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
296
+
297
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['cancel']) ); ?>"
298
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
299
+
<?php } ?>
300
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_cancel] <?php esc_html_e('or the Membership Cancel block', 'paid-memberships-pro' ); ?>.</p>
301
+
</td>
302
+
</tr>
303
+
<tr>
304
+
<th scope="row" valign="top">
305
+
<label for="checkout_page_id"><?php esc_html_e('Checkout Page', 'paid-memberships-pro' ); ?></label>
306
+
</th>
307
+
<td>
308
+
<?php
309
+
wp_dropdown_pages(
310
+
array(
311
+
'name' => 'checkout_page_id',
312
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
313
+
'selected' => esc_html( $pmpro_pages['checkout'] ),
314
+
'post_type' => esc_html( $post_type ),
315
+
)
316
+
);
317
+
?>
318
+
<?php if (!empty($pmpro_pages['checkout'])) { ?>
319
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['checkout'] ); ?>&action=edit"
320
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
321
+
322
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['checkout']) ); ?>"
323
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
324
+
<?php } ?>
325
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_checkout] <?php esc_html_e('or the Membership Checkout block', 'paid-memberships-pro' ); ?>.</p>
326
+
</td>
327
+
</tr>
328
+
<tr>
329
+
<th scope="row" valign="top">
330
+
<label for="confirmation_page_id"><?php esc_html_e('Confirmation Page', 'paid-memberships-pro' ); ?></label>
331
+
</th>
332
+
<td>
333
+
<?php
334
+
wp_dropdown_pages(
335
+
array(
336
+
'name' => 'confirmation_page_id',
337
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
338
+
'selected' => esc_html( $pmpro_pages['confirmation'] ),
339
+
'post_type' => esc_html( $post_type ),
340
+
)
341
+
);
342
+
?>
343
+
<?php if (!empty($pmpro_pages['confirmation'])) { ?>
344
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['confirmation'] ); ?>&action=edit"
345
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
346
+
347
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['confirmation']) ); ?>"
348
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
349
+
<?php } ?>
350
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_confirmation] <?php esc_html_e('or the Membership Confirmation block', 'paid-memberships-pro' ); ?>.</p>
351
+
</td>
352
+
</tr>
353
+
<tr>
354
+
<th scope="row" valign="top">
355
+
<label for="levels_page_id"><?php esc_html_e('Levels Page', 'paid-memberships-pro' ); ?></label>
356
+
</th>
357
+
<td>
358
+
<?php
359
+
wp_dropdown_pages(
360
+
array(
361
+
'name' => 'levels_page_id',
362
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
363
+
'selected' => esc_html( $pmpro_pages['levels'] ),
364
+
'post_type' => esc_html( $post_type ),
365
+
)
366
+
);
367
+
?>
368
+
<?php if (!empty($pmpro_pages['levels'])) { ?>
369
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['levels'] ) ?>&action=edit"
370
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
371
+
372
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['levels']) ); ?>"
373
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
374
+
<?php } ?>
375
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_levels] <?php esc_html_e('or the Membership Levels block', 'paid-memberships-pro' ); ?>.</p>
376
+
377
+
<?php if ( ! function_exists( 'pmpro_advanced_levels_shortcode' ) ) {
378
+
$allowed_advanced_levels_html = array (
379
+
'a' => array (
380
+
'href' => array(),
381
+
'target' => array(),
382
+
'title' => array(),
383
+
),
384
+
);
385
+
echo '<p class="description">' . sprintf( wp_kses( __( 'Optional: Customize your Membership Levels page using the <a href="%s" title="Paid Memberships Pro - Advanced Levels Page Add On" target="_blank">Advanced Levels Page Add On</a>.', 'paid-memberships-pro' ), $allowed_advanced_levels_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-advanced-levels-shortcode/?utm_source=plugin&utm_medium=pmpro-pagesettings&utm_campaign=add-ons&utm_content=pmpro-advanced-levels-shortcode' ) . '</p>';
386
+
} ?>
387
+
</td>
388
+
</tr>
389
+
<tr>
390
+
<th scope="row" valign="top">
391
+
<label for="login_page_id"><?php esc_html_e( 'Log In Page', 'paid-memberships-pro' ); ?></label>
392
+
</th>
393
+
<td>
394
+
<?php
395
+
wp_dropdown_pages(
396
+
array(
397
+
'name' => 'login_page_id',
398
+
'show_option_none' => '-- ' . esc_html__('Use WordPress Default', 'paid-memberships-pro') . ' --',
399
+
'selected' => esc_html( $pmpro_pages['login'] ),
400
+
'post_type' => esc_html( $post_type ),
401
+
)
402
+
);
403
+
?>
404
+
405
+
<?php if ( ! empty( $pmpro_pages['login'] ) ) { ?>
406
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['login'] ); ?>&action=edit"
407
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
408
+
409
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['login']) ); ?>"
410
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
411
+
<?php } elseif ( empty( get_option( 'pmpro_login_page_generated' ) ) ) { ?>
412
+
413
+
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'login' ) ), admin_url('admin.php') ) ), 'createpages', 'pmpro_pagesettings_nonce' ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
414
+
<?php } ?>
415
+
<p class="description"><?php printf( esc_html__('Include the shortcode %s or the Log In Form block.', 'paid-memberships-pro' ), '[pmpro_login]' ); ?></p>
416
+
</td>
417
+
</tr>
418
+
<tr>
419
+
<th scope="row" valign="top">
420
+
<label for="member_profile_edit_page_id"><?php esc_html_e( 'Member Profile Edit Page', 'paid-memberships-pro' ); ?></label>
421
+
</th>
422
+
<td>
423
+
<?php
424
+
wp_dropdown_pages(
425
+
array(
426
+
'name' => 'member_profile_edit_page_id',
427
+
'show_option_none' => '-- ' . esc_html__('Use WordPress Default', 'paid-memberships-pro') . ' --',
428
+
'selected' => esc_html( $pmpro_pages['member_profile_edit'] ),
429
+
'post_type' => esc_html( $post_type ),
430
+
)
431
+
);
432
+
?>
433
+
434
+
<?php if ( ! empty( $pmpro_pages['member_profile_edit'] ) ) { ?>
435
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['member_profile_edit'] );?>&action=edit"
436
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
437
+
438
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['member_profile_edit']) ); ?>"
439
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
440
+
<?php } elseif ( empty( get_option( 'pmpro_member_profile_edit_page_generated' ) ) ) { ?>
441
+
442
+
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( 'member_profile_edit' ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ) ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
443
+
<?php } ?>
444
+
<p class="description"><?php printf( esc_html__('Include the shortcode %s or the Member Profile Edit block.', 'paid-memberships-pro' ), '[pmpro_member_profile_edit]' ); ?></p>
445
+
</td>
446
+
</tr>
447
+
<tr>
448
+
<th scope="row" valign="top">
449
+
<label for="invoice_page_id"><?php esc_html_e('Orders Page', 'paid-memberships-pro' ); ?></label>
450
+
</th>
451
+
<td>
452
+
<?php
453
+
wp_dropdown_pages(
454
+
array(
455
+
'name' => 'invoice_page_id',
456
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
457
+
'selected' => esc_html( $pmpro_pages['invoice'] ),
458
+
'post_type' => esc_html( $post_type ),
459
+
)
460
+
);
461
+
?>
462
+
<?php if (!empty($pmpro_pages['invoice'])) { ?>
463
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages['invoice'] ); ?>&action=edit"
464
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
465
+
466
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages['invoice']) ); ?>"
467
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
468
+
<?php } ?>
469
+
<p class="description"><?php esc_html_e('Include the shortcode', 'paid-memberships-pro' ); ?> [pmpro_invoice] <?php esc_html_e('or the Membership Orders block', 'paid-memberships-pro' ); ?>.</p>
470
+
</td>
471
+
</tr>
472
+
</tbody>
473
+
</table>
474
+
<p class="submit">
475
+
<input name="savesettings" type="submit" class="button button-primary"
476
+
value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' ); ?>"/>
477
+
</p>
478
+
</div> <!-- end pmpro_section_inside -->
479
+
</div> <!-- end pmpro_section -->
480
+
<?php if ( ! empty( $extra_pages )) { ?>
481
+
<div id="pmpro-additional-page-settings" class="pmpro_section" data-visibility="shown" data-activated="true">
482
+
<div class="pmpro_section_toggle">
483
+
<button class="pmpro_section-toggle-button" type="button" aria-expanded="true">
484
+
<span class="dashicons dashicons-arrow-up-alt2"></span>
485
+
<?php esc_html_e( 'Additional Page Settings', 'paid-memberships-pro' ); ?>
486
+
</button>
487
+
</div>
488
+
<div class="pmpro_section_inside">
489
+
<table class="form-table">
490
+
<tbody>
491
+
<?php foreach ($extra_pages as $name => $page) { ?>
492
+
<?php
493
+
if(is_array($page)) {
494
+
$label = $page['title'];
495
+
if(!empty($page['hint']))
496
+
$hint = $page['hint'];
497
+
else
498
+
$hint = '';
499
+
} else {
500
+
$label = $page;
501
+
$hint = '';
502
+
}
503
+
?>
504
+
<tr>
505
+
<th scope="row" valign="top">
506
+
<label for="<?php echo esc_attr( $name ); ?>_page_id"><?php echo wp_kses_post( $label ); ?></label>
507
+
</th>
508
+
<td>
509
+
<?php wp_dropdown_pages(
510
+
array(
511
+
'name' => esc_html( $name . '_page_id' ),
512
+
'show_option_none' => '-- ' . esc_html__( 'Choose One', 'paid-memberships-pro' ) . ' --',
513
+
'selected' => esc_html( $pmpro_pages[ $name ] ),
514
+
'post_type' => esc_html( $post_type ),
515
+
)
516
+
);
517
+
if(!empty($pmpro_pages[$name])) {
518
+
?>
519
+
<a target="_blank" href="post.php?post=<?php echo esc_attr( $pmpro_pages[$name] );?>&action=edit"
520
+
class="button button-secondary pmpro_page_edit"><?php esc_html_e('edit page', 'paid-memberships-pro' ); ?></a>
521
+
522
+
<a target="_blank" href="<?php echo esc_url( get_permalink($pmpro_pages[$name]) ); ?>"
523
+
class="button button-secondary pmpro_page_view"><?php esc_html_e('view page', 'paid-memberships-pro' ); ?></a>
524
+
<?php } else { ?>
525
+
526
+
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'page' => 'pmpro-pagesettings', 'createpages' => 1, 'page_name' => esc_attr( $name ) ), admin_url('admin.php') ), 'createpages', 'pmpro_pagesettings_nonce' ) ); ?>"><?php esc_html_e('Generate Page', 'paid-memberships-pro' ); ?></a>
527
+
<?php } ?>
528
+
<?php if(!empty($hint)) { ?>
529
+
<p class="description"><?php echo wp_kses_post( $hint );?></p>
530
+
<?php } ?>
531
+
</td>
532
+
</tr>
533
+
<?php } ?>
534
+
</tbody>
535
+
</table>
536
+
<p class="submit">
537
+
<input name="savesettings" type="submit" class="button button-primary"
538
+
value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' ); ?>"/>
539
+
</p>
540
+
</div> <!-- end pmpro_section_inside -->
541
+
</div> <!-- end pmpro_section -->
542
+
<?php } ?>
543
+
544
+
<?php
545
+
// Create a $template => $path array of all default page templates.
546
+
$default_templates = array(
547
+
'account' => PMPRO_DIR . '/pages/account.php',
548
+
'billing' => PMPRO_DIR . '/pages/billing.php',
549
+
'cancel' => PMPRO_DIR . '/pages/cancel.php',
550
+
'checkout' => PMPRO_DIR . '/pages/checkout.php',
551
+
'confirmation' => PMPRO_DIR . '/pages/confirmation.php',
552
+
'invoice' => PMPRO_DIR . '/pages/invoice.php',
553
+
'levels' => PMPRO_DIR . '/pages/levels.php',
554
+
'login' => PMPRO_DIR . '/pages/login.php',
555
+
'member_profile_edit' => PMPRO_DIR . '/pages/member_profile_edit.php',
556
+
);
557
+
558
+
// Filter $default_templates so that Add Ons can add their own templates.
559
+
$default_templates = apply_filters( 'pmpro_default_page_templates', $default_templates );
560
+
561
+
// Loop through each template. For each, if a custom page template is being loaded, store:
562
+
// - The custom path being loaded.
563
+
// - The version of the default template.
564
+
// - The version of the custom template.
565
+
$custom_templates = array(); // Array of $template => array( 'default_version' => $default_version, 'loaded_version' => $loaded_version, 'loaded_path' => $loaded_path ).
566
+
foreach ( $default_templates as $template => $path ) {
567
+
// Gather information about the default and loaded templates.
568
+
$default_version = pmpro_get_version_for_page_template_at_path( $path );
569
+
$loaded_path = pmpro_get_template_path_to_load( $template );
570
+
$loaded_version = pmpro_get_version_for_page_template_at_path( $loaded_path );
571
+
572
+
// If the $path and $loaded_path are different, a custom template is being loaded.
573
+
if ( $path !== $loaded_path ) {
574
+
$custom_templates[ $template ] = array(
575
+
'default_version' => $default_version,
576
+
'loaded_version' => $loaded_version,
577
+
'loaded_path' => $loaded_path,
578
+
);
579
+
}
580
+
}
581
+
582
+
// If there are custom templates, display them.
583
+
if ( ! empty( $custom_templates ) ) {
584
+
?>
585
+
<div id="pmpro-custom-page-template-settings" class="pmpro_section" data-visibility="shown" data-activated="true">
586
+
<div class="pmpro_section_toggle">
587
+
<button class="pmpro_section-toggle-button" type="button" aria-expanded="false">
588
+
<span class="dashicons dashicons-arrow-down-alt2"></span>
589
+
<?php esc_html_e( 'Custom Page Templates', 'paid-memberships-pro' ); ?>
590
+
</button>
591
+
</div>
592
+
<div class="pmpro_section_inside">
593
+
<p>
594
+
<?php esc_html_e( 'Your site is loading custom page templates. These settings allow you to change which custom template is being loaded for your frontend pages. If your custom template is causing fatal errors or blocking the checkout process, you should load the core PMPro version while you or your developer works on template compatibility.', 'paid-memberships-pro' ); ?>
595
+
</p>
596
+
<h4><?php esc_html_e( 'How to Fix Outdated Page Templates', 'paid-memberships-pro' ); ?></h4>
597
+
<ol>
598
+
<li><?php esc_html_e( 'If your templates are loaded from a third-party plugin or theme, update to the latest version or contact the developer and let them know their templates are out of date.', 'paid-memberships-pro' ); ?></li>
599
+
<li><?php esc_html_e( 'If you or your developer wrote your own templates, compare your version to the core PMPro version, make the required updates, and update the version number in your custom template.', 'paid-memberships-pro' ); ?></li>
600
+
<li><?php esc_html_e( 'If you are unable to update the custom template file, use the settings below to load the core PMPro version of the template.', 'paid-memberships-pro' ); ?></li>
601
+
</ol>
602
+
<p>
603
+
<a href="https://www.paidmembershipspro.com/documentation/templates/template-versions/" target="_blank"><?php esc_html_e( 'Docs: Template versions and outdated templates', 'paid-memberships-pro' ); ?></a>
604
+
</p>
605
+
<table class="widefat striped">
606
+
<thead>
607
+
<tr>
608
+
<th><?php esc_html_e( 'Template', 'paid-memberships-pro' ); ?></th>
609
+
<th><?php esc_html_e( 'Core PMPro Version', 'paid-memberships-pro' ); ?></th>
610
+
<th><?php esc_html_e( 'Custom Template Version', 'paid-memberships-pro' ); ?></th>
611
+
<th><?php esc_html_e( 'Action', 'paid-memberships-pro' ); ?></th>
612
+
</tr>
613
+
</thead>
614
+
<tbody>
615
+
<?php
616
+
foreach ( $custom_templates as $template => $data ) {
617
+
// Calculate data for "Custom Template Version" column.
618
+
$versions_match = $data['loaded_version'] === $data['default_version'];
619
+
$loaded_path_parts = explode('/', $data['loaded_path']);
620
+
if (strpos($data['loaded_path'], '/themes/') !== false) {
621
+
// Must be from a theme.
622
+
$loaded_file_from_name = $loaded_path_parts[ array_search('themes', $loaded_path_parts) + 1 ];
623
+
$loaded_path_source_type = __('theme', 'paid-memberships-pro');
624
+
} else {
625
+
// Must be from a plugin.
626
+
$loaded_file_from_name = $loaded_path_parts[ array_search('plugins', $loaded_path_parts) + 1 ];
627
+
$loaded_path_source_type = __('plugin', 'paid-memberships-pro');
628
+
}
629
+
630
+
// Detect the current "using page template?" setting.
631
+
$use_custom_page_template = get_option( 'pmpro_use_custom_page_template_' . $template );
632
+
if ( 'no' !== $use_custom_page_template && 'yes' != $use_custom_page_template ) {
633
+
$use_custom_page_template = ''; // Empty is "use custom page template when compatible with current PMPro version".
634
+
}
635
+
636
+
// Output the row.
637
+
?>
638
+
<tr>
639
+
<td><?php echo esc_html( $template ); ?></td>
640
+
<td>
641
+
<strong><?php echo esc_html( empty( $data['default_version'] ) ? esc_html__( 'N/A', 'paid-memberships-pro' ) : $data['default_version'] ); ?></strong>
642
+
<br />
643
+
<small><?php
644
+
// Display the source of the PMPro version from the Paid Memberships Pro plugin.
645
+
// translators: %1$s: The Paid Memberships Pro plugin folder name.
646
+
printf( esc_html__( 'Plugin: %1$s', 'paid-memberships-pro' ), '<code>paid-memberships-pro</code>' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
647
+
?></small>
648
+
</td>
649
+
<td>
650
+
<strong style="color: var(--pmpro--color--<?php echo $versions_match ? 'success' : 'error'; ?>-text);">
651
+
<?php echo esc_html( empty( $data['loaded_version'] ) ? esc_html__( 'N/A', 'paid-memberships-pro' ) : $data['loaded_version'] ); ?>
652
+
</strong>
653
+
<?php if ( $use_custom_page_template == 'yes' && ! $versions_match ) { ?>
654
+
<span class="pmpro_tag pmpro_tag-has_icon pmpro_tag-error"><?php esc_html_e( 'Outdated Template', 'paid-memberships-pro' ); ?></span>
655
+
<?php } ?>
656
+
<br />
657
+
<small><?php
658
+
// Display the source of the loaded file and type.
659
+
// translators: %1$s: The source type of the loaded file. %2$s: The theme or plugin folder name of the loaded file.
660
+
printf( esc_html__( '%1$s: %2$s', 'paid-memberships-pro' ), esc_html( ucwords( $loaded_path_source_type ) ), '<code>' . esc_html( $loaded_file_from_name ) . '</code>' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
661
+
?></small>
662
+
</td>
663
+
<td>
664
+
<?php if ( 'yes' === $use_custom_page_template && ! $versions_match ) { ?>
665
+
<span class="pmpro_tag pmpro_tag-has_icon pmpro_tag-error">
666
+
<?php } ?>
667
+
<select name="pmpro_use_custom_page_template_<?php echo esc_attr( $template ); ?>">
668
+
<option value="yes" <?php selected( $use_custom_page_template, 'yes' ); ?>>
669
+
<?php
670
+
// translators: %s: The custom page template name.
671
+
echo esc_html( sprintf( __('Custom: Always use my custom %s template.', 'paid-memberships-pro' ), $template ) );
672
+
?>
673
+
</option>
674
+
<option value="" <?php selected( $use_custom_page_template, '' ); ?>>
675
+
<?php
676
+
// translators: %s: The custom page template name.
677
+
echo esc_html( sprintf( __('Fallback: Use the core PMPro template if my custom %s template is not compatible.', 'paid-memberships-pro' ), $template ) );
678
+
?>
679
+
</option>
680
+
<option value="no" <?php selected( $use_custom_page_template, 'no' ); ?>>
681
+
<?php
682
+
// translators: %s: The custom page template name.
683
+
echo esc_html( sprintf( __('Core: Always use the core PMPro %s template.', 'paid-memberships-pro' ), $template ) );
684
+
?>
685
+
</option>
686
+
</select>
687
+
<?php if ( 'yes' === $use_custom_page_template && ! $versions_match ) { ?>
688
+
</span>
689
+
<?php } ?>
690
+
</td>
691
+
</tr>
692
+
<?php
693
+
}
694
+
?>
695
+
</tbody>
696
+
</table>
697
+
<?php
698
+
// Add a dropdown setting to disable the "outdated template" warning.
699
+
$disable_outdated_template_warning = ! empty( get_option( 'pmpro_disable_outdated_template_warning' ) );
700
+
?>
701
+
<table class="form-table">
702
+
<tbody>
703
+
<tr>
704
+
<th scope="row" valign="top">
705
+
<label for="pmpro_disable_outdated_template_warning"><?php esc_html_e( 'Disable Outdated Template Warning', 'paid-memberships-pro' ); ?></label>
706
+
</th>
707
+
<td>
708
+
<select name="pmpro_disable_outdated_template_warning">
709
+
<option value="0" <?php selected( $disable_outdated_template_warning, false ); ?>><?php esc_html_e( 'Show warning for outdated custom page templates.', 'paid-memberships-pro' ); ?></option>
710
+
<option value="1" <?php selected( $disable_outdated_template_warning, true ); ?>><?php esc_html_e( 'Do not show warning for outdated custom page templates.', 'paid-memberships-pro' ); ?></option>
711
+
</select>
712
+
<p class="description"><?php esc_html_e( 'If you are aware of the outdated custom page templates and do not want to see the warning, you can disable it here.', 'paid-memberships-pro' ); ?></p>
713
+
</td>
714
+
</tr>
715
+
</tbody>
716
+
</table>
717
+
<p class="submit">
718
+
<input name="savesettings" type="submit" class="button button-primary"
719
+
value="<?php esc_attr_e('Save Settings', 'paid-memberships-pro' ); ?>"/>
720
+
</p>
721
+
</div>
722
+
</div>
723
+
<?php
724
+
}
725
+
}
726
+
?>
727
+
</form>
728
+
729
+
<?php
730
+
require_once(dirname(__FILE__) . "/admin_footer.php");
731
+
?>
732
+