Edit File by line
/home/zeestwma/ceyloniy.../wp-inclu...
File: class-wp-meta-query.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* Meta API: WP_Meta_Query class
[2] Fix | Delete
*
[3] Fix | Delete
* @package WordPress
[4] Fix | Delete
* @subpackage Meta
[5] Fix | Delete
* @since 4.4.0
[6] Fix | Delete
*/
[7] Fix | Delete
[8] Fix | Delete
/**
[9] Fix | Delete
* Core class used to implement meta queries for the Meta API.
[10] Fix | Delete
*
[11] Fix | Delete
* Used for generating SQL clauses that filter a primary query according to metadata keys and values.
[12] Fix | Delete
*
[13] Fix | Delete
* WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query,
[14] Fix | Delete
*
[15] Fix | Delete
* to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached
[16] Fix | Delete
* to the primary SQL query string.
[17] Fix | Delete
*
[18] Fix | Delete
* @since 3.2.0
[19] Fix | Delete
*/
[20] Fix | Delete
#[AllowDynamicProperties]
[21] Fix | Delete
class WP_Meta_Query {
[22] Fix | Delete
/**
[23] Fix | Delete
* Array of metadata queries.
[24] Fix | Delete
*
[25] Fix | Delete
* See WP_Meta_Query::__construct() for information on meta query arguments.
[26] Fix | Delete
*
[27] Fix | Delete
* @since 3.2.0
[28] Fix | Delete
* @var array
[29] Fix | Delete
*/
[30] Fix | Delete
public $queries = array();
[31] Fix | Delete
[32] Fix | Delete
/**
[33] Fix | Delete
* The relation between the queries. Can be one of 'AND' or 'OR'.
[34] Fix | Delete
*
[35] Fix | Delete
* @since 3.2.0
[36] Fix | Delete
* @var string
[37] Fix | Delete
*/
[38] Fix | Delete
public $relation;
[39] Fix | Delete
[40] Fix | Delete
/**
[41] Fix | Delete
* Database table to query for the metadata.
[42] Fix | Delete
*
[43] Fix | Delete
* @since 4.1.0
[44] Fix | Delete
* @var string
[45] Fix | Delete
*/
[46] Fix | Delete
public $meta_table;
[47] Fix | Delete
[48] Fix | Delete
/**
[49] Fix | Delete
* Column in meta_table that represents the ID of the object the metadata belongs to.
[50] Fix | Delete
*
[51] Fix | Delete
* @since 4.1.0
[52] Fix | Delete
* @var string
[53] Fix | Delete
*/
[54] Fix | Delete
public $meta_id_column;
[55] Fix | Delete
[56] Fix | Delete
/**
[57] Fix | Delete
* Database table that where the metadata's objects are stored (eg $wpdb->users).
[58] Fix | Delete
*
[59] Fix | Delete
* @since 4.1.0
[60] Fix | Delete
* @var string
[61] Fix | Delete
*/
[62] Fix | Delete
public $primary_table;
[63] Fix | Delete
[64] Fix | Delete
/**
[65] Fix | Delete
* Column in primary_table that represents the ID of the object.
[66] Fix | Delete
*
[67] Fix | Delete
* @since 4.1.0
[68] Fix | Delete
* @var string
[69] Fix | Delete
*/
[70] Fix | Delete
public $primary_id_column;
[71] Fix | Delete
[72] Fix | Delete
/**
[73] Fix | Delete
* A flat list of table aliases used in JOIN clauses.
[74] Fix | Delete
*
[75] Fix | Delete
* @since 4.1.0
[76] Fix | Delete
* @var array
[77] Fix | Delete
*/
[78] Fix | Delete
protected $table_aliases = array();
[79] Fix | Delete
[80] Fix | Delete
/**
[81] Fix | Delete
* A flat list of clauses, keyed by clause 'name'.
[82] Fix | Delete
*
[83] Fix | Delete
* @since 4.2.0
[84] Fix | Delete
* @var array
[85] Fix | Delete
*/
[86] Fix | Delete
protected $clauses = array();
[87] Fix | Delete
[88] Fix | Delete
/**
[89] Fix | Delete
* Whether the query contains any OR relations.
[90] Fix | Delete
*
[91] Fix | Delete
* @since 4.3.0
[92] Fix | Delete
* @var bool
[93] Fix | Delete
*/
[94] Fix | Delete
protected $has_or_relation = false;
[95] Fix | Delete
[96] Fix | Delete
/**
[97] Fix | Delete
* Constructor.
[98] Fix | Delete
*
[99] Fix | Delete
* @since 3.2.0
[100] Fix | Delete
* @since 4.2.0 Introduced support for naming query clauses by associative array keys.
[101] Fix | Delete
* @since 5.1.0 Introduced `$compare_key` clause parameter, which enables LIKE key matches.
[102] Fix | Delete
* @since 5.3.0 Increased the number of operators available to `$compare_key`. Introduced `$type_key`,
[103] Fix | Delete
* which enables the `$key` to be cast to a new data type for comparisons.
[104] Fix | Delete
*
[105] Fix | Delete
* @param array $meta_query {
[106] Fix | Delete
* Array of meta query clauses. When first-order clauses or sub-clauses use strings as
[107] Fix | Delete
* their array keys, they may be referenced in the 'orderby' parameter of the parent query.
[108] Fix | Delete
*
[109] Fix | Delete
* @type string $relation Optional. The MySQL keyword used to join the clauses of the query.
[110] Fix | Delete
* Accepts 'AND' or 'OR'. Default 'AND'.
[111] Fix | Delete
* @type array ...$0 {
[112] Fix | Delete
* Optional. An array of first-order clause parameters, or another fully-formed meta query.
[113] Fix | Delete
*
[114] Fix | Delete
* @type string|string[] $key Meta key or keys to filter by.
[115] Fix | Delete
* @type string $compare_key MySQL operator used for comparing the $key. Accepts:
[116] Fix | Delete
* - '='
[117] Fix | Delete
* - '!='
[118] Fix | Delete
* - 'LIKE'
[119] Fix | Delete
* - 'NOT LIKE'
[120] Fix | Delete
* - 'IN'
[121] Fix | Delete
* - 'NOT IN'
[122] Fix | Delete
* - 'REGEXP'
[123] Fix | Delete
* - 'NOT REGEXP'
[124] Fix | Delete
* - 'RLIKE'
[125] Fix | Delete
* - 'EXISTS' (alias of '=')
[126] Fix | Delete
* - 'NOT EXISTS' (alias of '!=')
[127] Fix | Delete
* Default is 'IN' when `$key` is an array, '=' otherwise.
[128] Fix | Delete
* @type string $type_key MySQL data type that the meta_key column will be CAST to for
[129] Fix | Delete
* comparisons. Accepts 'BINARY' for case-sensitive regular expression
[130] Fix | Delete
* comparisons. Default is ''.
[131] Fix | Delete
* @type string|string[] $value Meta value or values to filter by.
[132] Fix | Delete
* @type string $compare MySQL operator used for comparing the $value. Accepts:
[133] Fix | Delete
* - '='
[134] Fix | Delete
* - '!='
[135] Fix | Delete
* - '>'
[136] Fix | Delete
* - '>='
[137] Fix | Delete
* - '<'
[138] Fix | Delete
* - '<='
[139] Fix | Delete
* - 'LIKE'
[140] Fix | Delete
* - 'NOT LIKE'
[141] Fix | Delete
* - 'IN'
[142] Fix | Delete
* - 'NOT IN'
[143] Fix | Delete
* - 'BETWEEN'
[144] Fix | Delete
* - 'NOT BETWEEN'
[145] Fix | Delete
* - 'REGEXP'
[146] Fix | Delete
* - 'NOT REGEXP'
[147] Fix | Delete
* - 'RLIKE'
[148] Fix | Delete
* - 'EXISTS'
[149] Fix | Delete
* - 'NOT EXISTS'
[150] Fix | Delete
* Default is 'IN' when `$value` is an array, '=' otherwise.
[151] Fix | Delete
* @type string $type MySQL data type that the meta_value column will be CAST to for
[152] Fix | Delete
* comparisons. Accepts:
[153] Fix | Delete
* - 'NUMERIC'
[154] Fix | Delete
* - 'BINARY'
[155] Fix | Delete
* - 'CHAR'
[156] Fix | Delete
* - 'DATE'
[157] Fix | Delete
* - 'DATETIME'
[158] Fix | Delete
* - 'DECIMAL'
[159] Fix | Delete
* - 'SIGNED'
[160] Fix | Delete
* - 'TIME'
[161] Fix | Delete
* - 'UNSIGNED'
[162] Fix | Delete
* Default is 'CHAR'.
[163] Fix | Delete
* }
[164] Fix | Delete
* }
[165] Fix | Delete
*/
[166] Fix | Delete
public function __construct( $meta_query = array() ) {
[167] Fix | Delete
if ( ! $meta_query ) {
[168] Fix | Delete
return;
[169] Fix | Delete
}
[170] Fix | Delete
[171] Fix | Delete
if ( isset( $meta_query['relation'] ) && 'OR' === strtoupper( $meta_query['relation'] ) ) {
[172] Fix | Delete
$this->relation = 'OR';
[173] Fix | Delete
} else {
[174] Fix | Delete
$this->relation = 'AND';
[175] Fix | Delete
}
[176] Fix | Delete
[177] Fix | Delete
$this->queries = $this->sanitize_query( $meta_query );
[178] Fix | Delete
}
[179] Fix | Delete
[180] Fix | Delete
/**
[181] Fix | Delete
* Ensures the 'meta_query' argument passed to the class constructor is well-formed.
[182] Fix | Delete
*
[183] Fix | Delete
* Eliminates empty items and ensures that a 'relation' is set.
[184] Fix | Delete
*
[185] Fix | Delete
* @since 4.1.0
[186] Fix | Delete
*
[187] Fix | Delete
* @param array $queries Array of query clauses.
[188] Fix | Delete
* @return array Sanitized array of query clauses.
[189] Fix | Delete
*/
[190] Fix | Delete
public function sanitize_query( $queries ) {
[191] Fix | Delete
$clean_queries = array();
[192] Fix | Delete
[193] Fix | Delete
if ( ! is_array( $queries ) ) {
[194] Fix | Delete
return $clean_queries;
[195] Fix | Delete
}
[196] Fix | Delete
[197] Fix | Delete
foreach ( $queries as $key => $query ) {
[198] Fix | Delete
if ( 'relation' === $key ) {
[199] Fix | Delete
$relation = $query;
[200] Fix | Delete
[201] Fix | Delete
} elseif ( ! is_array( $query ) ) {
[202] Fix | Delete
continue;
[203] Fix | Delete
[204] Fix | Delete
// First-order clause.
[205] Fix | Delete
} elseif ( $this->is_first_order_clause( $query ) ) {
[206] Fix | Delete
if ( isset( $query['value'] ) && array() === $query['value'] ) {
[207] Fix | Delete
unset( $query['value'] );
[208] Fix | Delete
}
[209] Fix | Delete
[210] Fix | Delete
$clean_queries[ $key ] = $query;
[211] Fix | Delete
[212] Fix | Delete
// Otherwise, it's a nested query, so we recurse.
[213] Fix | Delete
} else {
[214] Fix | Delete
$cleaned_query = $this->sanitize_query( $query );
[215] Fix | Delete
[216] Fix | Delete
if ( ! empty( $cleaned_query ) ) {
[217] Fix | Delete
$clean_queries[ $key ] = $cleaned_query;
[218] Fix | Delete
}
[219] Fix | Delete
}
[220] Fix | Delete
}
[221] Fix | Delete
[222] Fix | Delete
if ( empty( $clean_queries ) ) {
[223] Fix | Delete
return $clean_queries;
[224] Fix | Delete
}
[225] Fix | Delete
[226] Fix | Delete
// Sanitize the 'relation' key provided in the query.
[227] Fix | Delete
if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) {
[228] Fix | Delete
$clean_queries['relation'] = 'OR';
[229] Fix | Delete
$this->has_or_relation = true;
[230] Fix | Delete
[231] Fix | Delete
/*
[232] Fix | Delete
* If there is only a single clause, call the relation 'OR'.
[233] Fix | Delete
* This value will not actually be used to join clauses, but it
[234] Fix | Delete
* simplifies the logic around combining key-only queries.
[235] Fix | Delete
*/
[236] Fix | Delete
} elseif ( 1 === count( $clean_queries ) ) {
[237] Fix | Delete
$clean_queries['relation'] = 'OR';
[238] Fix | Delete
[239] Fix | Delete
// Default to AND.
[240] Fix | Delete
} else {
[241] Fix | Delete
$clean_queries['relation'] = 'AND';
[242] Fix | Delete
}
[243] Fix | Delete
[244] Fix | Delete
return $clean_queries;
[245] Fix | Delete
}
[246] Fix | Delete
[247] Fix | Delete
/**
[248] Fix | Delete
* Determines whether a query clause is first-order.
[249] Fix | Delete
*
[250] Fix | Delete
* A first-order meta query clause is one that has either a 'key' or
[251] Fix | Delete
* a 'value' array key.
[252] Fix | Delete
*
[253] Fix | Delete
* @since 4.1.0
[254] Fix | Delete
*
[255] Fix | Delete
* @param array $query Meta query arguments.
[256] Fix | Delete
* @return bool Whether the query clause is a first-order clause.
[257] Fix | Delete
*/
[258] Fix | Delete
protected function is_first_order_clause( $query ) {
[259] Fix | Delete
return isset( $query['key'] ) || isset( $query['value'] );
[260] Fix | Delete
}
[261] Fix | Delete
[262] Fix | Delete
/**
[263] Fix | Delete
* Constructs a meta query based on 'meta_*' query vars
[264] Fix | Delete
*
[265] Fix | Delete
* @since 3.2.0
[266] Fix | Delete
*
[267] Fix | Delete
* @param array $qv The query variables.
[268] Fix | Delete
*/
[269] Fix | Delete
public function parse_query_vars( $qv ) {
[270] Fix | Delete
$meta_query = array();
[271] Fix | Delete
[272] Fix | Delete
/*
[273] Fix | Delete
* For orderby=meta_value to work correctly, simple query needs to be
[274] Fix | Delete
* first (so that its table join is against an unaliased meta table) and
[275] Fix | Delete
* needs to be its own clause (so it doesn't interfere with the logic of
[276] Fix | Delete
* the rest of the meta_query).
[277] Fix | Delete
*/
[278] Fix | Delete
$primary_meta_query = array();
[279] Fix | Delete
foreach ( array( 'key', 'compare', 'type', 'compare_key', 'type_key' ) as $key ) {
[280] Fix | Delete
if ( ! empty( $qv[ "meta_$key" ] ) ) {
[281] Fix | Delete
$primary_meta_query[ $key ] = $qv[ "meta_$key" ];
[282] Fix | Delete
}
[283] Fix | Delete
}
[284] Fix | Delete
[285] Fix | Delete
// WP_Query sets 'meta_value' = '' by default.
[286] Fix | Delete
if ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) {
[287] Fix | Delete
$primary_meta_query['value'] = $qv['meta_value'];
[288] Fix | Delete
}
[289] Fix | Delete
[290] Fix | Delete
$existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array();
[291] Fix | Delete
[292] Fix | Delete
if ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) {
[293] Fix | Delete
$meta_query = array(
[294] Fix | Delete
'relation' => 'AND',
[295] Fix | Delete
$primary_meta_query,
[296] Fix | Delete
$existing_meta_query,
[297] Fix | Delete
);
[298] Fix | Delete
} elseif ( ! empty( $primary_meta_query ) ) {
[299] Fix | Delete
$meta_query = array(
[300] Fix | Delete
$primary_meta_query,
[301] Fix | Delete
);
[302] Fix | Delete
} elseif ( ! empty( $existing_meta_query ) ) {
[303] Fix | Delete
$meta_query = $existing_meta_query;
[304] Fix | Delete
}
[305] Fix | Delete
[306] Fix | Delete
$this->__construct( $meta_query );
[307] Fix | Delete
}
[308] Fix | Delete
[309] Fix | Delete
/**
[310] Fix | Delete
* Returns the appropriate alias for the given meta type if applicable.
[311] Fix | Delete
*
[312] Fix | Delete
* @since 3.7.0
[313] Fix | Delete
*
[314] Fix | Delete
* @param string $type MySQL type to cast meta_value.
[315] Fix | Delete
* @return string MySQL type.
[316] Fix | Delete
*/
[317] Fix | Delete
public function get_cast_for_type( $type = '' ) {
[318] Fix | Delete
if ( empty( $type ) ) {
[319] Fix | Delete
return 'CHAR';
[320] Fix | Delete
}
[321] Fix | Delete
[322] Fix | Delete
$meta_type = strtoupper( $type );
[323] Fix | Delete
[324] Fix | Delete
if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) {
[325] Fix | Delete
return 'CHAR';
[326] Fix | Delete
}
[327] Fix | Delete
[328] Fix | Delete
if ( 'NUMERIC' === $meta_type ) {
[329] Fix | Delete
$meta_type = 'SIGNED';
[330] Fix | Delete
}
[331] Fix | Delete
[332] Fix | Delete
return $meta_type;
[333] Fix | Delete
}
[334] Fix | Delete
[335] Fix | Delete
/**
[336] Fix | Delete
* Generates SQL clauses to be appended to a main query.
[337] Fix | Delete
*
[338] Fix | Delete
* @since 3.2.0
[339] Fix | Delete
*
[340] Fix | Delete
* @param string $type Type of meta. Possible values include but are not limited
[341] Fix | Delete
* to 'post', 'comment', 'blog', 'term', and 'user'.
[342] Fix | Delete
* @param string $primary_table Database table where the object being filtered is stored (eg wp_users).
[343] Fix | Delete
* @param string $primary_id_column ID column for the filtered object in $primary_table.
[344] Fix | Delete
* @param object $context Optional. The main query object that corresponds to the type, for
[345] Fix | Delete
* example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
[346] Fix | Delete
* Default null.
[347] Fix | Delete
* @return string[]|false {
[348] Fix | Delete
* Array containing JOIN and WHERE SQL clauses to append to the main query,
[349] Fix | Delete
* or false if no table exists for the requested meta type.
[350] Fix | Delete
*
[351] Fix | Delete
* @type string $join SQL fragment to append to the main JOIN clause.
[352] Fix | Delete
* @type string $where SQL fragment to append to the main WHERE clause.
[353] Fix | Delete
* }
[354] Fix | Delete
*/
[355] Fix | Delete
public function get_sql( $type, $primary_table, $primary_id_column, $context = null ) {
[356] Fix | Delete
$meta_table = _get_meta_table( $type );
[357] Fix | Delete
if ( ! $meta_table ) {
[358] Fix | Delete
return false;
[359] Fix | Delete
}
[360] Fix | Delete
[361] Fix | Delete
$this->table_aliases = array();
[362] Fix | Delete
[363] Fix | Delete
$this->meta_table = $meta_table;
[364] Fix | Delete
$this->meta_id_column = sanitize_key( $type . '_id' );
[365] Fix | Delete
[366] Fix | Delete
$this->primary_table = $primary_table;
[367] Fix | Delete
$this->primary_id_column = $primary_id_column;
[368] Fix | Delete
[369] Fix | Delete
$sql = $this->get_sql_clauses();
[370] Fix | Delete
[371] Fix | Delete
/*
[372] Fix | Delete
* If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should
[373] Fix | Delete
* be LEFT. Otherwise posts with no metadata will be excluded from results.
[374] Fix | Delete
*/
[375] Fix | Delete
if ( str_contains( $sql['join'], 'LEFT JOIN' ) ) {
[376] Fix | Delete
$sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] );
[377] Fix | Delete
}
[378] Fix | Delete
[379] Fix | Delete
/**
[380] Fix | Delete
* Filters the meta query's generated SQL.
[381] Fix | Delete
*
[382] Fix | Delete
* @since 3.1.0
[383] Fix | Delete
*
[384] Fix | Delete
* @param string[] $sql Array containing the query's JOIN and WHERE clauses.
[385] Fix | Delete
* @param array $queries Array of meta queries.
[386] Fix | Delete
* @param string $type Type of meta. Possible values include but are not limited
[387] Fix | Delete
* to 'post', 'comment', 'blog', 'term', and 'user'.
[388] Fix | Delete
* @param string $primary_table Primary table.
[389] Fix | Delete
* @param string $primary_id_column Primary column ID.
[390] Fix | Delete
* @param object $context The main query object that corresponds to the type, for
[391] Fix | Delete
* example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
[392] Fix | Delete
*/
[393] Fix | Delete
return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) );
[394] Fix | Delete
}
[395] Fix | Delete
[396] Fix | Delete
/**
[397] Fix | Delete
* Generates SQL clauses to be appended to a main query.
[398] Fix | Delete
*
[399] Fix | Delete
* Called by the public WP_Meta_Query::get_sql(), this method is abstracted
[400] Fix | Delete
* out to maintain parity with the other Query classes.
[401] Fix | Delete
*
[402] Fix | Delete
* @since 4.1.0
[403] Fix | Delete
*
[404] Fix | Delete
* @return string[] {
[405] Fix | Delete
* Array containing JOIN and WHERE SQL clauses to append to the main query.
[406] Fix | Delete
*
[407] Fix | Delete
* @type string $join SQL fragment to append to the main JOIN clause.
[408] Fix | Delete
* @type string $where SQL fragment to append to the main WHERE clause.
[409] Fix | Delete
* }
[410] Fix | Delete
*/
[411] Fix | Delete
protected function get_sql_clauses() {
[412] Fix | Delete
/*
[413] Fix | Delete
* $queries are passed by reference to get_sql_for_query() for recursion.
[414] Fix | Delete
* To keep $this->queries unaltered, pass a copy.
[415] Fix | Delete
*/
[416] Fix | Delete
$queries = $this->queries;
[417] Fix | Delete
$sql = $this->get_sql_for_query( $queries );
[418] Fix | Delete
[419] Fix | Delete
if ( ! empty( $sql['where'] ) ) {
[420] Fix | Delete
$sql['where'] = ' AND ' . $sql['where'];
[421] Fix | Delete
}
[422] Fix | Delete
[423] Fix | Delete
return $sql;
[424] Fix | Delete
}
[425] Fix | Delete
[426] Fix | Delete
/**
[427] Fix | Delete
* Generates SQL clauses for a single query array.
[428] Fix | Delete
*
[429] Fix | Delete
* If nested subqueries are found, this method recurses the tree to
[430] Fix | Delete
* produce the properly nested SQL.
[431] Fix | Delete
*
[432] Fix | Delete
* @since 4.1.0
[433] Fix | Delete
*
[434] Fix | Delete
* @param array $query Query to parse (passed by reference).
[435] Fix | Delete
* @param int $depth Optional. Number of tree levels deep we currently are.
[436] Fix | Delete
* Used to calculate indentation. Default 0.
[437] Fix | Delete
* @return string[] {
[438] Fix | Delete
* Array containing JOIN and WHERE SQL clauses to append to a single query array.
[439] Fix | Delete
*
[440] Fix | Delete
* @type string $join SQL fragment to append to the main JOIN clause.
[441] Fix | Delete
* @type string $where SQL fragment to append to the main WHERE clause.
[442] Fix | Delete
* }
[443] Fix | Delete
*/
[444] Fix | Delete
protected function get_sql_for_query( &$query, $depth = 0 ) {
[445] Fix | Delete
$sql_chunks = array(
[446] Fix | Delete
'join' => array(),
[447] Fix | Delete
'where' => array(),
[448] Fix | Delete
);
[449] Fix | Delete
[450] Fix | Delete
$sql = array(
[451] Fix | Delete
'join' => '',
[452] Fix | Delete
'where' => '',
[453] Fix | Delete
);
[454] Fix | Delete
[455] Fix | Delete
$indent = '';
[456] Fix | Delete
for ( $i = 0; $i < $depth; $i++ ) {
[457] Fix | Delete
$indent .= ' ';
[458] Fix | Delete
}
[459] Fix | Delete
[460] Fix | Delete
foreach ( $query as $key => &$clause ) {
[461] Fix | Delete
if ( 'relation' === $key ) {
[462] Fix | Delete
$relation = $query['relation'];
[463] Fix | Delete
} elseif ( is_array( $clause ) ) {
[464] Fix | Delete
[465] Fix | Delete
// This is a first-order clause.
[466] Fix | Delete
if ( $this->is_first_order_clause( $clause ) ) {
[467] Fix | Delete
$clause_sql = $this->get_sql_for_clause( $clause, $query, $key );
[468] Fix | Delete
[469] Fix | Delete
$where_count = count( $clause_sql['where'] );
[470] Fix | Delete
if ( ! $where_count ) {
[471] Fix | Delete
$sql_chunks['where'][] = '';
[472] Fix | Delete
} elseif ( 1 === $where_count ) {
[473] Fix | Delete
$sql_chunks['where'][] = $clause_sql['where'][0];
[474] Fix | Delete
} else {
[475] Fix | Delete
$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';
[476] Fix | Delete
}
[477] Fix | Delete
[478] Fix | Delete
$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );
[479] Fix | Delete
// This is a subquery, so we recurse.
[480] Fix | Delete
} else {
[481] Fix | Delete
$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );
[482] Fix | Delete
[483] Fix | Delete
$sql_chunks['where'][] = $clause_sql['where'];
[484] Fix | Delete
$sql_chunks['join'][] = $clause_sql['join'];
[485] Fix | Delete
}
[486] Fix | Delete
}
[487] Fix | Delete
}
[488] Fix | Delete
[489] Fix | Delete
// Filter to remove empties.
[490] Fix | Delete
$sql_chunks['join'] = array_filter( $sql_chunks['join'] );
[491] Fix | Delete
$sql_chunks['where'] = array_filter( $sql_chunks['where'] );
[492] Fix | Delete
[493] Fix | Delete
if ( empty( $relation ) ) {
[494] Fix | Delete
$relation = 'AND';
[495] Fix | Delete
}
[496] Fix | Delete
[497] Fix | Delete
// Filter duplicate JOIN clauses and combine into a single string.
[498] Fix | Delete
if ( ! empty( $sql_chunks['join'] ) ) {
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function