1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
<?php /** * WPSEO plugin file. * * @package WPSEO\Frontend */
/** * Class WPSEO_Handle_404 * * Handles intercepting requests. * * @since 9.4 */ class WPSEO_Handle_404 implements WPSEO_WordPress_Integration {
/** * Registers all hooks to WordPress. * * @return void */ public function register_hooks() { add_filter( 'pre_handle_404', array( $this, 'handle_404' ) ); }
/** * Handle the 404 status code. * * @param bool $handled Whether we've handled the request. * * @return bool True if it's 404. */ public function handle_404( $handled ) {
if ( is_feed() ) { return $this->is_feed_404( $handled ); }
return $handled; }
/** * If there are no posts in a feed, make it 404 instead of sending an empty RSS feed. * * @global WP_Query $wp_query * * @param bool $handled Whether we've handled the request. * * @return bool True if it's 404. */ protected function is_feed_404( $handled ) { global $wp_query;
// Don't 404 if the query contains post(s) or an object. if ( $wp_query->posts || $wp_query->get_queried_object() ) { return $handled; }
// Don't 404 if it isn't archive or singular. if ( ! $wp_query->is_archive() && ! $wp_query->is_singular() ) { return $handled; }
$wp_query->is_feed = false; $this->set_404();
add_filter( 'old_slug_redirect_url', '__return_false' ); add_filter( 'redirect_canonical', '__return_false' );
return true; }
/** * Sets the 404 status code. * * @global WP_Query $wp_query * * @return void */ private function set_404() { global $wp_query;
// Overwrite Content-Type header. if ( ! headers_sent() ) { header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); }
$wp_query->set_404(); status_header( 404 ); nocache_headers(); } }
|