Author SlugをUsernameからNicknameに変更します


13

コミュニティの皆さん、こんにちは
、デフォルトのユーザー名スラッグをニックネームに変更することは可能ですか?

デフォルトでは、URLは次のようになります。http://domain.tld/author/(admin)、
書き換えてhttp://domain.tld/author/(nickname)に変更できるため、ユーザーがニックネームを変更した場合プロファイルページからスラッグは、ユーザーが指定した新しい名前にも変更されますか?

どうもありがとう!
フィリップ


ユーザーのニックネームに基づいて投稿を検索するquery_varはないため、書き換えルールでニックネームをマップする適切な変数はありません。書き換えコードと一緒にニックネームクエリを処理するには、独自のクエリ変数処理を追加する必要があります(理論的には可能ですが、実際にはエレガントだとは思いません)。
t31os

回答:


16

この問題を解決するには、著者のURLを形成するデータを変更するか、著者のURLを変更する2つの方法があります。おそらくリダイレ​​クトも処理する必要があるため、ユーザーがニックネームを変更してもユーザーアーカイブへの古いURLは機能し続けます。

著者のURLを変更する

この質問には2つの部分があります。著者スラッグの代わりに著者ニックネームで着信リンクを処理し、標準スラッグの代わりにニックネームで著者投稿URLを生成します。

最初の部分は、requestフィルターにフックし、作成者のリクエストであるかどうかを確認し、スラッグではなくニックネームで作成者を検索することで解決します。著者を見つけたら、クエリパラメータを変更して著者IDを使用します。

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

2番目の部分は、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 );
    }
}

いい解決策。まだチェックしていませんが、あなたのアプローチは本当に良いと思います。
アントラン

著者名の重複はどうですか?それについて心配する必要がありますか、それともWPがそれを処理しますか?
ドリューベイカー

@DrewBakerが言ったように、2つのユーザープロファイルの名前が似ている場合、重複したURLに問題がある可能性があります。ユーザー1が自分のユーザー名をJohnとして編集し、同様の名前を持つ別のユーザーがいる場合、両方のユーザープロファイルにはsite.com/author/johnの単一の作成者URLがあります。これに修正があるかどうか教えてもらえますか?
ネチズン

また、名前の間にスペースがある場合、URLは機能しません。このコードで作成されたランダムなユーザー名で発生します。私の側でコードを試してみると、New user 654937のようなランダムなユーザー名が生成され、author URLはsite.com/author/Newuser654937/のようになります。そのURLは、プロファイル名を再度変更してスペースを削除するまで機能しません。解決策を提案できますか?
ネチズン

@IamSJ:名前の重複や無効な文字に対する自動防止機能はありません。これは自分で提供する必要があります。2番目の方法で "nicename"を変更する場合、おそらく最も簡単です。
ヤンファブリー


-3

簡単な方法は、プラグインAuthor Slugです

また、小さなコードを使用できます:

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

3
残念ながら、ユーザーが変更しようとしている作成者ベースではありません。
t31os
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.