PluginProbe ʕ •ᴥ•ʔ
Strong Testimonials / trunk
Strong Testimonials vtrunk
3.3.3 3.3.2 3.3.1 trunk 1.0.1 2.30.9 2.31.10 2.32 2.32.1 2.32.2 2.32.3 2.32.4 2.33 2.34 2.35 2.36 2.37 2.38 2.38.1 2.39 2.39.1 2.39.2 2.39.3 2.40.0 2.40.1 2.40.2 2.40.3 2.40.4 2.40.5 2.40.6 2.40.7 2.41.0 2.41.1 2.50.0 2.50.1 2.50.2 2.50.3 2.50.4 2.51.0 2.51.1 2.51.2 2.51.3 2.51.4 2.51.5 2.51.6 2.51.7 2.51.8 2.51.9 3.0.0 3.0.1 3.0.2 3.0.3 3.1.0 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.20 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.17 3.2.18 3.2.19 3.2.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.3.0
strong-testimonials / includes / functions-activation.php
strong-testimonials / includes Last commit date
elementor 1 year ago logs 2 months ago strong-testimonials-beaver-block 1 year ago submodules 9 months ago class-strong-gutemberg.php 1 year ago class-strong-log.php 1 year ago class-strong-mail.php 1 year ago class-strong-testimonials-average-shortcode.php 1 year ago class-strong-testimonials-count-shortcode.php 1 year ago class-strong-testimonials-defaults.php 1 day ago class-strong-testimonials-form.php 2 months ago class-strong-testimonials-order.php 1 year ago class-strong-testimonials-privacy.php 1 year ago class-strong-testimonials-render.php 2 months ago class-strong-testimonials-templates.php 1 day ago class-strong-testimonials-view-shortcode.php 3 weeks ago class-strong-testimonials-view-widget.php 1 year ago class-strong-view-display.php 2 weeks ago class-strong-view-form.php 1 day ago class-strong-view-slideshow.php 2 weeks ago class-strong-view.php 2 weeks ago class-walker-strong-category-checklist-front.php 1 year ago deprecated.php 1 year ago filters.php 2 months ago functions-activation.php 1 day ago functions-content.php 11 months ago functions-image.php 6 months ago functions-rating.php 1 year ago functions-template-form.php 1 day ago functions-template.php 1 day ago functions-views.php 1 year ago functions.php 1 day ago l10n-polylang.php 1 year ago l10n-wpml.php 1 year ago post-types.php 3 weeks ago retro.php 1 year ago scripts.php 2 months ago
functions-activation.php
224 lines
1 <?php
2
3 /**
4 * Add tables for Views.
5 *
6 * @since 1.21.0
7 */
8 function wpmtst_update_tables() {
9 global $wpdb;
10 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
11
12 $charset_collate = $wpdb->get_charset_collate();
13
14 $table_name = $wpdb->prefix . 'strong_views';
15
16 $sql = "CREATE TABLE $table_name (
17 id mediumint(9) NOT NULL AUTO_INCREMENT,
18 name varchar(100) NOT NULL,
19 value text NOT NULL,
20 PRIMARY KEY (id)
21 ) $charset_collate;";
22
23 $wpdb->show_errors();
24 $result = dbDelta( $sql );
25 $wpdb->hide_errors();
26
27 if ( $wpdb->last_error ) {
28 deactivate_plugins( 'strong-testimonials/strong-testimonials.php' );
29 $message = '<p><span style="color: #CD0000;">';
30 $message .= esc_html__( 'An error occurred:', 'strong-testimonials' ) . '</span>&nbsp;';
31 $message .= esc_html__( 'The plugin has been deactivated.', 'strong-testimonials' );
32 $message .= '</p>';
33 $message .= '<p><code>' . $wpdb->last_error . '</code></p>';
34 // translators: %s is the URL to the WordPress dashboard.
35 $message .= '<p>' . sprintf( __( '<a href="%s">Go back to Dashboard</a>', 'strong-testimonials' ), esc_url( admin_url() ) ) . '</p>';
36
37 wp_die( sprintf( '<div class="error strong-view-error">%s</div>', wp_kses_post( $message ) ) );
38 }
39
40 update_option( 'wpmtst_db_version', WPMST()->get_db_version(), 'no' );
41 }
42
43 /**
44 * Returns true if any view in the table has the given mode.
45 *
46 * @since 3.2.23
47 */
48 function wpmtst_mode_view_exists( $table, $mode ) {
49 global $wpdb;
50 $rows = $wpdb->get_col( "SELECT value FROM {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
51 foreach ( $rows as $row ) {
52 $data = maybe_unserialize( $row );
53 if ( isset( $data['mode'] ) && $data['mode'] === $mode ) {
54 return true;
55 }
56 }
57 return false;
58 }
59
60 /**
61 * Create default views on plugin activation (and on admin_init as a safety net).
62 *
63 * - Single Template: protected, re-created if its stored ID no longer exists.
64 * - Display / Form: created once; skipped if any view with that mode already exists.
65 *
66 * @since 3.2.23
67 */
68 function wpmtst_create_default_views() {
69 global $wpdb;
70
71 $table = $wpdb->prefix . 'strong_views';
72 $stored_ids = get_option( 'wpmtst_default_views', array() );
73 $updated = false;
74
75 // Single Template — always ensure one view is protected.
76 // If the stored protected ID is still in the DB, nothing to do.
77 // Otherwise find the first existing single_template view and protect it,
78 // or create a new one if none exist.
79 $protected_id = absint( $stored_ids['single_template'] ?? 0 );
80 $still_exists = $protected_id > 0 && $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$table} WHERE id = %d", $protected_id ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
81
82 if ( ! $still_exists ) {
83 // Find the first existing single_template view in the DB.
84 $rows = $wpdb->get_results( "SELECT id, value FROM {$table}", ARRAY_A ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
85 $first_id = 0;
86 foreach ( $rows as $row ) {
87 $data = maybe_unserialize( $row['value'] );
88 if ( isset( $data['mode'] ) && 'single_template' === $data['mode'] ) {
89 $first_id = absint( $row['id'] );
90 break;
91 }
92 }
93
94 if ( $first_id > 0 ) {
95 // Promote the first found view to protected.
96 $stored_ids['single_template'] = $first_id;
97 $updated = true;
98 } else {
99 // No single_template view exists — create one.
100 $view = Strong_Testimonials_Defaults::get_default_view();
101 $view['mode'] = 'single_template';
102 $view['client_section'] = array(
103 array(
104 'field' => 'client_name',
105 'type' => 'text',
106 'before' => '',
107 'class' => 'testimonial-name',
108 ),
109 array(
110 'field' => 'company_name',
111 'type' => 'link',
112 'before' => '',
113 'url' => 'company_website',
114 'class' => 'testimonial-company',
115 'new_tab' => true,
116 ),
117 array(
118 'field' => 'star_rating',
119 'type' => 'rating',
120 'before' => '',
121 'class' => 'testimonial-rating',
122 ),
123 );
124 $wpdb->query( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
125 $wpdb->prepare(
126 "INSERT INTO {$table} (name, value) VALUES (%s, %s)",
127 __( 'Single Template', 'strong-testimonials' ),
128 serialize( $view ) // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
129 )
130 );
131 $new_id = absint( $wpdb->insert_id );
132 if ( $new_id > 0 ) {
133 $stored_ids['single_template'] = $new_id;
134 $updated = true;
135 }
136 }
137 }
138
139 // Testimonials Display — create once; if stored ID exists the user has already seen/deleted it.
140 if ( ! isset( $stored_ids['display'] ) && ! wpmtst_mode_view_exists( $table, 'display' ) ) {
141 $view = Strong_Testimonials_Defaults::get_default_view();
142 $view['mode'] = 'display';
143 $view['title'] = 'hidden';
144 $view['thumbnail_size'] = 'custom';
145 $view['thumbnail_width'] = 100;
146 $view['thumbnail_height'] = 100;
147
148 // Only offer fields that actually exist on the linked form.
149 $client_section = array();
150 if ( wpmtst_form_has_field( $view['form_id'], 'client_name' ) ) {
151 $client_section[] = array(
152 'field' => 'client_name',
153 'type' => 'author',
154 'before' => '',
155 'class' => 'testimonial-name',
156 );
157 }
158 if ( wpmtst_form_has_field( $view['form_id'], 'company_name' ) ) {
159 $client_section[] = array(
160 'field' => 'company_name',
161 'type' => 'link',
162 'before' => '',
163 'url' => 'company_website',
164 'class' => 'testimonial-company',
165 'new_tab' => true,
166 );
167 }
168 if ( wpmtst_form_has_field( $view['form_id'], 'star_rating' ) ) {
169 $client_section[] = array(
170 'field' => 'star_rating',
171 'type' => 'rating',
172 'before' => '',
173 'class' => 'testimonial-rating',
174 );
175 }
176 if ( $client_section ) {
177 $view['client_section'] = $client_section;
178 }
179
180 $wpdb->query( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
181 $wpdb->prepare(
182 "INSERT INTO {$table} (name, value) VALUES (%s, %s)",
183 __( 'Testimonials Display', 'strong-testimonials' ),
184 serialize( $view ) // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
185 )
186 );
187 $new_id = absint( $wpdb->insert_id );
188 if ( $new_id > 0 ) {
189 $stored_ids['display'] = $new_id;
190 $updated = true;
191 }
192 } elseif ( ! isset( $stored_ids['display'] ) && wpmtst_mode_view_exists( $table, 'display' ) ) {
193 // Existing install already has a display view — mark as seen so we never create one.
194 $stored_ids['display'] = 0;
195 $updated = true;
196 }
197
198 // Testimonials Collection Form — create once; if stored ID exists the user has already seen/deleted it.
199 if ( ! isset( $stored_ids['form'] ) && ! wpmtst_mode_view_exists( $table, 'form' ) ) {
200 $view = Strong_Testimonials_Defaults::get_default_view();
201 $view['mode'] = 'form';
202 $wpdb->query( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
203 $wpdb->prepare(
204 "INSERT INTO {$table} (name, value) VALUES (%s, %s)",
205 __( 'Testimonials Collection Form', 'strong-testimonials' ),
206 serialize( $view ) // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize
207 )
208 );
209 $new_id = absint( $wpdb->insert_id );
210 if ( $new_id > 0 ) {
211 $stored_ids['form'] = $new_id;
212 $updated = true;
213 }
214 } elseif ( ! isset( $stored_ids['form'] ) && wpmtst_mode_view_exists( $table, 'form' ) ) {
215 // Existing install already has a form view — mark as seen so we never create one.
216 $stored_ids['form'] = 0;
217 $updated = true;
218 }
219
220 if ( $updated ) {
221 update_option( 'wpmtst_default_views', $stored_ids, 'no' );
222 }
223 }
224