wp query – date_query in pre_get_posts out of memory

Question

I’m trying to apply a Datefilter for specific categories.

WordPress crashs with a out of memory error. Is this a server problem or is my query wrong?
At first I tried query -> (…) but with approach I get an error, cause of too few arguments.
While using query = new WP_Query… I get the out of memory error.

Thank you for your help.

My code:

    function test_filter( $query ) {
        $options = get_option('dh_options');
        $cats = "54,55,56";
        if ($options['checkbox_usr_q'] == true) {
            if ( !is_admin()  && $query->is_main_query() && $query->in_category($cats)) {
                $args = array(
                    'date_query' => array(
                        array(
                            'column' => 'post_date_gmt',
                            'after' => 'May 1st, 2021',
                            'inclusive' => true
                        ),
                    ),
                    'posts_per_page' => -1
                );
                $query = new WP_Query( $args );
            }
        }
    }

add_action( 'pre_get_posts', 'test_filter' , 100, 3);

Error Message:

Fatal error: Out of memory (allocated 699400192) (tried to allocate 262144 bytes) in /homepages/1/d861373325/htdocs/wp/wp-includes/class-wp-query.php on line 892

Fatal error: Out of memory (allocated 699400192) (tried to allocate 262144 bytes) in /homepages/1/d861373325/htdocs/wp/wp-includes/class-wp-recovery-mode.php on line 361

in progress 0
BennyVenassi 2 months 2021-05-29T06:30:13-05:00 0 Answer 0 views 0

Answer ( 1 )

    0
    2021-06-02T06:26:24-05:00

    You’re not using pre_get_posts correctly. You’ve called new WP_Query which then runs your hook, which calls new WP_Query, which then runs your hook… and so on. You’re in an infinite loop.

    The proper way to use pre_get_posts is to modify the $query parameter using $query->set() to adjust the query. You don’t need to perform a brand new query:

    function test_filter( $query ) {
        $options = get_option( 'dh_options' );
        $cats    = array( 54, 55, 56 );
    
        if ( $options['checkbox_usr_q'] == true ) {
            if ( ! is_admin() && $query->is_main_query() && $query->is_category( $cats ) ) {
                $query->set(
                    'date_query',
                    array(
                        array(
                            'column'    => 'post_date_gmt',
                            'after'     => 'May 1st, 2021',
                            'inclusive' => true,
                        ),
                    )
                );
            }
        }
    }

Leave an answer

Browse
Browse