Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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?

share|improve this question

2 Answers 2

If you use a Syntax highlighting editor, you may be able to spot these problems easier.

Change this code:

'category_name'         => ",

To this code:

'category_name'         => '',

That will fix the syntax error in your code.

share|improve this answer
    
I accidently deleted the param for 'category_name' –  user2175705 Sep 27 '13 at 2:59
    
I don't understand your comment. Does this correction fix the problem you are having? –  Charles Clarkson Sep 27 '13 at 4:47
    
Hi Charles, I've updated my original question. This doesn't fix it, but only because I didn't post my issue properly. Thank you! –  user2175705 Sep 27 '13 at 14:39

You say that it works fine with

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

but that it breaks with

$language_sql_param = "'de,ch'"

Does it work with $language_sql_param = 'de,ch'?

Rationale:

'us,gb,ca,au,ie' != "'us,gb,ca,ie'". In the latter case, you've got extra ' characters in the string you're passing for the $language_sql_param.

share|improve this answer
    
Thanks. It doesn't seem to make an difference. The IN clause gets constructed correctly, as in AND (wp_term_relationships.term_taxonomy_id IN (27,34)). It's that extra AND wp_posts.ID = -1 that's throwing things off. –  user2175705 Sep 27 '13 at 20:47

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.