Thay đổi sên cơ sở tác giả cho các vai trò khác nhau


9

Có thể thay đổi sên cơ sở tác giả theo vai trò của mình? Ví dụ: các tác giả có được example.com/ninja/%username% và người đăng ký có được example.com/trainee/%username%?

Tôi đang nghĩ về một cái gì đó như:

add_action('init', 'set_new_author_base');
function set_new_author_base() {
  global $wp_rewrite;

  if($user->role == 'subscriber')
    $author_slug = 'trainee';
    $wp_rewrite->author_base = $author_slug;
  } elseif($user->role == 'author') {
    $author_slug = 'ninja';
    $wp_rewrite->author_base = $author_slug;
  }
}

Nó sẽ hoạt động cho khách truy cập chưa đăng ký nếu họ duyệt trang web và nó sẽ hoạt động cho chính các tác giả và người đăng ký đã đăng nhập.


Plugin này thực hiện những gì bạn đang theo đuổi. Nếu bạn không muốn sử dụng plugin, bạn có thể tìm thấy câu trả lời cho câu hỏi của mình trong mã nguồn.
supajb

Tôi nghĩ rằng không thể bằng cách chạm vào cơ sở tác giả. Bạn sẽ phải thiết lập một quy tắc viết lại riêng biệt và lọc permalink của tác giả.
fuxia

Câu trả lời:


9

Trong ví dụ của bạn, tác giả viết lại mẫu thay đổi từ /author/[authorname]/thành /[author_level]/[author_name]/. Nếu chúng tôi cho phép [author_level]là bất cứ điều gì, chúng tôi sẽ xung đột với các quy tắc cho các trang, bởi vì /[anything]/[anything]/có thể là một kho lưu trữ của tác giả hoặc một trang con thông thường.

Vì lý do này, giải pháp của tôi cho rằng bạn có số lượng cấp độ tác giả hạn chế, vì vậy chúng tôi có thể đưa chúng vào quy tắc viết lại một cách rõ ràng. Vì vậy, /ninja/[anything]/sẽ là một kho lưu trữ tác giả, nhưng /not-ninja/[anything]/sẽ là một trang thông thường.

Thay đổi cấu trúc URL luôn bao gồm hai phần: thay đổi URL mà WordPress sẽ chấp nhận và thay đổi URL mà WordPress sẽ tạo. Đầu tiên, chúng tôi sẽ thay đổi các URL mà WordPress sẽ chấp nhận bằng cách giới thiệu thẻ viết lại mới và đặt cơ sở tác giả của chúng tôi cho thẻ đó.

// I assume you define these somewhere, this is just to make the example work
$wpse17106_author_levels = array( 'trainee', 'ninja' );

add_action( 'init', 'wpse17106_init' );
function wpse17106_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['wpse17106_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%';
}

Nếu bạn kiểm tra các quy tắc viết lại kết quả với Trình phân tích ghi lại của tôi, bạn sẽ thấy rằng nó chứa các quy tắc bổ sung cho các /[author-level]/trang đơn giản . Điều này xảy ra vì WordPress tạo quy tắc cho từng phần thư mục có chứa thẻ viết lại, như %author_level%. Chúng tôi không cần những thứ này, vì vậy hãy lọc ra tất cả các quy tắc viết lại của tác giả không chứa author_name:

add_filter( 'author_rewrite_rules', 'wpse17106_author_rewrite_rules' );
function wpse17106_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;
}

Bây giờ WordPress nên chấp nhận URL bằng cách sử dụng mẫu mới này. Điều duy nhất còn lại phải làm là thay đổi các URL mà nó tạo khi tạo liên kết đến kho lưu trữ của tác giả. Cho rằng bạn có thể nối vào author_linkbộ lọc, như ví dụ rất cơ bản này:

add_filter( 'author_link', 'wpse17106_author_link', 10, 2 );
function wpse17106_author_link( $link, $author_id )
{
    if ( 1 == $author_id ) {
        $author_level = 'ninja';
    } else {
        $author_level = 'trainee';
    }
    $link = str_replace( '%author_level%', $author_levels, $link );
    return $link;
}

Nhưng không phải trainee/john/ninja/john/bây giờ cả hai URI hợp lệ cho cùng một tác giả? Không có cách nào để tạo một permalink chính tắc cho một tác giả chỉ bằng cách thay đổi các quy tắc viết lại, phải không? A user_metacó thể giúp ích
fuxia

Có, cả hai đều hợp lệ, nhưng nếu bạn sử dụng các chức năng tiêu chuẩn thì chỉ một trong số chúng sẽ được liên kết đến, thông qua author_linkbộ lọc. Bạn cũng có thể thêm một "kiểm tra chính tắc" bổ sung giống như cốt lõi redirect_canonical(), nếu bạn thực sự quan tâm đến điều này. Tôi không biết làm thế nào user_metasẽ giúp đỡ ở đây? author_linkVí dụ của tôi quá đơn giản, nó cần logic cụ thể theo trang web để tách ninja khỏi các học viên.
Jan Fabry

Đây vẫn là một giải pháp thực sự tốt đẹp, cảm ơn bạn rất nhiều! bạn có ý nghĩa gì với logic trang web cụ thể?
Maxim Zubarev

@dotwired: Chà, vì tôi không biết trang web của bạn xác định người dùng nào là ninja và thực tập sinh nào, bạn sẽ phải tự hoàn thành author_linkbộ lọc đó . (Trên thực tế bạn đã nói với nó - Tác giả là ninja và Người đăng ký là thực tập sinh - nhưng mã của tôi phải đủ để hoàn thành phần đó và đủ chung chung để người khác cũng có thể học hỏi từ nó.)
Jan Fabry

author_rewrite_ruleschạy trên mỗi trang tải?
henrywright 15/03/2016
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.