PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.8.13
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.8.13
1.8.13.1 1.8.13 1.8.12.3 1.8.12.2 1.8.12.1 1.8.12 1.8.11.3 1.8.11.2 1.8.11.1 1.8.11 1.6.6 1.6.60 1.6.7 1.6.8 1.6.9 1.7.0 1.7.0.1 1.7.0.11 1.7.0.12 1.7.0.14 1.7.0.2 1.7.0.3 1.7.0.5 1.7.0.6 1.7.0.7 All 212 releases
← All changes | includes/admin/views/settings/settings.php +119 -47 1.7.0.9 → 1.8.13 View file →
@@ -1,23 +1,38 @@
1 1 <?php
2 +
3 +// Exit if accessed directly.
4 +if ( ! defined( 'ABSPATH' ) ) {
5 + exit;
6 +}
7 +
2 8 /**
3 9 * Display the main settings page wrapper.
4 10 *
5 11 * @author David Bisset
6 12 * @package Charitable/Admin View/Settings
7 - * @copyright Copyright (c) 2022, WP Charitable LLC
13 + * @copyright Copyright (c) 2023, WP Charitable LLC
8 14 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9 15 * @since 1.0.0
10 - * @version 1.6.19
16 + * @version 1.8.9
11 17 */
12 18
13 -$active_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'general';
14 -$tab_no_form_tag = array ('import', 'export', 'tools' );
15 -$group = isset( $_GET['group'] ) ? $_GET['group'] : $active_tab;
16 -$sections = charitable_get_admin_settings()->get_sections();
17 -$show_return = $group != $active_tab;
19 +$charitable_active_tab = isset( $_GET['tab'] ) ? esc_html( $_GET['tab'] ) : 'general'; // phpcs:ignore
20 +$charitable_active_sub_tab = isset( $_GET['sub_tab'] ) ? esc_html( $_GET['sub_tab'] ) : ''; // phpcs:ignore
21 +$charitable_tab_no_form_tag = array( 'import', 'export', 'tools' );
22 +$charitable_group = isset( $_GET['group'] ) ? esc_html( $_GET['group'] ) : $charitable_active_tab; // phpcs:ignore
23 +$charitable_sections = charitable_get_admin_settings()->get_sections();
24 +$charitable_sub_sections = 'marketing' === $charitable_active_tab ? charitable_get_admin_settings()->get_sub_sections_marketing() : array();
25 +$charitable_newsletter_addon_active = class_exists( 'Charitable_Newsletter_Connect' );
26 +$charitable_show_return = $charitable_group !== $charitable_active_tab;
27 +$charitable_css = '';
18 28
19 -if ( $show_return ) {
29 +// Resolve the effective sub_tab for routing. Marketing always has a sub_tab; default to newsletters.
30 +if ( 'marketing' === $charitable_active_tab && '' === $charitable_active_sub_tab ) {
31 + $charitable_active_sub_tab = 'newsletters';
32 +}
33 +
34 +if ( $charitable_show_return ) {
20 35 /**
21 36 * Filter the return link text.
22 37 *
23 38 * @since 1.6.19
@@ -25,17 +40,17 @@
25 40 * @param string $default The default return link text.
26 41 * @param string $active_tab The active tab.
27 42 * @param string $group The current group.
28 43 */
29 - $return_tab_text = apply_filters(
44 + $charitable_return_tab_text = apply_filters(
30 45 'charitable_settings_return_tab_text',
31 46 sprintf(
32 47 /* translators: %s: tab name */
33 48 __( '&#8592; Return to %s', 'charitable' ),
34 - $active_tab
49 + $charitable_active_tab
35 50 ),
36 - $active_tab,
37 - $group
51 + $charitable_active_tab,
52 + $charitable_group
38 53 );
39 54
40 55 /**
41 56 * Filter the return link URL.
@@ -45,16 +60,16 @@
45 60 * @param string $default The default return link URL
46 61 * @param string $active_tab The active tab.
47 62 * @param string $group The current group.
48 63 */
49 - $return_tab_url = apply_filters(
64 + $charitable_return_tab_url = apply_filters(
50 65 'charitable_settings_return_tab_url',
51 66 add_query_arg(
52 - array( 'tab' => $active_tab ),
67 + array( 'tab' => $charitable_active_tab ),
53 68 admin_url( 'admin.php?page=charitable-settings' )
54 69 ),
55 - $active_tab,
56 - $group
70 + $charitable_active_tab,
71 + $charitable_group
57 72 );
58 73 }
59 74
60 75 ob_start();
@@ -59,19 +74,42 @@
59 74
60 75 ob_start();
61 76 ?>
62 77 <div id="charitable-settings" class="wrap">
63 - <h1 class="screen-reader-text"><?php echo get_admin_page_title(); ?></h1>
64 - <h1><?php echo get_admin_page_title(); ?></h1>
65 - <?php echo do_action( 'charitable_maybe_show_notification' ); ?>
78 + <h1 class="screen-reader-text"><?php echo get_admin_page_title(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></h1>
79 + <h1><?php echo get_admin_page_title(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></h1>
80 + <?php do_action( 'charitable_maybe_show_notification' ); ?>
66 81 <h2 class="nav-tab-wrapper">
67 - <?php foreach ( $sections as $tab => $name ) : ?>
68 - <a href="<?php echo esc_url( add_query_arg( array( 'tab' => $tab ), admin_url( 'admin.php?page=charitable-settings' ) ) ); ?>" class="nav-tab <?php echo $active_tab == $tab ? 'nav-tab-active' : ''; ?>"><?php echo $name; ?></a>
82 + <?php foreach ( $charitable_sections as $charitable_section_key => $charitable_section_name ) : ?>
83 + <?php
84 + $charitable_url_query_arg_array = array( 'tab' => $charitable_section_key );
85 + if ( 'marketing' === $charitable_section_key ) {
86 + $charitable_url_query_arg_array['sub_tab'] = 'newsletters';
87 + }
88 + ?>
89 + <a href="<?php echo esc_url( add_query_arg( $charitable_url_query_arg_array, admin_url( 'admin.php?page=charitable-settings' ) ) ); ?>" class="nav-tab nav-tab-<?php echo esc_attr( $charitable_section_key ); ?> <?php echo ( esc_attr( $charitable_active_tab ) === esc_attr( $charitable_section_key ) ) ? ' nav-tab-active' : ''; ?>"><?php echo esc_html( $charitable_section_name ); ?></a>
69 90 <?php endforeach ?>
70 91 </h2>
71 - <?php if ( $show_return ) : ?>
92 + <?php if ( 'marketing' === $charitable_active_tab && ! empty( $charitable_sub_sections ) ) : ?>
93 + <h3 class="nav-sub-tab-wrapper">
94 + <?php foreach ( $charitable_sub_sections as $charitable_sub_section_key => $charitable_sub_section_label ) :
95 + $charitable_sub_tab_slug = str_replace( 'marketing__', '', $charitable_sub_section_key );
96 + $charitable_is_active = ( $charitable_active_sub_tab === $charitable_sub_tab_slug );
97 + ?>
98 + <a href="<?php echo esc_url( add_query_arg( array( 'tab' => 'marketing', 'sub_tab' => $charitable_sub_tab_slug ), admin_url( 'admin.php?page=charitable-settings' ) ) ); ?>" class="nav-tab nav-tab-marketing nav-sub-tab-<?php echo esc_attr( $charitable_sub_tab_slug ); ?><?php echo $charitable_is_active ? ' nav-tab-active' : ''; ?>"><?php
99 + echo wp_kses(
100 + $charitable_sub_section_label,
101 + array(
102 + 'span' => array( 'class' => array() ),
103 + )
104 + );
105 + ?></a>
106 + <?php endforeach ?>
107 + </h3>
108 + <?php endif; ?>
109 + <?php if ( $charitable_show_return ) : ?>
72 110 <?php /* translators: %s: active settings tab label */ ?>
73 - <p><a href="<?php echo esc_url( $return_tab_url ); ?>"><?php echo $return_tab_text; ?></a></p>
111 + <p><a href="<?php echo esc_url( $charitable_return_tab_url ); ?>"><?php echo $charitable_return_tab_text; // phpcs:ignore ?></a></p>
74 112 <?php endif ?>
75 113 <?php
76 114 /**
77 115 * Do or render something right before the settings form.
@@ -79,37 +117,70 @@
79 117 * @since 1.0.0
80 118 *
81 119 * @param string $group The settings group we are viewing.
82 120 */
83 - do_action( 'charitable_before_admin_settings', $group );
121 + do_action( 'charitable_before_admin_settings', $charitable_group );
122 +
84 123 ?>
85 - <?php if ( ! in_array( strtolower( $active_tab ), $tab_no_form_tag ) ) : ?>
86 - <form method="post" action="options.php">
87 - <?php endif; ?>
88 - <table class="form-table">
89 - <?php
90 - if ( ! in_array( strtolower( $active_tab ), $tab_no_form_tag ) ) :
91 - settings_fields( 'charitable_settings' );
92 - endif;
93 124
94 - charitable_do_settings_fields( 'charitable_settings_' . $group, 'charitable_settings_' . $group );
125 + <?php
126 + // Donors → always show CTA in Lite.
127 + // Marketing → render the real form only on Newsletters sub-tab when the Newsletter
128 + // Connect addon is active (it works on Lite). All other Marketing sub-tabs
129 + // (conversion_tracking, google_analytics) — and Newsletters with no addon —
130 + // render their CTA via the charitable_pro_settings_cta action.
131 + $charitable_show_cta = 'donors' === $charitable_active_tab
132 + || ( 'marketing' === $charitable_active_tab
133 + && ( 'newsletters' !== $charitable_active_sub_tab || ! $charitable_newsletter_addon_active )
134 + );
135 +
136 + // When rendering the real form for the Newsletters sub-tab, route fields to the
137 + // marketing__newsletters group. The legacy addon still hooks into the extensions
138 + // section, so we use 'extensions' as the field-group key for the form (see the
139 + // bridge in Charitable_Settings::register_settings()).
140 + if ( 'marketing' === $charitable_active_tab && 'newsletters' === $charitable_active_sub_tab && $charitable_newsletter_addon_active && empty( $_GET['group'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
141 + $charitable_group = 'extensions';
142 + }
143 +
144 + if ( $charitable_show_cta ) :
95 145 ?>
96 - </table>
97 - <?php if ( ! in_array( strtolower( $active_tab ), $tab_no_form_tag ) ) : ?>
146 + <?php do_action( 'charitable_pro_settings_cta', $charitable_active_tab ); ?>
147 + <?php else : ?>
148 +
149 + <?php if ( ! in_array( strtolower( $charitable_active_tab ), $charitable_tab_no_form_tag ) ) : // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict ?>
150 + <form method="post" action="options.php">
151 + <?php endif; ?>
152 + <table class="form-table">
98 153 <?php
99 - /**
100 - * Filter the submit button at the bottom of the settings table.
101 - *
102 - * @since 1.6.0
103 - *
104 - * @param string $button The button output.
105 - */
106 - echo apply_filters( 'charitable_settings_button_' . $group, get_submit_button( null, 'primary', 'submit', true, null ) );
154 + if ( ! in_array( strtolower( $charitable_active_tab ), $charitable_tab_no_form_tag ) ) : // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
155 + settings_fields( 'charitable_settings' );
156 + endif;
157 +
158 + charitable_do_settings_fields( 'charitable_settings_' . $charitable_group, 'charitable_settings_' . $charitable_group );
107 159 ?>
160 + </table>
161 + <?php if ( ! in_array( strtolower( $charitable_active_tab ), $charitable_tab_no_form_tag ) ) : // phpcs:ignore ?>
162 + <?php
163 + /**
164 + * Filter the submit button at the bottom of the settings table.
165 + *
166 + * @since 1.6.0
167 + *
168 + * @param string $button The button output.
169 + */
170 + echo apply_filters( 'charitable_settings_button_' . $charitable_group, get_submit_button( null, 'primary', 'submit', true, null ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
171 + ?>
172 + <?php endif; ?>
173 + <?php if ( ! in_array( strtolower( $charitable_active_tab ), $charitable_tab_no_form_tag ) ) : // phpcs:ignore ?>
174 + </form>
108 175 <?php endif; ?>
109 - <?php if ( ! in_array( strtolower( $active_tab ), $tab_no_form_tag ) ) : ?>
110 - </form>
176 +
111 177 <?php endif; ?>
178 +
179 + <?php if ( 'security' === $charitable_active_tab) : ?>
180 + <?php do_action( 'charitable_pro_settings_cta', $charitable_active_tab ); ?>
181 + <?php endif; ?>
182 +
112 183 <?php
113 184 /**
114 185 * Do or render something right after the settings form.
115 186 *
@@ -116,9 +187,10 @@
116 187 * @since 1.0.0
117 188 *
118 189 * @param string $group The settings group we are viewing.
119 190 */
120 - do_action( 'charitable_after_admin_settings', $group );
191 + do_action( 'charitable_after_admin_settings', $charitable_group );
121 192 ?>
122 193 </div>
123 194 <?php
124 -echo ob_get_clean();
195 +
196 +echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped