Đã 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.