मुझे इस समस्या को हल करने के दो तरीके दिखाई देते हैं: लेखक URL बनाने वाले डेटा को बदलना या लेखक URL बदलना। आपको शायद पुनर्निर्देश भी संभालना चाहिए, इसलिए उपयोगकर्ता अभिलेखागार में पुराने URL काम करते रहते हैं जब उपयोगकर्ता अपना उपनाम बदलता है।
लेखक URL बदलना
इस प्रश्न के दो भाग हैं: लेखक स्लग के बजाय लेखक उपनाम के साथ आने वाले लिंक को संभालें, और मानक स्लग के बजाय उपनाम के साथ लेखक पोस्ट यूआरएल उत्पन्न करें।
पहला भाग request
फ़िल्टर में हुक करके हल किया गया है , यह जाँच कर कि क्या यह एक लेखक का अनुरोध है, और स्लग के बजाय उपनाम द्वारा लेखक को देख रहा है। यदि हमें कोई लेखक मिलता है, तो हम लेखक आईडी का उपयोग करने के लिए क्वेरी पैरामीटर बदलते हैं।
add_filter( 'request', 'wpse5742_request' );
function wpse5742_request( $query_vars )
{
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}
दूसरा भाग author_link
फिल्टर में हुक करके और $author_nicename
उपनाम के साथ मानक लेखक भाग (संकेत द्वारा ) को प्रतिस्थापित करके किया जाता है।
add_filter( 'author_link', 'wpse5742_author_link', 10, 3 );
function wpse5742_author_link( $link, $author_id, $author_nicename )
{
$author_nickname = get_user_meta( $author_id, 'nickname', true );
if ( $author_nickname ) {
$link = str_replace( $author_nicename, $author_nickname, $link );
}
return $link;
}
लेखक URL बनाने वाले डेटा को बदलना
user_nicename
डेटाबेस में अन्यथा अप्रयुक्त फ़ील्ड को अपडेट करने का एक आसान तरीका होगा । मुझे लगता है कि यह उपयोगकर्ता लॉगिन से उत्पन्न होता है और उसके बाद कभी नहीं बदला जाता है। लेकिन मैं उपयोगकर्ता प्रबंधन का विशेषज्ञ नहीं हूं, इसलिए इसे अपने जोखिम पर उपयोग करें।
add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
if ( ! empty( $user->nickname ) ) {
$user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
}
}