PluginProbe
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 28.1
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v28.1
28.4 28.3 28.2 28.1 28.0 27.9 27.8 27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 19.1 All 128 releases
wordpress-seo / admin / class-database-proxy.php

class-database-proxy.php in Yoast SEO – Advanced SEO with real-time guidance and built-in AI 28.1, at admin/class-database-proxy.php

310 lines 7.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * WPSEO plugin file.
4 *
5 * @package WPSEO\Admin
6 */
7
8 /**
9 * Represents the proxy for communicating with the database.
10 */
11 class WPSEO_Database_Proxy {
12
13 /**
14 * Holds the table name.
15 *
16 * @var string
17 */
18 protected $table_name;
19
20 /**
21 * Determines whether to suppress errors or not.
22 *
23 * @var bool
24 */
25 protected $suppress_errors = true;
26
27 /**
28 * Determines if this table is multisite.
29 *
30 * @var bool
31 */
32 protected $is_multisite_table = false;
33
34 /**
35 * Holds the last suppressed state.
36 *
37 * @var bool
38 */
39 protected $last_suppressed_state;
40
41 /**
42 * Holds the WordPress database object.
43 *
44 * @var wpdb
45 */
46 protected $database;
47
48 /**
49 * Holds the table prefix.
50 *
51 * @var string
52 */
53 protected $table_prefix;
54
55 /**
56 * Sets the class attributes and registers the table.
57 *
58 * @param wpdb $database The database object.
59 * @param string $table_name The table name that is represented.
60 * @param bool $suppress_errors Should the errors be suppressed.
61 * @param bool $is_multisite_table Should the table be global in multisite.
62 */
63 public function __construct( $database, $table_name, $suppress_errors = true, $is_multisite_table = false ) {
64 $this->table_name = $table_name;
65 $this->suppress_errors = (bool) $suppress_errors;
66 $this->is_multisite_table = (bool) $is_multisite_table;
67 $this->database = $database;
68
69 // If the table prefix was provided, strip it as it's handled automatically.
70 $table_prefix = $this->get_table_prefix();
71 if ( ! empty( $table_prefix ) && strpos( $this->table_name, $table_prefix ) === 0 ) {
72 $this->table_prefix = substr( $this->table_name, strlen( $table_prefix ) );
73 }
74
75 if ( ! $this->is_table_registered() ) {
76 $this->register_table();
77 }
78 }
79
80 /**
81 * Inserts data into the database.
82 *
83 * @param array $data Data to insert.
84 * @param array|string|null $format Formats for the data.
85 *
86 * @return int|false Total amount of inserted rows or false on error.
87 */
88 public function insert( array $data, $format = null ) {
89 $this->pre_execution();
90
91 $result = $this->database->insert( $this->get_table_name(), $data, $format );
92
93 $this->post_execution();
94
95 return $result;
96 }
97
98 /**
99 * Updates data in the database.
100 *
101 * @param array $data Data to update on the table.
102 * @param array $where Where condition as key => value array.
103 * @param array|string|null $format Optional. Data prepare format.
104 * @param array|string|null $where_format Optional. Where prepare format.
105 *
106 * @return int|false False when the update request is invalid, int on number of rows changed.
107 */
108 public function update( array $data, array $where, $format = null, $where_format = null ) {
109 $this->pre_execution();
110
111 $result = $this->database->update( $this->get_table_name(), $data, $where, $format, $where_format );
112
113 $this->post_execution();
114
115 return $result;
116 }
117
118 /**
119 * Upserts data in the database.
120 *
121 * Performs an insert into and if key is duplicate it will update the existing record.
122 *
123 * @param array $data Data to update on the table.
124 * @param array|null $where Unused. Where condition as key => value array.
125 * @param array|string|null $format Optional. Data prepare format.
126 * @param array|string|null $where_format Optional. Where prepare format.
127 *
128 * @return int|false False when the upsert request is invalid, int on number of rows changed.
129 */
130 public function upsert( array $data, ?array $where = null, $format = null, $where_format = null ) {
131 if ( $where_format !== null ) {
132 _deprecated_argument( __METHOD__, '7.7.0', 'The where_format argument is deprecated' );
133 }
134
135 $this->pre_execution();
136
137 $update = [];
138 $keys = [];
139 $columns = array_keys( $data );
140 foreach ( $columns as $column ) {
141 $keys[] = '`' . $column . '`';
142 $update[] = sprintf( '`%1$s` = VALUES(`%1$s`)', $column );
143 }
144
145 $query = sprintf(
146 'INSERT INTO `%1$s` (%2$s) VALUES ( %3$s ) ON DUPLICATE KEY UPDATE %4$s',
147 $this->get_table_name(),
148 implode( ', ', $keys ),
149 implode( ', ', array_fill( 0, count( $data ), '%s' ) ),
150 implode( ', ', $update ),
151 );
152
153 $result = $this->database->query(
154 $this->database->prepare(
155 $query,
156 array_values( $data ),
157 ),
158 );
159
160 $this->post_execution();
161
162 return $result;
163 }
164
165 /**
166 * Deletes a record from the database.
167 *
168 * @param array $where Where clauses for the query.
169 * @param array|string|null $format Formats for the data.
170 *
171 * @return int|false
172 */
173 public function delete( array $where, $format = null ) {
174 $this->pre_execution();
175
176 $result = $this->database->delete( $this->get_table_name(), $where, $format );
177
178 $this->post_execution();
179
180 return $result;
181 }
182
183 /**
184 * Executes the given query and returns the results.
185 *
186 * @param string $query The query to execute.
187 *
188 * @return array|object|null The resultset
189 */
190 public function get_results( $query ) {
191 $this->pre_execution();
192
193 $results = $this->database->get_results( $query );
194
195 $this->post_execution();
196
197 return $results;
198 }
199
200 /**
201 * Creates a table to the database.
202 *
203 * @param array $columns The columns to create.
204 * @param array $indexes The indexes to use.
205 *
206 * @return bool True when creation is successful.
207 */
208 public function create_table( array $columns, array $indexes = [] ) {
209 $create_table = sprintf(
210 'CREATE TABLE IF NOT EXISTS %1$s ( %2$s ) %3$s',
211 $this->get_table_name(),
212 implode( ',', array_merge( $columns, $indexes ) ),
213 $this->database->get_charset_collate(),
214 );
215
216 $this->pre_execution();
217
218 $is_created = (bool) $this->database->query( $create_table );
219
220 $this->post_execution();
221
222 return $is_created;
223 }
224
225 /**
226 * Checks if there is an error.
227 *
228 * @return bool Returns true when there is an error.
229 */
230 public function has_error() {
231 return ( $this->database->last_error !== '' );
232 }
233
234 /**
235 * Executed before a query will be ran.
236 *
237 * @return void
238 */
239 protected function pre_execution() {
240 if ( $this->suppress_errors ) {
241 $this->last_suppressed_state = $this->database->suppress_errors();
242 }
243 }
244
245 /**
246 * Executed after a query has been ran.
247 *
248 * @return void
249 */
250 protected function post_execution() {
251 if ( $this->suppress_errors ) {
252 $this->database->suppress_errors( $this->last_suppressed_state );
253 }
254 }
255
256 /**
257 * Returns the full table name.
258 *
259 * @return string Full table name including prefix.
260 */
261 public function get_table_name() {
262 return $this->get_table_prefix() . $this->table_name;
263 }
264
265 /**
266 * Returns the prefix to use for the table.
267 *
268 * @return string The table prefix depending on the database context.
269 */
270 protected function get_table_prefix() {
271 if ( $this->is_multisite_table ) {
272 return $this->database->base_prefix;
273 }
274
275 return $this->database->get_blog_prefix();
276 }
277
278 /**
279 * Registers the table with WordPress.
280 *
281 * @return void
282 */
283 protected function register_table() {
284 $table_name = $this->table_name;
285 $full_table_name = $this->get_table_name();
286
287 $this->database->$table_name = $full_table_name;
288
289 if ( $this->is_multisite_table ) {
290 $this->database->ms_global_tables[] = $table_name;
291 return;
292 }
293
294 $this->database->tables[] = $table_name;
295 }
296
297 /**
298 * Checks if the table has been registered with WordPress.
299 *
300 * @return bool True if the table is registered, false otherwise.
301 */
302 protected function is_table_registered() {
303 if ( $this->is_multisite_table ) {
304 return in_array( $this->table_name, $this->database->ms_global_tables, true );
305 }
306
307 return in_array( $this->table_name, $this->database->tables, true );
308 }
309 }
310