SQL returned by Wp_Query has wp_posts.ID = -1

Question

I have a custom loop based on these arguments (below), and for some reason when it’s run, the SQL returned has this fragment:

… AND wp_posts.ID = -1 …

And I get no results from the db. If I run the query against the db without this fragment, I get the results I need. Could someone, please, point out what’s wrong with argument list that causes this behavior?

$args = array (
    'post_status'           => 'draft',
    'posts_per_page'        => 10,
    'category_name'         => $language_sql_param, //fixed
    'meta_query'            => array(
        array(
            'key'       => 'review_rating',
            'value'     => '3',
            'compare'   => '>',
            'type'      => 'NUMERIC',
        ),
    ),
    'cache_results'          => false,
    'update_post_meta_cache' => false,
    'update_post_term_cache' => false,
    'suppress_filters' => true,
    'meta_key' => 'review_id',
    'orderby'  => 'meta_value_num',
); 

$wp_query = new WP_Query( $args );

Revised question:

I am filtering posts based on a category(s) they belong too, in my case they are country codes. Here’s the SQL that WP generates when I set $language_sql_param to this:

$language_sql_param = 'us,gb,ca,au,ie'

It works fine and returns IDs for my posts for EN speaking countries.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    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_term_relationships.term_taxonomy_id IN (20,21,28,36,37) )
        AND wp_posts.post_type = 'post'
        AND (wp_posts.post_status = 'draft')
        AND (wp_postmeta.meta_key = 'review_id'
        AND (mt1.meta_key = 'review_rating'
        AND CAST(mt1.meta_value AS SIGNED) > '3') )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 DESC
LIMIT 0, 10

When I set $language_sql_param = "'de,ch'", I get this SQL:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    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_posts.ID = -1
        AND ( wp_term_relationships.term_taxonomy_id IN (27,34) )
        AND wp_posts.post_type = 'post'
        AND (wp_posts.post_status = 'draft')
        AND (wp_postmeta.meta_key = 'review_id'
        AND (mt1.meta_key = 'review_rating'
        AND CAST(mt1.meta_value AS SIGNED) > '3') )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 DESC
LIMIT 0, 10

The SQL has this extra AND wp_posts.ID = -1. WordPress seems to correctly generate the IN clause for the categories I am filtering, as in AND (wp_term_relationships.term_taxonomy_id IN (27,34)), but because WordPress somehow adds AND wp_posts.ID = -1 condition no posts are returned.

Where is AND wp_posts.ID = -1 coming from?

0
user2175705 2 years 2019-12-28T23:32:06-05:00 0 Answers 93 views 0

Leave an answer

Browse
Browse