Schimbă Slug-ul Autorului din Numele de Utilizator în Porecla
Salut comunității,
este posibil să schimb slug-ul implicit al numelui de utilizator în poreclă dacă este disponibilă?
În mod implicit URL-ul arată așa: http://domain.tld/author/(admin),
este posibil să rescriu și să schimb în http://domain.tld/author/(porecla) astfel încât atunci când un utilizator își schimbă porecla din pagina de profil, slug-ul să se schimbe automat cu noul nume ales de utilizator?
mulțumesc mult!
Philip

Văd două modalități de a rezolva această problemă: modificarea datelor care formează URL-ul autorului sau schimbarea URL-ului autorului. Probabil ar trebui să gestionați și redirectările, astfel încât URL-urile vechi către arhivele utilizatorilor să continue să funcționeze atunci când un utilizator își schimbă pseudonimul.
Schimbarea URL-ului autorului
Această întrebare are două părți: gestionarea linkurilor primite cu pseudonimul autorului în loc de slug-ul autorului și generarea URL-urilor postărilor autorului cu pseudonimul în loc de slug-ul standard.
Prima parte este rezolvată prin conectarea la filtrul request
, verificând dacă este o cerere de autor și căutând autorul după pseudonim în loc de slug. Dacă găsim un autor, modificăm parametrii interogării pentru a utiliza ID-ul autorului.
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;
}
A doua parte se realizează prin conectarea la filtrul author_link
și înlocuirea părții standard a autorului (indicată de $author_nicename
) cu pseudonimul.
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;
}
Modificarea datelor care formează URL-ul autorului
O modalitate poate mai ușoară ar fi actualizarea câmpului user_nicename
din baza de date, care altfel nu este utilizat. Cred că acesta este generat din login-ul utilizatorului și nu este modificat ulterior. Dar nu sunt expert în managementul utilizatorilor, așa că folosiți-o pe propria răspundere.
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 );
}
}

Soluție frumoasă. Încă nu am verificat-o, dar cred că abordarea ta este foarte bună.

Cum rămâne cu numele de utilizator (nicenames) duplicate? Trebuie să ne îngrijorăm în legătură cu asta sau WordPress se ocupă de această problemă?

După cum a menționat @DrewBaker, ar putea apărea o problemă cu URL-uri duplicate dacă două profile de utilizator au nume similare. De exemplu, dacă un utilizator 1 își modifică numele în John și există un alt utilizator cu un nume similar, ambele profile vor avea același URL de autor: site.com/author/john.
Poți să-mi spui dacă există o soluție pentru această problemă?

De asemenea, dacă există un spațiu între nume, URL-ul nu va funcționa. Acest lucru se întâmplă cu numele de utilizator aleatorii create cu acest cod. Când am încercat codul pe calculatorul meu, acesta generează nume de utilizator aleatorii precum "New user 654937", iar URL-ul autorului arată astfel: site.com/author/Newuser654937/. Acest URL nu va funcționa până când nu schimbăm din nou numele profilului și eliminăm spațiile. Aveți vreo sugestie pentru a rezolva această problemă?

@IamSJ: Nu există nicio prevenție automată împotriva numelor duplicate sau a caracterelor invalide. Va trebui să vă asigurați singur de acest lucru. Probabil cel mai simplu este să faceți acest lucru prin a doua metodă, schimbând "nicename".

Folosește acest plugin: http://wordpress.org/extend/plugins/display-name-author-permalink/
Deși nu este testat pentru versiunea 3.2.1. L-am folosit fără probleme.
Dacă primești o eroare de header la activarea pluginului, poți găsi o soluție aici: http://wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header-error.html

o metodă ușoară este plugin-ul Author Slug
De asemenea, poți folosi un cod simplu:
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;
}
