web-dev-qa-db-ja.com

Wordpressユーザーリストのカスタムユーザーアバター

デフォルトでは、WordpressはユーザーのアバターにGravatarを使用します。

私はアバターアップロード用のカスタムフィールドを作成しました。そしてこれをテーマのさまざまなページのユーザーのアバターとして使用しています。

管理者 - すべてのユーザーのページ - には、通常ユーザーのアバターを表示する列があります(下記参照)。デフォルトのグラバターフィールドのカスタムフィールド の代わりに を使用する方法はありますか?

enter image description here 

3
Koleon

私の他の答えに代わるものとして、get_avatarフィルターを使うこともできます。これを私に知らせるために Sumit への小道具。

get_avatarフィルタを使うことの利点はあなたのカスタムアバターが適用されるべきであるということです どこでも 私の他の答えが扱うようにこのユーザーリストに入るのではなくWordpressがそれを使います。ユーザーのアバターを表示するプラグインを使用している場合、このソリューションはそれらのプラグインでも機能するはずです。

get_avatarフィルタの公式ドキュメントはこちら .

あなたのテーマのfunctions.phpでは、あなたはこのようにあなたの関数を設定したいでしょう:

add_filter("get_avatar", "wpse_228870_custom_user_avatar", 1, 5);

function wpse_228870_custom_user_avatar($avatar, $id_or_email, $size, $alt, $args){

  // determine which user we're asking about - this is the hard part!
  // ........

  // get your custom field here, using the user's object to get the correct one
  // ........

  // enter your custom image output here
  $avatar = '<img alt="' . $alt . '" src="image.png" width="' . $size . '" height="' . $size . '" />';

  return $avatar;

}

おそらく欲求不満なことに、WordpressはこのフィルタにきれいなユーザーオブジェクトやユーザーIDを送信していないためです。

user_id、gravatar md5ハッシュ、ユーザーの電子メール、WP_Userオブジェクト、WP_Postオブジェクト、またはWP_Commentオブジェクト

これらの大部分は処理することができます - 少し難しいと思われるGravatarハッシュを取得した場合 - しかし残りは正しいユーザーオブジェクトを取得するためにWordpressの組み込み関数を使用することができます。

古いWordpressのドキュメントでこれを始める例 があります。ただし、このフィルタが使用されているすべての場所で適切に機能するためには、投稿オブジェクトやコメントオブジェクトを検出して処理できるように、余分なものを追加する必要があります(おそらく PHPを使用)。 is_a function )に関連付けられた投稿またはコメントの投稿者を取得します。

5
Tim Malone

WordPress 4.2以降で利用可能な次のフィルタのいずれかを使用することもできます。

$id_or_emailからユーザーIDを取得する方法について、 core でそれがどのように行われているかを見ることができます。

$email_hash = '';
$user = $email = false;
if ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {
    $id_or_email = get_comment( $id_or_email );
}
// Process the user identifier.
if ( is_numeric( $id_or_email ) ) {
    $user = get_user_by( 'id', absint( $id_or_email ) );
} elseif ( is_string( $id_or_email ) ) {
    if ( strpos( $id_or_email, '@md5.gravatar.com' ) ) {
        // md5 hash
        list( $email_hash ) = explode( '@', $id_or_email );
    } else {
        // email address
        $email = $id_or_email;
    }
} elseif ( $id_or_email instanceof WP_User ) {
    // User Object
    $user = $id_or_email;
} elseif ( $id_or_email instanceof WP_Post ) {
    // Post Object
    $user = get_user_by( 'id', (int) $id_or_email->post_author );
} elseif ( $id_or_email instanceof WP_Comment ) {
    /**
     * Filter the list of allowed comment types for retrieving avatars.
     *
     * @since 3.0.0
     *
     * @param array $types An array of content types. Default only contains 'comment'.
     */
    $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
    if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) {
        $args['url'] = false;
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters( 'get_avatar_data', $args, $id_or_email );
    }
    if ( ! empty( $id_or_email->user_id ) ) {
        $user = get_user_by( 'id', (int) $id_or_email->user_id );
    }
    if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
        $email = $id_or_email->comment_author_email;
    }
}

ユーザIDがフィルタコールバックに渡されるならば、またはこれのために利用可能な特別な機能があるならば、それはより簡単でしょう.

wp_get_user_from_id_or_email( $id_or_email )
2
birgire

編集: 私の最初の解決策は以下の通りですが、 Sumitget_avatar filter の存在をコメントで私に警告しました。私は 追加の回答 を投稿しました。これはそのオプションの実装方法も示しています。


はい、できます。

Wordpress管理者のこれらの「リストテーブル」に表示されている列はフィルタリング可能です - あなたのテーマのfunctions.phpのカスタム関数を使って、あなたは列を削除するかあなた自身を追加することができます。

この関数はデフォルトの列を削除することもカスタムの列を追加することもできます。

add_filter("manage_users_columns", "wpse_228870_custom_user_avatar");

function wpse_228870_custom_user_avatar($columns){

    $columns = 
        array_slice($columns, 0, 1) // leave the checkbox in place (the 0th column)
        + array("custom_avatar" => "") // splice in a custom avatar column in the next space
        + array_slice($columns, 1) // include any other remaining columns (the 1st column onwards)
    ;

    return $columns;

}

あなたがそれをすることができる多くの方法がありますが、これで私は基本的にちょうど$columns配列を取り、あなたのカスタムアバターを2番目の位置に固定するためにそれをマッサージしました。これらの列に必要なことをすべて実行するために、任意のPHP配列関数を使用できます。

次に、Wordpressにそのcustom_avatar列に何を表示するかを指示する必要があります。

add_filter("manage_users_custom_column", "wpse_228870_custom_user_avatar_column", 10, 3);

function wpse_228870_custom_user_avatar_column($output, $column_name, $user_id){

    // bow out early if this isn't our custom column!
    if($column_name != "custom_avatar"){ return $output; }

    // get your custom field here, using $user_id to get the correct one
    // ........

    // enter your custom image output here
    $output = '<img src="image.png" width="50" height="50" />';

    return $output;

}

画像が正しいサイズで表示されない、または適切にスタイル設定されていない場合、列とその内容のサイズ設定をさらに制御したい場合は、{ Wordpress管理者にスタイルを追加 を使用できます。

また、Wordpressのドキュメントで使用した2つのフィルタについて詳しく読むこともできます - manage_users_columns はCodexにあり、 manage_users_custom_column は新しいコードリファレンスにあります。投稿やページなど、他のテーブルにも同様のフィルタがあります。

1
Tim Malone