最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

taxonomy - Remove category from query (show all posts in archive.php) pre_get_posts()

matteradmin8PV0评论

I am using pre_get_posts() to allow all posts to be displayed on any category archive. This is because I will provide a javascript sorting and filtering method using isotope.js. Any category page will output all posts, but any that aren't a part of that category will initially be hidden.

function show_all_cats( $query ) {
    if ( !$query->is_main_query() ){
        return;
    }
    if ( is_admin() ){
        return;
    }
    if ( $query->is_archive ) {
        $query->set('cat', ''); //here is the problem
        var_dump($query);
        return;
    }
    return;
}
add_action( 'pre_get_posts', 'show_all_cats' );

I have tried setting 'cat' to 0, null, '' and '-' . $currentcategoryid. They all either display only posts that would be displayed otherwise (all in category) or none.

I tried using query_posts() which also didn't work. I was also told:

manipulating taxonomies might require re-running meta queries processing.

I am using pre_get_posts() to allow all posts to be displayed on any category archive. This is because I will provide a javascript sorting and filtering method using isotope.js. Any category page will output all posts, but any that aren't a part of that category will initially be hidden.

function show_all_cats( $query ) {
    if ( !$query->is_main_query() ){
        return;
    }
    if ( is_admin() ){
        return;
    }
    if ( $query->is_archive ) {
        $query->set('cat', ''); //here is the problem
        var_dump($query);
        return;
    }
    return;
}
add_action( 'pre_get_posts', 'show_all_cats' );

I have tried setting 'cat' to 0, null, '' and '-' . $currentcategoryid. They all either display only posts that would be displayed otherwise (all in category) or none.

I tried using query_posts() which also didn't work. I was also told:

manipulating taxonomies might require re-running meta queries processing.

Share Improve this question edited Jan 29, 2014 at 13:41 kaiser 51k27 gold badges151 silver badges245 bronze badges asked Jan 29, 2014 at 13:24 BillBill 16510 bronze badges
Add a comment  | 

4 Answers 4

Reset to default 1

Just unsetting the cat variable probably isn't enough. The pre_get_posts hook happens after the query variables have already been parsed. So there's probably a tax_query with the taxonomy = category and the terms = your category.

You're already dumping the $query in your code, presumably for debugging. So, look at what you're actually dumping. Do you see the tax_query? Change your code to adjust that $query to have what you want it to have.

Have you tried this?

unset( $query->query_vars['cat'] );

You can use a filter pre_get_posts() to modify SQL query WHERE part:

add_filter( 'posts_where', function ( $where ) {
    $where = preg_replace("regex pattern", "", $where);
        return $where;
    }, 10, 2 );

It is a bit hacking solution but should work.

It is about 4 years later, but if anyone needs the answer, this is the solution:

if ( $query->is_archive ) {
    $q->set( 'category_name', '*your-category-slug*' );
}

Cheers

Post a comment

comment list (0)

  1. No comments so far