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 +156 -31 1.6.7 → 1.8.13 View file →
@@ -1,32 +1,115 @@
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 - * @author Eric Daams
11 + * @author David Bisset
6 12 * @package Charitable/Admin View/Settings
7 - * @copyright Copyright (c) 2018, Studio 164a
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.0
16 + * @version 1.8.9
11 17 */
12 18
13 -$active_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'general';
14 -$group = isset( $_GET['group'] ) ? $_GET['group'] : $active_tab;
15 -$sections = charitable_get_admin_settings()->get_sections();
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 = '';
16 28
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 ) {
35 + /**
36 + * Filter the return link text.
37 + *
38 + * @since 1.6.19
39 + *
40 + * @param string $default The default return link text.
41 + * @param string $active_tab The active tab.
42 + * @param string $group The current group.
43 + */
44 + $charitable_return_tab_text = apply_filters(
45 + 'charitable_settings_return_tab_text',
46 + sprintf(
47 + /* translators: %s: tab name */
48 + __( '&#8592; Return to %s', 'charitable' ),
49 + $charitable_active_tab
50 + ),
51 + $charitable_active_tab,
52 + $charitable_group
53 + );
54 +
55 + /**
56 + * Filter the return link URL.
57 + *
58 + * @since 1.6.19
59 + *
60 + * @param string $default The default return link URL
61 + * @param string $active_tab The active tab.
62 + * @param string $group The current group.
63 + */
64 + $charitable_return_tab_url = apply_filters(
65 + 'charitable_settings_return_tab_url',
66 + add_query_arg(
67 + array( 'tab' => $charitable_active_tab ),
68 + admin_url( 'admin.php?page=charitable-settings' )
69 + ),
70 + $charitable_active_tab,
71 + $charitable_group
72 + );
73 +}
74 +
17 75 ob_start();
18 76 ?>
19 77 <div id="charitable-settings" class="wrap">
20 - <h1 class="screen-reader-text"><?php echo get_admin_page_title(); ?></ha>
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' ); ?>
21 81 <h2 class="nav-tab-wrapper">
22 - <?php foreach ( $sections as $tab => $name ) : ?>
23 - <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>
24 90 <?php endforeach ?>
25 91 </h2>
26 - <?php if ( $group != $active_tab ) : ?>
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 ) : ?>
27 110 <?php /* translators: %s: active settings tab label */ ?>
28 - <p><a href="<?php echo esc_url( add_query_arg( array( 'tab' => $active_tab ), admin_url( 'admin.php?page=charitable-settings' ) ) ); ?>"><?php printf( __( '&#8592; Return to %s', 'charitable' ), $sections[ $active_tab ] ); ?></a></p>
111 + <p><a href="<?php echo esc_url( $charitable_return_tab_url ); ?>"><?php echo $charitable_return_tab_text; // phpcs:ignore ?></a></p>
29 112 <?php endif ?>
30 113 <?php
31 114 /**
32 115 * Do or render something right before the settings form.
@@ -34,29 +117,70 @@
34 117 * @since 1.0.0
35 118 *
36 119 * @param string $group The settings group we are viewing.
37 120 */
38 - do_action( 'charitable_before_admin_settings', $group );
121 + do_action( 'charitable_before_admin_settings', $charitable_group );
122 +
39 123 ?>
40 - <form method="post" action="options.php">
41 - <table class="form-table">
42 - <?php
43 - settings_fields( 'charitable_settings' );
44 124
45 - 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 ) :
46 145 ?>
47 - </table>
48 - <?php
49 - /**
50 - * Filter the submit button at the bottom of the settings table.
51 - *
52 - * @since 1.6.0
53 - *
54 - * @param string $button The button output.
55 - */
56 - echo apply_filters( 'charitable_settings_button_' . $group, get_submit_button( null, 'primary', 'submit', true, null ) );
57 - ?>
58 - </form>
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">
153 + <?php
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 );
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>
175 + <?php endif; ?>
176 +
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 +
59 183 <?php
60 184 /**
61 185 * Do or render something right after the settings form.
62 186 *
@@ -63,9 +187,10 @@
63 187 * @since 1.0.0
64 188 *
65 189 * @param string $group The settings group we are viewing.
66 190 */
67 - do_action( 'charitable_after_admin_settings', $group );
191 + do_action( 'charitable_after_admin_settings', $charitable_group );
68 192 ?>
69 193 </div>
70 194 <?php
71 -echo ob_get_clean();
195 +
196 +echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped