1

My client is asking me to force a 404 $wp_query->set_404(); if the URL is example.com/page_id=342 but DON't redirect if the URL is example.com/about even though they are the same page. I have to do this in the functions.php file and not .htaccess.

I have tried:

add_action('init','add_get_val');
function add_get_val() { 

if (isset($_GET['page_id'])) {
    $param = $_GET['page_id'];
  
    if($param == '342') {
         global $wp_query;
           $wp_query->set_404();
           // status_header( 404 );
           // get_template_part( 404 ); 
           // exit();
    }

}

}

The code as it stands does not work. But if I uncomment the status_header(), get_template(), and exit() it does. However, it does not give the same 404 page.

What am I doing wrong?

1
  • "if the url is example.com/page_id=342" - presumably you mean .../?page_id=342? If they are the "same page", why wouldn't you redirect one to the other?
    – MrWhite
    Feb 17 at 8:30
2

Try using the pre_handle_404 hook instead:

add_filter( 'pre_handle_404', 'wpse_383506', 10, 2 );
function wpse_383506( $preempt, $wp_query ) {
    if ( ! empty( $_GET['page_id'] ) &&
        '342' === $_GET['page_id']
    ) {
        // Throw a 404 error.
        $wp_query->set_404();

        // And prevent redirect to the page permalink (pretty URL).
        remove_action( 'template_redirect', 'redirect_canonical' );
    }

    return $preempt; // always return it
}
2
  • 1
    this worked perfect, thank you!
    – Jason
    Feb 17 at 1:08
  • Glad it helped! But I forgot to add that you should check if the current request path is empty, e.g. use if ( empty( $GLOBALS['wp']->request ) && ! empty( $_GET['page_id'] ) - but you wouldn't need that if you want just any URL with the page_id=342 to throw a 404 error.. :)
    – Sally CJ
    Feb 17 at 1:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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