Làm cách nào để có được permalinks với cơ sở danh mục làm việc với các danh mục phụ


7

Tôi gặp phải một vấn đề với một trang web cần cơ sở danh mục cũng được bao gồm trong cấu trúc permalink tùy chỉnh. Tôi biết đây là một vấn đề và tôi đã đọc nhiều bài viết như thế này giúp tôi hiểu thêm ...

Tôi cần phải có được permalinks để làm việc như thế này:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Cài đặt permalink của tôi là: Cấu trúc tùy chỉnh:

/industries/%category%/%postname%/

Cơ sở danh mục:

industries/.

Điều này giúp tôi làm việc với:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Vì vậy, có vẻ như đó chỉ là các thể loại con gây ra vấn đề ..

http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}

Tôi có thể lấy ID danh mục bằng cách chặn 404 nhưng tôi không thể xem cách tải trang danh mục bằng ID danh mục phù hợp.

Vì vậy, câu hỏi của tôi là: Có cách nào để tải trang danh mục bằng cách gọi một số lệnh nội bộ hay tôi sẽ phải viết cách riêng của mình để tải trang danh mục? Tôi đã hy vọng rằng tôi có thể sử dụng một chức năng WP vì điều này sẽ là lý tưởng. Nếu đây là cái sau, có điều gì đặc biệt tôi cần phải biết không? Tôi biết tôi phải đặt: status_header(200);nhưng muốn biết liệu có bất kỳ tiêu đề nào khác hoặc các bước quan trọng cần phải thực hiện không.

Ngoài ra, một chuyển hướng sẽ không hoạt động cho mục đích của tôi. Tôi cần tải trang chuyên mục với ID mới. Nếu nó giúp, cái móc tôi đang sử dụng trong WP để bắt 404 là:template_redirect

Cảm ơn cho bất kỳ thông tin bạn có thể cung cấp về chủ đề này.

Câu trả lời:


9

Tôi đã có thể làm cho điều này để làm việc khá dễ dàng thực sự. Bây giờ tôi có thể có cơ sở thể loại của mình trong permalinks của tôi. Điều này cho phép tôi có các URL như:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Điều này sẽ làm việc cho bất kỳ cấp độ của thể loại lồng nhau.

Cài đặt Permalink của tôi:

Cấu trúc tùy chỉnh: /industries/%category%/%postname%/

Danh mục cơ sở: industries/.( /.được yêu cầu vì nó ngăn 404s cho bài đăng)

Mã số:

/**
 * Fix 404 for permalinks using category_base
 */
function permalinkWithCategoryBaseFix() {
    global $wp_query;
    // Only check on 404's
    if ( true === $wp_query->is_404) {
        $currentURI = !empty($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/') : '';
        if ($currentURI) {
            $categoryBaseName = trim(get_option('category_base'), '/.'); // Remove / and . from base
            if ($categoryBaseName) {
                // Perform fixes for category_base matching start of permalink custom structure
                if ( substr($currentURI, 0, strlen($categoryBaseName)) == $categoryBaseName ) {
                    // Find the proper category
                    $childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);
                    // Make sure we have a category
                    if (is_object($childCategoryObject)) {
                        $paged = ($wp_query->query_vars['paged']) ? $wp_query->query_vars['paged']: 1;
                        $wp_query->query(array(
                                              'cat' => $childCategoryObject->term_id,
                                              'paged'=> $paged
                                         )
                        );
                        // Set our accepted header
                        status_header( 200 ); // Prevents 404 status
                    }
                    unset($childCategoryObject);
                }
            }
            unset($categoryBaseName);
        }
        unset($currentURI);
    }
}

add_action('template_redirect', 'permalinkWithCategoryBaseFix');

Ban đầu tôi có:

$childCategoryObject = get_category_by_slug( ((!empty($wp_query->query_vars['page']) && $wp_query->query_vars['page'] > 1) ? $wp_query->query_vars['category_name'] : $wp_query->query_vars['name']) );

thay cho:

$childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);

nhưng có vẻ như kiểm tra là không cần thiết. Tôi đã để lại bình luận này trong trường hợp tôi có nó vì một lý do tôi không thể nhớ ...

Ngoài ra, tôi gặp vấn đề với phân trang danh mục mặc định của mình ... Một tìm kiếm nhanh trả về nhiều người có cùng vấn đề (sẽ không đi qua trang 2) vì vậy tôi cũng đã thêm cách khắc phục này. Tôi đã tìm thấy bản sửa lỗi này trong một plugin WordPress: Bản sửa lỗi phân loại . Tôi đã cập nhật mã và sửa lỗi dưới đây:

/**
 * Fix the problem where next/previous of page number buttons are broken of posts in a category when the custom permalink
 * The problem is that with a url like this:
 * /categoryname/page/2
 * the 'page' looks like a post name, not the keyword "page"
 */
function fixCategoryPagination($queryString) {
    if (isset($queryString['name']) && $queryString['name'] == 'page' && isset($queryString['page'])) {
        unset($queryString['name']);
        // 'page' in the query_string looks like '/2', so i'm exploding it
        list($delim, $page_index) = explode('/', $queryString['page']);
        $queryString['paged'] = $page_index;
    }
    return $queryString;
}

add_filter('request', 'fixCategoryPagination');

Lưu ý: Cần lưu ý, sửa lỗi phân trang chỉ cần thiết trên các danh mục chính. Các thể loại con không có vấn đề với phân trang.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.