Ubah slug basis penulis untuk peran yang berbeda

9

Apakah mungkin untuk mengubah siput basis penulis sesuai dengan perannya? Misalnya, penulis mendapat example.com/ninja/%username% dan pelanggan mendapatkan example.com/trainee/%username%?

Saya sedang memikirkan sesuatu seperti:

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;
  }
}

Ini harus bekerja untuk pengunjung yang tidak terdaftar jika mereka menelusuri situs dan itu harus bekerja untuk penulis dan pelanggan yang login sendiri.

Maxim Zubarev
sumber
Plugin ini melakukan apa yang Anda cari. Jika Anda tidak ingin menggunakan plugin, Anda mungkin dapat menemukan jawaban untuk pertanyaan Anda dalam kode sumber.
supajb
Saya pikir itu tidak mungkin dengan menyentuh basis penulis. Anda harus mengatur aturan penulisan ulang yang terpisah dan memfilter permalink penulis.
fuxia

Jawaban:

9

Dalam contoh Anda, penulis menulis ulang perubahan pola dari /author/[authorname]/menjadi /[author_level]/[author_name]/. Jika kami mengizinkan [author_level]apa pun, kami akan bertentangan dengan aturan untuk halaman, karena /[anything]/[anything]/bisa berupa arsip penulis atau subhalaman biasa.

Untuk alasan ini, solusi saya mengasumsikan Anda memiliki tingkat penulis dalam jumlah terbatas, sehingga kami dapat secara eksplisit menempatkannya dalam aturan penulisan ulang. Jadi /ninja/[anything]/akan menjadi arsip penulis, tetapi /not-ninja/[anything]/akan menjadi halaman biasa.

Mengubah struktur URL selalu terdiri dari dua bagian: mengubah URL yang akan diterima WordPress dan mengubah URL yang akan dihasilkan WordPress. Pertama-tama kita akan mengubah URL yang akan diterima WordPress dengan memperkenalkan tag penulisan ulang baru dan mengatur basis penulis kami untuk tag itu.

// 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%';
}

Jika Anda memeriksa aturan penulisan ulang yang dihasilkan dengan Analisis Penulisan Ulang saya, Anda akan melihat bahwa itu berisi aturan tambahan untuk /[author-level]/halaman biasa . Ini terjadi karena WordPress membuat aturan untuk setiap bagian direktori yang berisi tag penulisan ulang, seperti %author_level%. Kami tidak memerlukan ini, jadi filter semua aturan penulisan ulang penulis yang tidak mengandung 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;
}

Sekarang WordPress harus menerima URL menggunakan pola baru ini. Satu-satunya yang tersisa untuk dilakukan adalah mengubah URL yang dihasilkannya ketika membuat tautan ke arsip penulis. Untuk itu Anda dapat menghubungkan ke author_linkfilter, seperti contoh yang sangat mendasar ini:

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;
}
Jan Fabry
sumber
Tetapi bukankah trainee/john/dan ninja/john/sekarang keduanya URI berlaku untuk penulis yang sama? Tidak ada cara untuk membuat permalink kanonik untuk satu penulis hanya dengan mengubah aturan penulisan ulang, kan? A user_metabisa membantu ...
fuxia
Ya, keduanya valid, tetapi jika Anda menggunakan fungsi standar hanya satu dari mereka yang akan ditautkan, melalui author_linkfilter. Anda juga dapat menambahkan "pemeriksaan kanonik" tambahan seperti halnya inti redirect_canonical(), jika Anda benar-benar peduli tentang ini. Saya tidak tahu bagaimana user_metaakan membantu di sini? author_linkContoh saya terlalu sederhana, perlu logika spesifik lokasi untuk memisahkan ninja dari para peserta pelatihan.
Jan Fabry
Ini masih solusi yang sangat bagus, terima kasih banyak! apa yang Anda maksud dengan logika spesifik situs?
Maxim Zubarev
@dotwired: Ya, karena saya tidak tahu bagaimana situs Anda mendefinisikan pengguna mana yang merupakan ninja dan yang merupakan trainee, Anda harus menyelesaikan author_linkfilter itu sendiri. (Sebenarnya Anda memang mengatakannya - Penulis adalah ninja dan Pelanggan adalah trainee - tetapi kode saya harus cukup untuk menyelesaikan bagian itu dan cukup umum sehingga orang lain dapat belajar darinya juga.)
Jan Fabry
Apakah author_rewrite_rulesberjalan pada setiap pemuatan halaman?
henrywright