Redirect a page id url but not the page slug

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

I have tried:

function add_get_val() { 

if (isset($_GET['page_id'])) {
    $param = $_GET['page_id'];
    if($param == '342') {
         global $wp_query;
           // 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?

here is solutions:

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Solution 1

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.

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

    return $preempt; // always return it

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply