Cách tạo hồ sơ người dùng cuối với permalink thân thiện


23

Tôi muốn tạo một trang tiểu sử công khai với một url thân thiện như định dạng này.

mysite.com/user/someusername

Bất kỳ ý tưởng về làm thế nào tôi có thể đạt được điều này? Tôi biết nó có một cái gì đó để làm với quy tắc viết lại nhưng tôi không biết làm thế nào tôi có thể làm điều đó. Nếu bạn có bất kỳ liên kết hoặc hướng dẫn cho tôi đó sẽ là tuyệt vời.

Cảm ơn!

Câu trả lời:


15

Có hai cách tôi đã khám phá ra điều này:

  1. Trang tác giả với quy tắc viết lại tùy chỉnh
  2. Một tệp mẫu tùy chỉnh được ghép nối với quy tắc viết lại

Cách đầu tiên đơn giản hơn để thực hiện, nhưng có thể không hoạt động trong mọi trường hợp (một trong số đó tôi sẽ mô tả sớm).

Quy tắc viết lại tùy chỉnh

Tôi đã tìm thấy giải pháp này vài ngày trước tại đây: Viết lại URL

Và đây là mã, với ý kiến:

// Define the author levels you want to use
$custom_author_levels = array( 'user', 'leader' );

// On init, add a new author_level rewrite tag and add it to the author_base property of wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['custom_author_levels'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
    $wp_rewrite->author_base = '%author_level%';

}

// The previous function creates extra author_name rewrite rules that are unnecessary.  
//This function tests for and removes them

add_filter( 'author_rewrite_rules', 'wpleet_author_rewrite_rules' );
function wpleet_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, 'author_name' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}

Sau đó, bạn có thể sử dụng mẫu Author.php tích hợp, sửa đổi nội dung trái tim của bạn.

Trân trọng, kiểm tra liên kết được liệt kê ở trên, vì Jan Fabry thực hiện một công việc tuyệt vời để giải thích mọi thứ.

Vars truy vấn và mẫu trang

Đối với chủ đề tôi đang thực hiện khi khám phá các giải pháp này, tôi cần phân phát trang tùy chỉnh dựa trên giá trị meta của người dùng (ID riêng). Khách hàng của tôi không muốn tên người dùng hoặc ID người dùng hiển thị công khai, vì vậy chúng tôi đã tạo một lớp riêng.

Vấn đề duy nhất? Hiện tại, không có cách rõ ràng nào để sử dụng API Rewrite để truy vấn theo các khóa / giá trị meta. May mắn thay, đã có một giải pháp.

Trong tệp tin.php của bạn ...

// Create the query var so that WP catches your custom /user/username url
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
    $vars[] = 'user';
    return $vars;
}

Và sau đó, bạn cần tạo một thẻ viết lại và quy tắc mới để nó biết khi nào và làm thế nào để xử lý var truy vấn mới.

add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
    '^user/([^/]*)/?',
    'index.php?user=$matches[1]',
    'top'
);

Khi bạn đã hoàn thành việc này, bạn chỉ cần "bắt" khi var truy vấn đang được phục vụ và sau đó chuyển hướng đến mẫu bạn chọn:

add_action( 'template_redirect', 'wpleet_rewrite_catch' );
function wpleet_rewrite_catch()
{
    global $wp_query;

    if ( array_key_exists( 'user', $wp_query->query_vars ) ) {
        include (TEMPLATEPATH . '/user-profile.php');
        exit;
    }
}

Chỉ cần chắc chắn rằng bạn đã tạo user-profile.php.

Trong ví dụ của riêng tôi, tôi đã tạo một hàm thứ ba khớp với "ID người dùng công khai" với user_id thực tế thông qua bảng $ wpdb-> usermeta và chuyển thông tin đến mẫu.

Nếu bạn cần tạo một mẫu khác với phần còn lại của chủ đề, hãy nhớ rằng với get_header, bạn có thể chỉ định một tên:

get_header( 'user' );

Mà sẽ gọi tệp tiêu đề-user.php.

Phần kết luận

Cả hai đều là giải pháp làm việc hợp lệ. Thứ hai cung cấp một lớp "bảo mật" riêng vì nó không tiết lộ ID người dùng hoặc tên người dùng, nếu người khác có thể duyệt hồ sơ.

Hy vọng rằng sẽ giúp, cho tôi biết nếu bạn có bất kỳ câu hỏi.


Tôi thực sự đã giải quyết nó bằng phương thức Query_var. Cảm ơn!
tiltdown

1
@bybloggers Tôi biết bài đăng này hơi cũ, nhưng tò mò liệu bạn có thể chia sẻ chức năng thứ ba của mình để chuyển tên người dùng trong URL vào mẫu không?
Pat

@Pat Không chắc chắn chức năng thực tế nằm ở đâu trong tất cả các mã của tôi tại thời điểm này (như bạn đã nói, cách đây một thời gian), nhưng định dạng sẽ theo dõi rất chặt chẽ hàm wpleet_rewrite_catch (). Thay vì mảng_key_exists ('người dùng'), tôi đã thử nghiệm ID người dùng công khai và sau đó thực hiện tìm kiếm trên bảng wp_usermeta để xem người dùng nào có ID công khai đó được liên kết với nó. Hy vọng thuật toán sẽ giúp, ngay cả khi mã không có sẵn.
byblogger

2

Tôi đã tìm thấy điều này sớm hơn ngày hôm nay và thực hiện một số sửa đổi cho mã @byblogger với sự khác biệt thay vì sử dụng template_redirect Tôi thay đổi yêu cầu hiển thị trang tĩnh, điều đó có nghĩa là bây giờ bạn có thể thêm bất cứ điều gì bạn thích vào mẫu trang và sử dụng nó trên đó trang.

class ProfilePage {
function __construct() {
    add_filter( 'init',array($this,'rw_init'));
    add_filter( 'query_vars', array($this,'wpleet_rewrite_add_var') );
    add_filter( 'request', array($this,'change_requests'));
}
function wpleet_rewrite_add_var( $vars ) {
    $vars[] = 'usuario';
    return $vars;
}
function rw_init(){
    add_rewrite_tag( '%usuario%', '([^&]+)' );
    add_rewrite_rule(
        '^usuario/([^/]*)/?',
        'index.php?usuario=$matches[1]',
        'top'
    );
}
function change_requests($query_vars) {
    //go to a specific page when the usuario key is set
    $query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
    return $query_vars;
}
}
new ProfilePage();

Tiếng Tây Ban Nha -> usuario = người dùng <- Tiếng Anh


Rất đẹp! Cảm ơn đã chia sẻ điều đó. Tôi muốn làm cho năng động hơn và bạn có thể chuyển đổi id với get_page_by_path('page-slug')->ID. Cũng đừng quên sử dụng flush_rewrite_rules, vì vậy tôi sẽ thêm như:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro

1

Đây là mã làm việc của tôi dựa trên câu trả lời của @bybloggers (cảm ơn) Tôi chỉ biết rằng chúng ta không nên sử dụng hook template_redirect và sau đó thoát php, vì một số thứ có thể ngừng hoạt động vì sự gián đoạn đột ngột của mã thực thi php.

Lời giải thích có tại đây: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-temsheet/

Vì vậy, chúng ta nên sử dụng hook template_include. Với hook này, không cần sử dụng phương thức redirect và exit.

Và sự khác biệt khác là tôi chỉ cần www.server.com/myaccount mà không có / userid.

Đây là mã:

add_filter( 'query_vars', 'wp58683_userprofile_var' );
function wp58683_userprofile_var( $vars )
{
    $vars[] = 'myprofile';
    return $vars;
}

add_rewrite_tag( '%myprofile%', '([^&]+)' );

add_rewrite_rule(
    '^myprofile/?',
    'index.php?myprofile',
    'top'
);

add_action( 'template_include', 'wp58683_userprofile_page' );
function wp58683_userprofile_page($original_template)
{
    global $wp_query;

    if ( array_key_exists( 'myprofile', $wp_query->query_vars ) ) {
        if (is_user_logged_in() ){ 
            return TEMPLATEPATH . '/user-profile.php';
        }
    }
    else {
        return $original_template;
    }

}

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.