• 解決済 mae-tel

    (@mae-tel)


    いつもお世話になっております。

    現在、functions.phpに

    add_filter('get_comment_author_url','add_comment_author_url');
    function add_comment_author_url($url){
    	if($url == ''){
    		$author = get_comment_author();
    		$url = get_home_url() .'/author/'. $author;
    	}
    	return esc_url($url);
    }
    require_once ( ABSPATH . WPINC . '/registration.php' );

    と記載して、コメント投稿者名にリンクをつけることはできていますが
    そのリンクを、ユーザーページ(author.php)にすることができません。

    ・表示されている名前はニックネーム
    ・ブルートフォース対策で/?author=●●にはアクセス不可にしてあるため
    /author/ユーザー名でアクセスしたい

    よろしければ、ご教授お願いいたします。。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • get_the_author_meta('user_url')

    は利用できないですか?

    トピック投稿者 mae-tel

    (@mae-tel)

    Hinaloeさま、ありがとうございます><!

    add_filter('get_comment_author_url','add_comment_author_url');
    function add_comment_author_url($url){
    	if($url == ''){
    		$author = get_comment_author();
    		$url = get_the_author_meta('user_url')
    	}
    	return esc_url($url);
    }
    require_once ( ABSPATH . WPINC . '/registration.php' );

    ご教授いただいたget_the_author_meta関数を入れてみたのですが、
    リンク自体が表示されなくなりました。
    挿入の仕方が間違っているのでしょうか・・

    add_filter('get_comment_author_url','add_comment_author_url');
    function add_comment_author_url($url){
    	if($url == ''){
    		$author = get_comment_author('user_nicename');
    		$url = get_home_url() .'/author/'. $author;
    	}
    	return esc_url($url);
    }
    require_once ( ABSPATH . WPINC . '/registration.php' );

    こうしてみると、/author/匿名と表示されてしまいます。
    匿名って何でしょうか・・・

    この関数ってコメントの投稿者名を取得するものですよね?

    function get_comment_author( $comment_ID = 0 ) {
    	        $comment = get_comment( $comment_ID );
    
    	        if ( empty( $comment->comment_author ) ) {
    	                if ( $comment->user_id && $user = get_userdata( $comment->user_id ) )
    	                        $author = $user->display_name;
    	                else
    	                        $author = __('Anonymous');
    	        } else {
    	                $author = $comment->comment_author;
    	        }
    
    	        /**
    	         * Filter the returned comment author name.
    	         *
    	         * @since 1.5.0
    	         *
    	         * @param string $author The comment author's username.
    	         */
    	        return apply_filters( 'get_comment_author', $author );
    	}

    …………もしかしてこれって’表示する際にフィルタかける’よりも’投稿の際にフィルタかける’方が適してることやろうとしているのかもしれませんね。(勝手な思い込みかもしれませんが。)

    トピック投稿者 mae-tel

    (@mae-tel)

    Hinaloe様

    ご回答ありがとうございます。
    まず根本的に関数の使い方が間違っているという事でしょうか?

    こちらの過去の質問を参考にさせていただきました。
    [解決済み] コメントの投稿者名にリンクを設定したい
    http://ja.forums.wordpress.org/topic/6285?replies=5

    この方法は、ブログ上の表示名がユーザー名の場合だと思うのですが
    今回の場合、ブログ上の表示名をニックネームに設定していますので
    そのまま使用させていただくことはできません。

    ですので、上記URLに記載されているコードを少しいじって、
    単純にget_userdataでコメント投稿者のユーザー名を引っ張ってきて
    それをURLの末尾に入れればいいと思っていたのですが
    うまくいかず・・・。
    なにかヒントをいただけたら幸いです。。

    とりあえず、get_comment_author関数の引数はコメントID(数字)が入ります。指定したコメントが存在しない場合は__('Anonymous');、つまり日本語環境では匿名と言う文字列が返ってきたわけですね。

    今回はコメントループ内で使っているので引数を省略すればコメントの投稿者名になります。

    もしリンク先同様(?)、コメント出来るのが登録ユーザーのみならばこの方法でも使えなくは無いかと思います。

    不特定多数がコメント出来るサイトなら特に、コメント投稿時にログイン中のユーザーかどうかのチェックをした上で追加してやる方がいいかと思いますが…………

    トピック投稿者 mae-tel

    (@mae-tel)

    Hinaloe様 ご教授ありがとうございます。

    get_comment_author関数で実現できる、ということなのですね!

    function get_comment_author( $comment_ID = 0 ) {
    	        $comment = get_comment( $comment_ID );
    
    	        if ( empty( $comment->comment_author ) ) {
    	                if ( $comment->user_id && $user = get_userdata( $comment->user_id ) )
    	                        $author = $user->display_name;
    	                else
    	                        $author = __('Anonymous');
    	        } else {
    	                $author = $comment->comment_author;
    	        }
    
    	        /**
    	         * Filter the returned comment author name.
    	         *
    	         * @since 1.5.0
    	         *
    	         * @param string $author The comment author's username.
    	         */
    	        return apply_filters( 'get_comment_author', $author );
    	}

    ご提示いただいたこのコードを試してみたいのですが
    functions.phpに記載したところ、
    Parse error: syntax error, unexpected T_ELSE in ~~~functions.php on line 10
    と表示されてしまいました。

    未熟のためどのように訂正すればよいのかわからずすみません。。。

    あ、この関数は実際のコアに含まれてるコードをコピペしたものです。内部を見せるために用意したものであって既に定義されているので再定義しようとするとコンフリクトしますよ。言いたかったのはこの関数の使い方が間違っている、ということです。この関数を追加する必要はありませんよ 🙂

    トピック投稿者 mae-tel

    (@mae-tel)

    Hinaloe様、ありがとうございます。

    このコードはコアファイルのものだったのですね。すみません…
    未知でお恥ずかしい限りです…。

    ログインユーザーのみコメントを投稿できる設定にしています。

    add_filter('get_comment_author_url','add_comment_author_url');
    function add_comment_author_url($url){
    	if($url == ''){
    		$author = get_comment_author();
    		$url = get_home_url() .'/author/'. $author;
    	}
    	return esc_url($url);
    }
    require_once ( ABSPATH . WPINC . '/registration.php' );

    と、表記したときに、リンクが/autor/ニックネーム となるのは
    コアファイルで $author = $user->display_name; となっていたからなのですね。

    知識不足のため、難しいことはわからないのですが…
    /author/ニックネーム のリンクでもプロフィールページが表示できるようにするか、
    もしくは$authorで取得した表示名から、ユーザーIDを引っ張ってくるということに
    なるのでしょうか?

    おっしゃっていた’投稿の際にフィルタかける’というのが
    どのようにすればわからないのでこのようなことしか浮かびません…汗

    /author/ニックネーム のリンクでもプロフィールページが表示できる…

    この、author ページののスラッグは、user_nicename なので、初期設定のままだと、user_login と同じになっています。mae-tel さんのパーマリンク設定では、

    http://example.com/author/user_nicename/

    となるのではないでしょうか。この user_nicename を変更すると、上のスラッグを変えることができますが、WordPress には、それをする API がありません。データベースを直接いじるか、ちょっとした PHP コードを書く必要があります。

    $authorで取得した表示名から、ユーザーIDを引っ張ってくる…

    お気づきのように、$author は、display_name ですが、display_name から ID を得る関数がありません。user_nicename は、users テーブルにありますから、user_meta 系の関数も意味がありません。

    今回の場合、コメント投稿者は全員 users テーブルにエントリを持っている前提なので、コメント・オブジェクトにはその情報が含まれています。ということで、get_comment_author_url を使う場所で、グローバルに存在する $comment 変数を使うとどうなりますかね? 使う場所によっては動作しないかもしれませんが。

    add_filter('get_comment_author_url', 'add_comment_author_url');
    function add_comment_author_url($url) {
        if ($url == '') {
            global $comment;
            $user_id = isset($comment) ? $comment->user_id : '';
            if (!empty($user_id)) {
                $userdata = get_userdata($user_id);
                $url = get_home_url() . '/author/' . $userdata->user_nicename . '/';
            }
        }
        return $url;
    }
    トピック投稿者 mae-tel

    (@mae-tel)

    kjmtsh様

    ご回答ありがとうございます。
    お返事が大変遅くなり、申し訳ありません…

    結果的に、ご教授いただいたコードで、コメント投稿者のリンクを
    /author/ユーザーID にすることができました!

    $comment変数を使ってuser_idを取得できたのですね。
    とても丁寧なご説明で分かりやすかったですし、助かりました。

    このトピックは解決済みとさせていただきます。
    本当にありがとうございました。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「コメント投稿者のリンクをauthorページにしたい」には新たに返信することはできません。