PluginProbe
Code Snippets / 3.2.1
Code Snippets v3.2.1
3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 3.0.1 All 64 releases
code-snippets / php / class-db.php

class-db.php in Code Snippets 3.2.1, at php/class-db.php

307 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Code_Snippets;
4
5 /**
6 * Functions used to manage the database tables
7 *
8 * @package Code_Snippets
9 */
10 class DB {
11
12 /**
13 * Unprefixed site-wide table name
14 */
15 const TABLE_NAME = 'snippets';
16
17 /**
18 * Unprefixed network-wide table name
19 */
20 const MS_TABLE_NAME = 'ms_snippets';
21
22 /**
23 * Side-wide table name
24 *
25 * @var string
26 */
27 public $table;
28
29 /**
30 * Network-wide table name
31 *
32 * @var string
33 */
34 public $ms_table;
35
36 /**
37 * Class constructor
38 */
39 public function __construct() {
40 $this->set_table_vars();
41 }
42
43 /**
44 * Register the snippet table names with WordPress
45 *
46 * @since 2.0
47 */
48 public function set_table_vars() {
49 global $wpdb;
50
51 $this->table = $wpdb->prefix . self::TABLE_NAME;
52 $this->ms_table = $wpdb->base_prefix . self::MS_TABLE_NAME;
53
54 /* Register the snippet table names with WordPress */
55 $wpdb->snippets = $this->table;
56 $wpdb->ms_snippets = $this->ms_table;
57
58 $wpdb->tables[] = self::TABLE_NAME;
59 $wpdb->ms_global_tables[] = self::MS_TABLE_NAME;
60 }
61
62 /**
63 * Validate the multisite parameter of the get_table_name() function
64 *
65 * @param bool|null $network Value of multisite parameter – true for multisite, false for single-site.
66 *
67 * @return bool Validated value of multisite parameter.
68 */
69 public static function validate_network_param( $network ) {
70
71 /* If multisite is not active, then the parameter should always be false */
72 if ( ! is_multisite() ) {
73 return false;
74 }
75
76 /* If $multisite is null, try to base it on the current admin page */
77 if ( is_null( $network ) && function_exists( 'is_network_admin' ) ) {
78 $network = is_network_admin();
79 }
80
81 return $network;
82 }
83
84 /**
85 * Return the appropriate snippet table name
86 *
87 * @param string|bool|null $multisite Whether retrieve the multisite table name (true) or the site table name (false).
88 *
89 * @return string The snippet table name
90 * @since 2.0
91 */
92 public function get_table_name( $multisite = null ) {
93
94 /* If the first parameter is a string, assume it is a table name */
95 if ( is_string( $multisite ) ) {
96 return $multisite;
97 }
98
99 /* Validate the multisite parameter */
100 $multisite = $this->validate_network_param( $multisite );
101
102 /* return the correct table name depending on the value of $multisite */
103 return $multisite ? $this->ms_table : $this->table;
104 }
105
106 /**
107 * Determine whether a database table exists.
108 *
109 * @param string $table_name Name of database table to check.
110 * @param boolean $refresh Rerun the query, instead of using a cached value.
111 *
112 * @return bool Whether the database table exists.
113 */
114 public static function table_exists( $table_name, $refresh = false ) {
115 global $wpdb;
116 static $checked = array();
117
118 if ( $refresh || ! isset( $checked[ $table_name ] ) ) {
119 $checked[ $table_name ] = $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) === $table_name; // cache pass, db call ok.
120 }
121
122 return $checked[ $table_name ];
123 }
124
125 /**
126 * Create the snippet tables if they do not already exist
127 */
128 public function create_missing_tables() {
129
130 /* Create the network snippets table if it doesn't exist */
131 if ( is_multisite() && ! self::table_exists( $this->ms_table ) ) {
132 $this->create_table( $this->ms_table );
133 }
134
135 /* Create the table if it doesn't exist */
136 if ( ! self::table_exists( $this->table ) ) {
137 $this->create_table( $this->table );
138 }
139 }
140
141 /**
142 * Create the snippet tables, or upgrade them if they already exist
143 */
144 public function create_or_upgrade_tables() {
145 if ( is_multisite() ) {
146 $this->create_table( $this->ms_table );
147 }
148
149 $this->create_table( $this->table );
150 }
151
152 /**
153 * Create a snippet table if it does not already exist
154 *
155 * @param string $table_name Name of database table.
156 */
157 public static function create_missing_table( $table_name ) {
158
159 if ( self::table_exists( $table_name ) ) {
160 return;
161 }
162
163 self::create_table( $table_name );
164 }
165
166 /**
167 * Create a single snippet table.
168 *
169 * @param string $table_name The name of the table to create.
170 *
171 * @return bool Whether the table creation was successful.
172 * @since 1.6
173 * @uses dbDelta() to apply the SQL code
174 */
175 public static function create_table( $table_name ) {
176 global $wpdb;
177 $charset_collate = $wpdb->get_charset_collate();
178
179 /* Create the database table */
180 $sql = "CREATE TABLE $table_name (
181 id BIGINT(20) NOT NULL AUTO_INCREMENT,
182 name TINYTEXT NOT NULL,
183 description TEXT NOT NULL,
184 code LONGTEXT NOT NULL,
185 tags LONGTEXT NOT NULL,
186 scope VARCHAR(15) NOT NULL DEFAULT 'global',
187 priority SMALLINT NOT NULL DEFAULT 10,
188 active TINYINT(1) NOT NULL DEFAULT 0,
189 modified DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
190 PRIMARY KEY (id),
191 KEY scope (scope),
192 KEY active (active)
193 ) $charset_collate;";
194
195 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
196 dbDelta( $sql );
197
198 $success = empty( $wpdb->last_error );
199
200 if ( $success ) {
201 do_action( 'code_snippets/create_table', $table_name );
202 }
203
204 return $success;
205 }
206
207 /**
208 * Build a list of formatting placeholders for an array of data.
209 *
210 * @param int $count Length of data.
211 * @param string $placeholder Placeholder to use. Defaults to string placeholder.
212 *
213 * @return string List of placeholders, ready for inclusion in query.
214 */
215 private static function build_format_list( $count, $placeholder = '%s' ) {
216 return implode( ',', array_fill( 0, $count, $placeholder ) );
217 }
218
219 /**
220 * Fetch a list of active snippets from a database table.
221 *
222 * @param string $table_name Name of table to fetch snippets from.
223 * @param array $scopes List of scopes to include in query.
224 * @param array $active_only Whether to only fetch active snippets from the table.
225 *
226 * @return array|false List of active snippets, if any could be retrieved.
227 *
228 * @phpcs:disable WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
229 */
230 private static function fetch_snippets_from_table( $table_name, array $scopes, $active_only = true ) {
231 global $wpdb;
232
233 $cache_key = sprintf( 'active_snippets_%s_%s', sanitize_key( join( '_', $scopes ) ), $table_name );
234 $cached_snippets = wp_cache_get( $cache_key, CACHE_GROUP );
235
236 if ( is_array( $cached_snippets ) ) {
237 return $cached_snippets;
238 }
239
240 if ( ! self::table_exists( $table_name ) ) {
241 return false;
242 }
243
244 $scopes_format = self::build_format_list( count( $scopes ) );
245 $extra_where = $active_only ? 'AND active=1' : '';
246
247 $snippets = $wpdb->get_results(
248 $wpdb->prepare(
249 "
250 SELECT id, code, scope, active
251 FROM $table_name
252 WHERE scope IN ($scopes_format) $extra_where
253 ORDER BY priority, id",
254 $scopes
255 ),
256 'ARRAY_A'
257 ); // db call ok.
258
259 // Cache the full list of snippets.
260 if ( is_array( $snippets ) ) {
261 wp_cache_set( $cache_key, $snippets, CACHE_GROUP );
262 return $snippets;
263 }
264
265 return false;
266 }
267
268 /**
269 * Generate the SQL for fetching active snippets from the database.
270 *
271 * @param array|string $scopes List of scopes to retrieve in.
272 *
273 * @return array List of active snippets, indexed by table.
274 */
275 public function fetch_active_snippets( $scopes ) {
276 $active_snippets = array();
277
278 // Ensure that the list of scopes is an array.
279 if ( ! is_array( $scopes ) ) {
280 $scopes = array( $scopes );
281 }
282
283 // Fetch the active snippets for the current site, if there are any.
284 $snippets = $this->fetch_snippets_from_table( $this->table, $scopes );
285 if ( $snippets ) {
286 $active_snippets[ $this->table ] = $snippets;
287 }
288
289 // If multisite is enabled, fetch all snippets from the network table, and filter down to only active snippets.
290 if ( is_multisite() ) {
291 $active_shared_ids = (array) get_option( 'active_shared_network_snippets', array() );
292 $ms_snippets = $this->fetch_snippets_from_table( $this->ms_table, $scopes, false );
293
294 if ( $ms_snippets ) {
295 $active_snippets[ $this->ms_table ] = array_filter(
296 $ms_snippets,
297 function ( $snippet ) use ( $active_shared_ids ) {
298 return $snippet['active'] || in_array( intval( $snippet['id'] ), $active_shared_ids, true );
299 }
300 );
301 }
302 }
303
304 return $active_snippets;
305 }
306 }
307