web-dev-qa-db-ja.com

削除したユーザーのアバターをリストから削除する

問題

皆さん、こんにちは。私は少し問題があります。フォローしているユーザーのアバターを出力する機能があります。これはうまく機能しますが、ユーザーが削除された場合、アバターは空白の画像ボックスとして表示されたままになります。リストから削除されたユーザーのアバターを取り除くための方法はありますか?

関数

function get_status_following($userid, $count = 0){

$followers = get_the_author_meta('following', $userid);

/** if no followers at the moment */
if( !is_array($followers)){
    $return = "";
} else {

    $return = '<ul class="widget_follow">' . "\n";
    foreach( $followers as $folow){

        $return .= "<li>";
            $return .= '<a href="' . get_author_posts_url($folow) . '" title="' . get_the_author_meta('display_name', $folow) . '">';
                if( get_the_author_meta( 'user_custom_avatar', $folow ) != "" ) {
                    $return .= '<img src="' . get_the_author_meta( 'user_custom_avatar', $folow ) . '" alt="" />';
                } else {
                    $return .= get_avatar( get_the_author_meta( 'user_email', $folow ), '40' );
                }
            $return .= '</a>';
        $return .= "<li>";

    }
    $return .= '</ul>' . "\n";
}

echo $return;

}

ページ内に関数を出力する

<?php printf( __('&nbsp;%1$s', 'bo'), count_following($curauth->ID) ); ?>
<?php get_status_following($curauth->ID); ?>

事前に助けてくれてありがとう

1
jimilesku

ユーザーAが削除されたとユーザーが言った場合、そのユーザーのすべての痕跡はクリーンアップされていません。

つまり、Aに続く各ユーザーにアクセスして、そのユーザーのmetaから削除する必要があります。これはあなたの関数が古くなった古い情報を与えられ、もはや存在しないユーザーを参照しているために空白のユーザーを表示している理由です。

deleted_userフックでこれをしたいでしょう。

// when a user is deleted, the deleted_user action is fired
// attach our example_cleanup function to this action/hook
add_action('deleted_user','example_cleanup');

// When the deleted_user action/hook/event is fired, this function will be called
function example_cleanup($user_id){
    // remove this user from the users following this user
}

私はあなたがユーザーの後にユーザーのリストを持っているかどうか知りません、そうでなければ、あなたはこれをやりたくなるかもしれません。削除されたユーザー

注:変数の名前として言語キーワードを使用することは避けたいので、$function$foreach$returnまたは$classは使用しないでください。

どのように私はこれを実施したであろう

今、あなたは2組の複製データを持っています。 Aの後にBが続き、Bの後にAが続くというデータがあります。

そのため、ユーザーメタを使用する代わりに、ユーザー分類法を使用したはずです。私のユーザー分類法は「フォロー」と呼ばれ、分類法の各用語はユーザーを表します。

「admin」というユーザーがいて、フォロワーA、B、C、D、Eの5人のフォロワーがあるとします。各ユーザーには、分類法で「admin」という用語が割り当てられます。

そうすれば、誰が私をフォローしているのか、誰がフォローしているのかを簡単に把握することができます。自分がフォローしている人をつかむには、投稿IDではなく自分のユーザーIDを渡す wp_get_object_terms を実行するだけです。自分をフォローしている人を確認するために、自分と同じ名前を持つ用語に割り当てられているすべてのオブジェクトを取得します。

ユーザー分類法を作成するにはどうすればよいですか?

Justin Tadlockによるこの記事を参照してください。管理UIから分類法の登録、フロントエンドのテンプレートまでを網羅しています

いくつかの最後の注意、あなたはそのユーザーの関連用語を作成/削除するためにユーザーの作成と削除に引っ掛かる必要があるでしょう。表示名はあなたが追加の作業をしなければならないことを意味するのに対して私はログイン名をスラッグという用語として使うことを勧めます。

このようにすることの利点:

  • クリーンアップは、用語を削除するのと同じくらい簡単です。ユーザーやユーザーメタを繰り返すことはありません。
  • フォロー/フォロワーを保存するための1つのデータが2ではありません
  • 従うことはデータベース内のより論理的な関係です
  • タクソノミークエリが速くなるにつれて、タクソノミークエリも速くなります。
  • 独自のラッパー関数を作成するのではなく、必要なすべてのデータにアクセスするためにWordPressコアAPIを使用できます。その部分をWordPress自体に取り組んでいる経験豊富な開発者にアウトソーシングできます。
  • どのカテゴリーが最も投稿数が多いのかをランク付けできるのと同じ方法で、リスト、つまり最もフォロワーが多いユーザーのランキングを作成する方がはるかに簡単です。
  • いくつかの作品では、タグクラウドのようなものを、最も視覚的に優れている人を示すフォロワーのために改良することができます。
  • あなたは箱から出してすぐにそれのための管理者インターフェースの大部分を手に入れます

欠点は、それがより多くの知識を前提としており、APIに不慣れな人にとってはより多くの初期の努力を必要とすることです

3
Tom J Nowell

あなたがあなたのテーマ関数を書き直す間、速くて汚い一時的な修正。 foreach($followers as $follow)に対してget_user_byクエリを実行します。そうすれば、削除されたものではなく、既存のユーザーだけが印刷されます。

foreach( $followers as $folow){

    $existing_user = get_user_by('id', $folow);
    if($existing_user){ // you got a user

    $return .= "<li>";
        $return .= '<a href="' . get_author_posts_url($folow) . '" title="' . get_the_author_meta('display_name', $folow) . '">';
            if( get_the_author_meta( 'user_custom_avatar', $folow ) != "" ) {
                $return .= '<img src="' . get_the_author_meta( 'user_custom_avatar', $folow ) . '" alt="" />';
            } else {
                $return .= get_avatar( get_the_author_meta( 'user_email', $folow ), '40' );
            }
        $return .= '</a>';
    $return .= "<li>";

    }


}
1
ifdion