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_link
filter, 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;
}