워드프레스에서 사이트맵 플러그인을 사용할 때, .htaccess 파일이 변경되면 404 오류가 발생합니다. 이때 구글 등 검색 봇이 사이트맵 파일 경로로 접근했을 때 404 Not Found 오류가 발생하면 최근 글을 크롤링하지 못합니다.
수동으로 고유 주소 저장 버튼을 눌러주면 해결되지만, 오류가 발생하는지 매번 확인하고 저장을 해야하기 때문에 효율적이지 못합니다.
사이트맵이 404 오류. Not Found 일 때 자동 복구하기
상시 실행되는 코드이므로 /wp-content/mu-plugins/ 폴더에 임의의 .php 파일을 만들고 아래 코드를 붙여넣습니다.
PHP
add_action('template_redirect', function() {
if (is_404()) {
$requested_uri = $_SERVER['REQUEST_URI'];
$cookie_name = 'devany_404_retry_' . md5($requested_uri);
if (isset($_COOKIE[$cookie_name])) {
return;
}
if (strpos($requested_uri, 'sitemap') !== false || preg_match('/^\/\d+\/?$/', $requested_uri)) {
setcookie($cookie_name, '1', time() + 10, COOKIEPATH, COOKIE_DOMAIN);
flush_rewrite_rules(true);
wp_safe_redirect(home_url($requested_uri));
exit;
}
}
});코드 설명
사이트맵 또는 포스트가 404 오류일 때 rewrite 규칙을 초기화 합니다. 무한 반복을 방지하기 위해 쿠키를 사용합니다. (옵션 함수를 사용해도 됩니다)
404 에러 자동 복구가 실행됐는지 확인 방법
아래처럼 옵션을 추가해서 카운트하고 필요한 정보를 기록합니다.
PHP
add_action('template_redirect', function() {
if (is_404()) {
$requested_uri = $_SERVER['REQUEST_URI'];
$cookie_name = 'devany_404_retry_' . md5($requested_uri);
if (isset($_COOKIE[$cookie_name])) {
return;
}
if (strpos($requested_uri, 'sitemap') !== false || preg_match('/^\/\d+\/?$/', $requested_uri)) {
$count = get_option('devany_404_fixed_count', 0);
update_option('devany_404_fixed_count', $count + 1);
update_option('devany_404_fixed_last_date', current_time('mysql'));
update_option('devany_404_fixed_last_url', $_SERVER['REQUEST_URI']);
setcookie($cookie_name, '1', time() + 10, COOKIEPATH, COOKIE_DOMAIN);
flush_rewrite_rules(true);
wp_safe_redirect(home_url($requested_uri));
exit;
}
}
});/wp-admin/options.php 페이지로 이동 후 해당 옵션 항목을 보면 동작하는지 알 수 있습니다.




