Zmień Slug autora z nazwy użytkownika na pseudonim

13

Witaj w społeczności,
czy można zmienić domyślną informację o użytkowniku na pseudonim, jeśli jest dostępny?

Domyślnie adres URL wygląda następująco: http: //domain.tld/author/ (admin ),
czy możliwe jest przepisanie i zmiana na http: //domain.tld/author/ (pseudonim ), więc jeśli użytkownik zmieni swój pseudonim ze strony profilu ślimak zmieni się również na nową nazwę nadaną przez użytkownika?

wielkie dzięki!
Philip

Philip
źródło
Nie sądzę, abyś mógł, realistycznie, nie ma zapytania_var, które znalazłoby posty oparte na pseudonimie użytkownika, dlatego też nie ma odpowiedniej zmiennej do odwzorowania pseudonimu w regule przepisywania. Będziesz musiał dodać własną obsługę var var, aby poradzić sobie z zapytaniami o pseudonimy wraz z dowolnym kodem przepisywania (jest to teoretycznie możliwe, ale nie sądzę, aby w praktyce byłby elegancki).
t31os

Odpowiedzi:

17

Widzę dwa sposoby rozwiązania tego problemu: zmiana danych tworzących adres URL autora lub zmiana adresu URL autora. Prawdopodobnie powinieneś również obsługiwać przekierowania, więc stare adresy URL do archiwów użytkowników będą działać, gdy użytkownik zmieni swój pseudonim.

Zmiana adresu URL autora

Pytanie to składa się z dwóch części: obsługiwać przychodzące linki z pseudonimem autora zamiast informacji o autorze i generować adresy URL autora z pseudonimem zamiast standardowej informacji o pracy.

Pierwszą część rozwiązuje zaczepiając się w requestfiltrze, sprawdzając, czy jest to prośba autora, i szukając autora według pseudonimu zamiast ślimaka. Jeśli znajdziemy autora, zmieniamy parametry zapytania, aby użyć identyfikatora autora.

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

Druga część polega na zaczepieniu się w author_linkfiltrze i zastąpieniu standardowej części autora (oznaczonej przez $author_nicename) pseudonimem.

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

Zmiana danych tworzących adres URL autora

Być może łatwiejszym sposobem byłoby zaktualizowanie w innym przypadku nieużywanego user_nicenamepola w bazie danych. Wydaje mi się, że jest generowany na podstawie loginu użytkownika i nigdy potem się nie zmienia. Ale nie jestem ekspertem w zarządzaniu użytkownikami, więc używaj go na własne ryzyko.

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 );
    }
}
Jan Fabry
źródło
Niezłe rozwiązanie. Jeszcze tego nie sprawdziłem, ale myślę, że twoje podejście jest naprawdę dobre.
Anh Tran
Co z duplikatami nazw autorów? Czy musimy się tym martwić, czy WP się tym zajmuje?
Drew Baker
Jak powiedział @DrewBaker, może istnieć problem ze zduplikowanymi adresami URL, jeśli dwa profile użytkowników mają podobne nazwy. Powiedzmy, że jeśli użytkownik 1 edytował swoją nazwę użytkownika jako John i istnieje inny użytkownik o podobnej nazwie, oba profile użytkowników mają adres URL pojedynczego autora jako site.com/author/john. Czy możesz mi powiedzieć, czy można to naprawić?
Netizen
Jeśli między nazwą jest spacja, adres URL nie będzie działać. Dzieje się tak z losowymi nazwami użytkowników utworzonymi za pomocą tego kodu. Kiedy próbowałem kodu na moim końcu, generuje on losowe nazwy użytkowników, takie jak Nowy użytkownik 654937, a adres URL autora wygląda jak site.com/author/Newuser654937/. Ten adres URL nie będzie działał, dopóki ponownie nie zmienimy nazwy profilu i nie usuniemy spacji. Czy jest w stanie zaproponować rozwiązanie?
Netizen
@IsSJ: Nie ma automatycznego zapobiegania zduplikowanym nazwom lub nieprawidłowym znakom. Będziesz musiał sam to podać. Prawdopodobnie najłatwiejszy, jeśli zrobisz to drugim sposobem, zmieniając „nazwę”.
Jan Fabry
-3

łatwym sposobem jest wtyczka autora Slug

Możesz także użyć małego kodu:

add_action('init', 'set_new_author_base');
function set_new_author_base() {
    global $wp_rewrite;
    $author_slug = 'new_slug';
    $wp_rewrite->author_base = $author_slug;
}
bueltge
źródło
3
Niestety nie jest to podstawa autora, którą użytkownik chce zmienić.
t31os