Tự động redirect 404 sang bài viết liên quan nhất trong WordPress

Thay vì để người dùng rơi vào trang 404 “cụt hứng”, bạn có thể tự động redirect họ sang bài viết liên quan nhất. Cách làm này vừa giữ chân user, vừa tốt cho SEO nếu triển khai đúng. Bài viết này hướng dẫn bạn cách tự động redirect 404 trong WordPress, với hai lựa chọn: dùng core WordPress và tối ưu hơn nếu site đang cài plugin Init Live Search.

Tự động redirect 404 sang bài viết liên quan nhất trong WordPress

Vì sao nên redirect 404 sang bài viết liên quan

Trong thực tế, rất nhiều 404 sinh ra do:

  • Đổi slug bài viết nhưng không thiết lập redirect.
  • Link cũ từ mạng xã hội, email, group, forum vẫn còn được click.
  • Người dùng gõ tay nhầm URL, sai một vài ký tự.

Nếu bạn chỉ trả về một trang 404 mặc định, người dùng sẽ rời site ngay. Nhưng nếu phân tích URL và cố gắng đoán bài viết liên quan, sau đó redirect 301 về bài đó, bạn sẽ:

  • Giữ lại traffic đáng lẽ bị mất.
  • Giảm bounce rate ở những lượt truy cập từ link cũ.
  • Giữ được tín hiệu SEO từ backlink trỏ về URL đã lỗi.

Điểm quan trọng là logic redirect phải hợp lý, tránh trường hợp redirect “bừa” khiến trải nghiệm tệ hơn.

Chiến lược bắt keyword từ URL 404

Ý tưởng cơ bản:

  1. Lắng nghe hook template_redirect.
  2. Nếu là trang 404, lấy đường dẫn hiện tại từ $_SERVER['REQUEST_URI'].
  3. Lấy segment cuối cùng trong URL, ví dụ /huong-dan-bao-mat-wordpress/huong-dan-bao-mat-wordpress.
  4. Chuyển - thành khoảng trắng để tạo keyword, ví dụ huong dan bao mat wordpress.
  5. Lọc bỏ các request file tĩnh như ảnh, css, js để không redirect linh tinh.
  6. Dùng keyword đó tìm bài viết liên quan nhất, nếu có kết quả phù hợp thì redirect.

Phần bên dưới sẽ triển khai một helper để trích keyword từ URL 404, sau đó dùng lần lượt hai phương án: core WordPress và Init Live Search.

Helper: Hàm trích keyword từ URL 404

Hàm này dùng chung cho cả hai cách tiếp cận, giúp code gọn và dễ kiểm soát.

<?php
// Đặt trong functions.php của theme hoặc trong plugin riêng
function init_extract_404_keyword() {
    $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
    if ( empty( $request_uri ) ) {
        return '';
    }

    // Lấy path (bỏ query string)
    $path = wp_parse_url( home_url( $request_uri ), PHP_URL_PATH );
    $path = trim( (string) $path, '/' );

    if ( $path === '' ) {
        return '';
    }

    // Lấy segment cuối cùng
    $segments     = explode( '/', $path );
    $last_segment = end( $segments );
    $last_segment = (string) $last_segment;

    // Bỏ các request file tĩnh (ảnh, css, js, font...)
    if ( preg_match( '~\.(jpg|jpeg|png|gif|webp|svg|css|js|ico|xml|txt|woff2?|ttf|eot|map)$~i', $last_segment ) ) {
        return '';
    }

    // Chuyển slug sang keyword: "huong-dan-bao-mat-wordpress" -> "huong dan bao mat wordpress"
    $keyword = str_replace( '-', ' ', $last_segment );
    $keyword = urldecode( $keyword );
    $keyword = sanitize_text_field( $keyword );
    $keyword = trim( $keyword );

    if ( strlen( $keyword ) < 3 ) {
        return '';
    }

    return $keyword;
}

Cách 1: Redirect 404 sang bài liên quan bằng core WordPress

Ở cách này, chúng ta dùng WP_Query để tìm bài viết có nội dung liên quan nhất với keyword trích ra từ URL. Đây là giải pháp không phụ thuộc plugin, chạy được trên mọi site.

<?php
function init_redirect_404_to_related_core() {
    if ( is_admin() || wp_doing_ajax() ) {
        return;
    }

    if ( ! is_404() ) {
        return;
    }

    $keyword = init_extract_404_keyword();
    if ( ! $keyword ) {
        return;
    }

    // Tìm bài viết liên quan nhất bằng core search
    $query = new WP_Query( [
        'post_type'           => 'post',
        'post_status'         => 'publish',
        'posts_per_page'      => 1,
        's'                   => $keyword,
        'no_found_rows'       => true,
        'ignore_sticky_posts' => true,
    ] );

    if ( $query->have_posts() ) {
        $target_id = $query->posts[0]->ID;

        if ( $target_id && get_post_status( $target_id ) === 'publish' ) {
            wp_safe_redirect( get_permalink( $target_id ), 301 );
            exit;
        }
    }
}

