Ich sehe zwei Möglichkeiten, um dieses Problem zu lösen: Ändern der Daten, die die Autoren-URL bilden, oder Ändern der Autoren-URL. Sie sollten wahrscheinlich auch Weiterleitungen behandeln, damit alte URLs zu Benutzerarchiven weiterhin funktionieren, wenn ein Benutzer seinen Kurznamen ändert.
Ändern der Autoren-URL
Diese Frage besteht aus zwei Teilen: Behandeln Sie eingehende Links mit dem Spitznamen des Autors anstelle des Autor-Slugs und generieren Sie Autoren-Post-URLs mit dem Spitznamen anstelle des Standard-Slugs.
Der erste Teil wird gelöst, indem Sie sich in den request
Filter einhängen, prüfen, ob es sich um eine Autorenanfrage handelt, und den Autor anhand des Spitznamens anstelle des Slugs suchen. Wenn wir einen Autor finden, ändern wir die Abfrageparameter, um die Autoren-ID zu verwenden.
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;
}
Der zweite Teil erfolgt, indem Sie sich in den author_link
Filter einhängen und den (durch gekennzeichneten $author_nicename
) Standardautorteil durch den Spitznamen ersetzen .
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;
}
Ändern der Daten, die die Autoren-URL bilden
Eine vielleicht einfachere Möglichkeit wäre, das ansonsten nicht verwendete user_nicename
Feld in der Datenbank zu aktualisieren . Ich denke, es wird aus der Benutzeranmeldung generiert und danach nie mehr geändert. Ich bin jedoch kein Experte in der Benutzerverwaltung. Verwenden Sie diese also auf eigenes Risiko.
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 );
}
}