Sử dụng tên hiển thị của tác giả trong cấu trúc permalink cho các trang và bài viết


8

Tôi cần thêm tên tác giả làm tiền tố thư mục con cho tất cả các bài đăng và trang của người dùng.

Ví dụ:

example.com/johndoe/ //The author page for John Doe
example.com/johndoe/category/test-post/ //Test post by user John Doe
example.com/johndoe/test-page/ //Test page by user John Doe

Nếu tôi thay đổi cấu trúc permalink thành: /%author%/%category%/%postname%/điều này hoạt động tốt để hiển thị bài đăng của người dùng nhưng không phải trang của người dùng.

Tuy nhiên tôi không chắc chắn liệu có điều gì tôi có thể làm .htaccesshay functions.phpđiều đó sẽ cho phép tôi pageslàm việc theo cách tương tự.

Tôi hiểu điều này có thể được thực hiện với Multisite, tuy nhiên tôi đang cố gắng tránh sử dụng điều này vì khách hàng không muốn sử dụng nó.


Bạn nói "cái này hoạt động tốt". Vậy điều gì là sai?
Ngẫu nhiên

Nó hoạt động tốt cho bài viết, nhưng không phải cho các trang. Tôi sẽ chỉnh sửa câu hỏi để làm cho điều này rõ ràng hơn.
bigmike7801

1
Mọi người dùng sẽ có cùng một bộ "trang" chứ? Sẽ hữu ích nếu bạn phác thảo giải pháp hoàn chỉnh mong muốn chi tiết hơn, nhưng có vẻ như bạn có thể làm tốt hơn với giải pháp lập trình liên quan đến các danh mục hoặc các phân loại khác, hoặc các loại bài đăng tùy chỉnh và phân loại tùy chỉnh, hơn là dựa vào Trang.
CK MacLeod

1
Rất tiếc, đã bị hắt hủi bởi hội chứng câu hỏi cũ hồi sinh. Những gì tôi nhận được cho StackExchanging trên điện thoại của mình. Tôi sẽ cho rằng câu hỏi này đã chết cho đến khi có thông báo mới ...
CK MacLeod

1
Như đã nói: utilitylà dành cho mục đích thông tin và hiếm khi thay đổi, dữ liệu gần như tĩnh dành riêng cho "người dùng" hoặc "tác giả" trong trường hợp này; archivallà dữ liệu mà "người dùng" có đầu vào theo thời gian.
Nathan Powell

Câu trả lời:


1

Nhìn bề ngoài, có một plugin để đạt được điều này, vì vậy hãy tiết kiệm cho bạn.

Plugin là: https://wordpress.org/plugins/permalinks-customizer/

Tôi đã cài đặt nó để kiểm tra xem nó có làm những gì bạn đang tìm kiếm không. Đây là một ảnh chụp màn hình cho thấy những gì bạn làm:

Tùy biến Permalinks


0

Đã thử nghiệm với Wordpress 5.0.4

Vấn đề đầu tiên để giải quyết đó là giá trị post_name cho các trang sẽ chia sẻ cùng một con sên (ví dụ: về tôi ).

Giải pháp đơn giản tôi thấy là thêm tác giả nicename (hãy cẩn thận: trong dung dịch của tôi nó không nên chứa một gạch nối) là phần đầu tiên của sên:

trang about-me post_name cho john: john-about-me trang
về tôi post_name cho mary: mary-about-me

Điều này có thể đạt được bằng cách sử dụng hook bộ lọc wp_insert_post_data (xem hàm wp_insert_post () được xác định trong wp-gộp / post.php ) khi tạo trang:

// about-me => <author_name>-about-me

add_filter( 'wp_insert_post_data', 'custom_wp_insert_post_data', 99, 2);

function custom_wp_insert_post_data($data, $postarr)
{
    if(($data["post_type"] == "page") && ($data["post_status"] != "auto-draft"))
    {
        $author_name = get_the_author_meta( 'user_nicename', $data["post_author"] );

        // insert
        if($postarr['hidden_post_status'] == "draft") {         
            $data["post_name"] = $author_name . "-" . $data["post_name"];               
        }
        // update
        else {
            list($author, $slug) = explode("-", basename($data["post_name"]), 2 );

            // wrong permalink -> prepend the author
            if($author != $author_name) { 
                $data["post_name"] = $author_name . "-" . $data["post_name"];
            }
        }
    }

    return $data;   
}

Bước tiếp theo sẽ là thay đổi quy tắc viết lại wp để phản ánh mong muốn của chúng tôi (bạn cũng cần cập nhật cài đặt> permalinks ):

add_filter('page_rewrite_rules', 'custom_page_rewrite_rules');

function custom_page_rewrite_rules($page_rewrite) 
{   
    // remove : john/about-me  => index.php?pagename=john/about-me
    unset($page_rewrite["(.?.+?)(?:/([0-9]+))?/?$"]);   

    // add: john/about-me  => index.php?pagename=john-about-me
    $page_rewrite["(.?.+?)/(.+?)/?$"] = "index.php?pagename=\$matches[1]-\$matches[2]";

    return $page_rewrite; 
}

add_filter('post_rewrite_rules',  'custom_post_rewrite_rules'); 

// posts have the /%author%/%category%/%postname% permalink structure
function custom_post_rewrite_rules($post_rewrite) 
{   
    // remove: john/about-me  => index.php?category_name=about-me&author_name=john
    unset($post_rewrite["([^/]+)/(.+?)/?$"]);

    return $post_rewrite; 
}

Bước cuối cùng sẽ là thay đổi giá trị được trả về khi mã yêu cầu permalink trang (ví dụ: trong menu).
Để làm điều đó, chúng ta phải sử dụng hook bộ lọc page_link (nằm trong hàm get_page_link () được xác định trong wp-gồm / link-template.php ) ..

// http://www.example.com/john-about-me => http://www.example.com/john/about-me
add_filter('page_link', 'custom_page_link', 99, 3);

function custom_page_link( $link, $ID, $sample ) 
{
    list($author, $slug) = explode("-", basename($link), 2 );

    return ( site_url() . "/" . $author . "/" . $slug  );   
}

..nhưng nó sẽ không hoạt động nếu bạn không đặt thành sai thuộc tính use_verbose_page_rules của ví dụ toàn cầu $ wp_rewrite ; điều này sẽ dừng parse numquest () để kiểm tra xem một kết hợp đường dẫn trang "khớp" sai:

add_action('init', 'disable_verbose_page_rule');

function disable_verbose_page_rule()
{
    global $wp_rewrite;

    $wp_rewrite->use_verbose_page_rules = false;            
}

Đó là tất cả .. Vâng, thành thật mà nói đây là phần chính, nhưng nó sẽ là một số công việc khác phải làm, như thay đổi quy tắc viết lại cho tất cả các tệp đính kèm / bình luận / nguồn cấp dữ liệu / nhúng được liên kết đến một trang và có thể là một cái gì đó khác mà tôi không có đủ thời gian để khám phá.

Đây là bài viết đầu tiên của tôi; Tôi hy vọng nó sẽ giúp được ai đó, giống như nhiều người khác đã giúp tôi.

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.