add_action( 'template_redirect', 'init_redirect_404_to_related_core', 9 );

Một vài lưu ý khi dùng cách này:

  • Nên dùng mã trạng thái 301 để báo cho máy tìm kiếm rằng URL cũ đã chuyển hẳn sang URL mới.
  • Việc tìm kiếm dựa trên s => $keyword là search mặc định của WordPress, phù hợp cho site vừa và nhỏ.
  • Có thể giới hạn post_type theo nhu cầu, ví dụ post, product hoặc custom post type.

Cách 2: Redirect 404 sang bài liên quan bằng Init Live Search

Lưu ý: Từ phiên bản 1.8.7, Init Live Search đã hỗ trợ tính năng này, chỉ cần bật trong trang Cài đặt.

Nếu site của bạn đang sử dụng plugin Init Live Search, bạn đã có sẵn một engine tìm kiếm thông minh, xử lý ngôn ngữ, phân tích title và ngữ cảnh. Khi đó thay vì dùng WP_Query thuần, hãy tận dụng hàm init_plugin_suite_live_search_find_related_ids() để tìm bài viết liên quan nhất.

Hàm có chữ ký:

init_plugin_suite_live_search_find_related_ids( 
    string $keyword, 
    int    $exclude_id, 
    int    $limit = 5, 
    string $post_type = '' 
);

Chúng ta sẽ kết hợp Init Live Search làm bước ưu tiên, nếu không có kết quả thì fallback về core search. Như vậy, bạn chỉ cần một luồng xử lý 404 duy nhất, nhưng tận dụng được sức mạnh của Init Live Search khi plugin đang hoạt động.

<?php
function init_redirect_404_to_related_smart() {
    if ( is_admin() || wp_doing_ajax() ) {
        return;
    }

    if ( ! is_404() ) {
        return;
    }

    $keyword = init_extract_404_keyword();
    if ( ! $keyword ) {
        return;
    }

    $target_id = 0;

    // Bước 1: Nếu có Init Live Search thì ưu tiên dùng trước
    if ( function_exists( 'init_plugin_suite_live_search_find_related_ids' ) ) {
        $related_ids = init_plugin_suite_live_search_find_related_ids(
            $keyword,
            0,           // exclude_id: 0 vì URL 404 không gắn với post cụ thể
            1,           // limit: chỉ cần 1 bài liên quan nhất
            'post'       // post_type: tùy chỉnh theo site
        );

        if ( ! empty( $related_ids ) ) {
            $candidate_id = (int) $related_ids[0];

            if ( $candidate_id && get_post_status( $candidate_id ) === 'publish' ) {
                $target_id = $candidate_id;
            }
        }
    }

    // Bước 2: Fallback về core search nếu Init Live Search không có kết quả
    if ( ! $target_id ) {
        $query = new WP_Query( [
            'post_type'           => 'post',
            'post_status'         => 'publish',
            'posts_per_page'      => 1,
            's'                   => $keyword,
            'no_found_rows'       => true,
            'ignore_sticky_posts' => true,
        ] );

        if ( $query->have_posts() ) {
            $target_id = $query->posts[0]->ID;
        }
    }

    // Bước 3: Nếu tìm được bài phù hợp thì redirect
    if ( $target_id && get_post_status( $target_id ) === 'publish' ) {
        wp_safe_redirect( get_permalink( $target_id ), 301 );
        exit;
    }
}

add_action( 'template_redirect', 'init_redirect_404_to_related_smart', 9 );

Ưu điểm của phương án này:

  • Tự động dùng Init Live Search nếu plugin sẵn có, không cần chỉnh code thêm.
  • Tối ưu chất lượng bài viết liên quan nhờ engine tìm kiếm được tinh chỉnh riêng.
  • Không phá vỡ site nếu plugin bị tắt, vì luôn có core search làm lớp dự phòng.

Lưu ý SEO và kiểm soát hành vi redirect 404

Khi triển khai redirect 404 tự động, bạn nên chú ý thêm một số điểm sau:

  • Chỉ redirect khi bạn thật sự có bài viết liên quan, tránh redirect sang trang không cùng chủ đề.
  • Nên log lại các request 404 đã được redirect để dễ kiểm tra khi cần.
  • Nếu một URL 404 nhận nhiều traffic nhưng không tìm được bài liên quan, hãy cân nhắc tạo một bài mới phù hợp và gán redirect cố định.
  • Không nên redirect 404 sang trang chủ một cách tràn lan, điều này thường bị xem là trải nghiệm tệ và không tốt cho SEO.

Sau khi triển khai, bạn có thể dùng các công cụ như Google Search Console hoặc access log của server để kiểm tra lại hành vi redirect, đảm bảo rằng mọi thứ hoạt động đúng như mong muốn.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...