[wp-trac] [WordPress Trac] #42546: WP_Query not handling 'LIKE' correctly.
WordPress Trac
noreply at wordpress.org
Tue Nov 14 16:27:05 UTC 2017
#42546: WP_Query not handling 'LIKE' correctly.
--------------------------+-----------------------------
Reporter: tberneman | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Query | Version: 4.8.3
Severity: normal | Keywords:
Focuses: |
--------------------------+-----------------------------
I am doing custom PHP to retrieve listings (as a CPT) from the database
for a Realty Company website I'm working on and one of the criteria is
searching on the city from a search field on a form. The problem is the
generated SQL has some sort of guid in it instead of the expected percent
character normally used with LIKE. Here is the generated SQL from
WP_Query:
{{{
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON
( wp_posts.ID = mt1.post_id ) WHERE 1=1 AND ( ( wp_postmeta.meta_key =
'city' AND wp_postmeta.meta_value LIKE
'{f270e6c7d3b231242ceefa28fdd47243cac2100fe4fe8c9df633ec6f3cc2f583}fairfield{f270e6c7d3b231242ceefa28fdd47243cac2100fe4fe8c9df633ec6f3cc2f583}'
) AND ( mt1.meta_key = 'beds' AND mt1.meta_value >= '0' ) ) AND
wp_posts.post_type = 'listings' AND (wp_posts.post_status = 'publish' OR
wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR
wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
}}}
As you can see the generated code for searching the "city" field is:
{{{
wp_postmeta.meta_value LIKE
'{f270e6c7d3b231242ceefa28fdd47243cac2100fe4fe8c9df633ec6f3cc2f583}fairfield{f270e6c7d3b231242ceefa28fdd47243cac2100fe4fe8c9df633ec6f3cc2f583}'
}}}
The "expected" code should look like this:
{{{
wp_postmeta.meta_value LIKE '%fairfield%'
}}}
The form is found here: https://millersells.com/search-2/
After making selections and clicking the Search button it calls itself
with url parameters and you get one of these errors:
"Fatal error: Maximum execution time of 60 seconds exceeded in
/home/extremx1/public_html/millersells2017b/wp-includes/query.php on line
0"
OR
"Fatal error: Maximum execution time of 60 seconds exceeded in
/home/extremx1/public_html/millersells2017b/wp-includes/class-wp-query.php
on line 3090"
(Example URL with parameters:
https://millersells.com/search-2/?cf_id=37&loc=fairfield&type=SingleFamilyHome&beds=3&baths=2&min_price=0&max_price=0)
I am using this PHP code to create the query (for now I'm just working
with 2 of the search fields):
{{{
<?php
if (isset($_GET['loc'])) $location = trim($_GET['loc']); else $location =
'';
if (isset($_GET['type'])) $type = trim($_GET['type']); else $type = '';
if (isset($_GET['beds'])) $bedrooms = trim($_GET['beds']); else $bedrooms
= 0;
if (isset($_GET['baths'])) $bathrooms = trim($_GET['baths']); else
$bathrooms = 0;
if (isset($_GET['min_price'])) $min_price = trim($_GET['min_price']); else
$min_price = 0;
if (isset($_GET['max_price'])) $max_price = trim($_GET['max_price']); else
$max_price = 999999999;
$location = 'fairfield';
$args = array(
'post_type' => array( 'listings' ),
'meta_query' => array(
array(
'key' => 'city',
'value' => $location,
'type' => 'CHAR',
'compare' => 'LIKE',
),
array(
'key' => 'beds',
'value' => $bedrooms,
'compare' => '>='
)
)
);
$the_query = new WP_Query( $args );
?>
}}}
To see the generated SQL I added this code at line 2752 in wp_includes
/class-wp-query.php: echo $this->request;
Also to aid in debugging I would suggest you add a "generated_sql"
parameter to the query object that we can echo to see what the actual
generated SQL looks like. EX: {{{echo $the_query->generated_sql;}}}
Thanks!
Tim :o]
PS: Your welcome to contact me at tberneman at gmail.com
--
Ticket URL: <https://core.trac.wordpress.org/ticket/42546>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list