サポート » 使い方全般 » 同じカスタムタクソノミーに属しているユーザーIDを変数に格納

  • 解決済 JunichiK

    (@junichik)


    お世話になります。

    カスタムタクソノミーを利用してユーザーをグループ分けしております。
    それで、同じグループに属しているユーザーのIDをすべて変数に格納したく、方法をいろいろと検索してみたのですが分かりません。

    ご存知の方がいらっしゃいましたら、ご教示願います。
    何卒よろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全26件中)
  • トピック投稿者 JunichiK

    (@junichik)

    すみません、タイトルがおかしいような気がしました。
    「同じタームに属するユーザー」とするのが正しいですね。
    また、投稿内容が簡潔すぎたと思いましたので、補足いたします。

    別の投稿でご指導いただき、register_taxonomy()の第二引数に’user’を指定する方法でグループ分けするプラグインを使用して、user-groupというタクソノミーで、ユーザーをグループ分けしております。
    そのうえで例えば、

    <?php $user_id = get_current_user_id(); ?>
    
    <?php the_terms( $author, 'user-group' ); ?> //authorページユーザーのグループ
    <?php the_terms( $user_id, 'user-group' ); ?> //ログインユーザーのグループ

    というようにタームの取得はできておりますが、
    逆に、例えば、ログインユーザーと同じタームに属するユーザーの一覧やユーザーIDを取得したいのです。

    何卒よろしくお願い申し上げます。

    日本語Codexには(訳されていないので)まだ無いのですが、get_users() 関数が使える筈です。
    このフォーラムを関数名で検索すると似た話が出てくるかもしれませんね。
    http://codex.wordpress.org/Function_Reference/get_users

    ごめんなさい、勘違いしてました。
    get_users はタームを指定した検索ができないです。
    もう少し考えてみます。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、ありがとうございます。
    ググってもそれらしい記事にたどり着かないということは、不可能なのでしょうか…。

    引き続き、よろしくお願いいたします。

    get_objects_in_term() 関数を使えば、ユーザーを(オブジェクトとして)取得できるみたいです。下記リンク先の英文ページに例が載っていました。
    Custom user taxonomies in WordPress

    先頭から1/5ほど読み進んだところに Templates for term archives という見出しのセクションがあります。get_objects_in_term() 関数でユーザーを取得してループを回し、ユーザーの一覧を表示するテンプレートが載っています。実際に試してはいませんが大丈夫なのではないでしょうか。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、ありがとうございます。
    get_objects_in_term()は初めて知りました。

    ご紹介いただいたリンクを参考に、下記のようにしてみましたが、
    ページ上では、Array Arrayとしか表示されません。
    どこが間違っているのでしょうか?

    <?php
    $term_id = get_queried_object_id();
    $term = get_queried_object();
    
    $users = get_objects_in_term( $term_id, $term->taxonomy );
    
    if ( !empty( $users ) ) {
    ?>
    	<?php foreach ( $users as $user_id ) { ?>
    
    		<?php echo $user_id; ?>
    
    	<?php } ?>
    <?php } ?>

    多分、基本的なことが間違っていると思うのですが、知識不足のため、分かりません。
    何卒、ご教示のほどよろしくお願いいたします。

    トピック投稿者 JunichiK

    (@junichik)

    ちなみに、
    <?php echo var_dump($userID); ?>
    としますと、ページに下記のように表示されます。

    array(1) { [“invalid_taxonomy”]=> array(1) { [0]=> string(42) “不正なタクソノミー分類です。” } } array(0) { }

    register_taxonomy()によるユーザーのグループ分けは、下記のプラグインを使用しているのですが、プラグイン側に何か問題があるのでしょうか?

    https://wordpress.org/plugins/user-groups/

    引き続き、よろしくお願い申し上げます。

    $term_id と $term の値は何になっていますか?
    参考リンク先のphpコードはタクソノミーアーカイブのテンプレートファイルに記述する前提なので、それ以外のテンプレートでは誤動作します。
    user-group というタクソノミー名なのでテンプレートファイルは taxonomy-user-group.php になると思います。

    もう一つ別の参考リンクです。
    http://wordpress.org/support/topic/plugin-user-groups-list-group-members

    リンク先ページの一番下に、ショートコードを自作した方がphpコードを公開されています。これがうまく動いてくれると良いですね。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、ありがとうございます。

    まず、taxonomy-user-group.phpを使用するほうは、なるほど、そういうことだったのですね。
    私はauthor.phpで取得する必要があるので、$term_idの値はauthorのユーザーID、$termの値は取得出来ていませんでした。
    別途taxonomy-user-group.phpを作って読み込む方法もあるかもしれませんが、まずはご紹介くださった別のリンクのコードを試してみました。

    公開されているコードをそのまま使用し、ショートコードのグループ名を直接記入しますと、正常に動作します。
    <?php echo do_shortcode('[group-list group="テストグループ"]'); ?>

    しかし、目的はログインユーザーのグループと同じグループに属するユーザーIDの取得ですので、下記のようにしましたが、取得できません。
    ショートコード内で変数を使う方法が間違っているのでしょうか?
    もしくは、get_the_term_list()ではダメなのでしょうか?

    <?php $user_id = get_current_user_id(); ?>
    <?php $user_terms = get_the_term_list( $user_id, 'user-group' );
     ?>
    <?php echo do_shortcode('[group-list group='.$user_terms.']'); ?>

    また、所属グループが仮に複数だったとしたら、上記ショートコードでは対応出来なさそうに思うのですが、どうでしょう?(現状では所属グループが複数になる予定はございません)

    いろいろと試行錯誤しておりますが、なかなか思うようにいきませんので、何卒、よろしくお願いいたします。

    get_the_term_list が返した値はどんな形式になっていますか?
    日本語Codexを読むと「投稿と指定した分類に関連付けられた分類キーワードの HTML 文字列を返します。分類キーワードは、それぞれの分類キーワード一覧ページにリンクします。」なので、そのままの形式ではショートコードに適さないと思います。

    グループ(ターム)が複数の場合は、タームの配列(みたいなもの)が get_the_term_list から返されますから、それに対してループを回してターム毎にユーザーリストを表示できると思います。

    get_the_term_list の代わりに wp_get_object_terms 関数が使いやすいかもしれませんね。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、お世話になります。

    get_the_term_list()が返した値はアンカータグを含んでおりました。
    それで、get_the_terms()で下記のようにしますと、正常に取得できました。

    <?php
    $user_terms = get_the_terms( $user_id, 'user-group' );
    $termnames = array();
    foreach( $user_terms as $user_term ) {
    	array_push( $termnames, $user_term->name );
    }
    $termname = join($termnames);
    echo $termname;
    ?>

    ただし、やはり、タームが複数の場合はダメみたいなので、もっと考えないといけないようです。
    wp_get_object_terms()をCodex等で調べてみます。

    それから、目的はユーザーIDの取得なので、ご紹介いただいたリンク先のコード(下記)の変数$userIDsから直接取得できないかな…と思ったのですが、私の知識では厳しいようです。

    add_shortcode('group-list', 'my_group_list_shortcode');
    function my_group_list_shortcode( $atts ) {
        // Get the global $wpdb object
        global $wpdb;
    
        // Extract the parameters and set the default
        extract ( shortcode_atts( array(
            'group' => 'No Group' // No Group is a defined user-group
            ), $atts ) );
    
        // The taxonomy name will be used to get the objects assigned to that group
        $taxonomy = 'user-group';
    
        // Use a dBase query to get the ID of the user group
        $userGroupID = $wpdb->get_var(
                        $wpdb->prepare("SELECT term_id
                            FROM {$wpdb->terms} t
                            WHERE t.name = %s", $group));
    
        // Now grab the object IDs (aka user IDs) associated with the user-group
        $userIDs = get_objects_in_term($userGroupID, $taxonomy);
    
        // Check if any user IDs were returned; if so, display!
        // If not, notify visitor none were found.
        if ($userIDs) {
            $content = "<div class='group-list'> <ul>";
            foreach( $userIDs as $userID ) {
                $user = get_user_by('id', $userID);
                $content .= "<li>";
                $content .= get_avatar( $user->ID, 70 );
                $content .= "<h3>" . $user->display_name . "</h3>";
                $content .= "<p><a href='". get_author_posts_url( $user->ID ) . "' class='more-info-icon'>More info</a>";
                $content .= "<!-- add more here --></p>";
                $content .= "</li>";
            }
            $content .= "</ul></div>";
        } else {
            $content =
            "<div class='group-list group-list-none'>Returned no results</div>";
    
        }
        return $content;
    }

    ちなみに、ユーザーIDを取得して何がしたいかと申しますと、プラグインContact Form DBのショートコードのfilterに利用して、そのユーザーIDのデータベースのみを表示させたいわけなのですが、こちらも複数ユーザーですとうまくいかないようですので、それはまた別のスレッドをたてさせていただこうと考えております。

    引き続き、試行錯誤してみますので、もうしばらくお付き合いくださいますようお願いいたします。

    一つ前のコメントで

    (現状では所属グループが複数になる予定はございません)

    という予定だったので安心していたのですが

    ただし、やはり、タームが複数の場合はダメみたいなので、もっと考えないといけないようです。

    一人が複数のグループに属する(複数のタームが付く)のは避けられないんですね。それなら次のように二重のループを回してユーザーIDの配列を作るのが良いと思います。

    1. 空の配列 userIDs を用意する。
    2. ログインユーザーが属するグループ(ログインユーザーに付いているターム、複数可能)を取得して配列 myTerms に入れる。
    3. myTerms の要素(ターム)についてループ(外側のループ)を回す。
    4. ループの中で、そのタームが付いているユーザー(ユーザーのオブジェクト、複数可能)を取得して 配列 tempUsers に入れる。そして tempUsers の各要素(ユーザーのオブジェクト)についてループ(内側のループ)を回す。
    5. ユーザーのオブジェクトからユーザーIDを取り出して、userIDs へ入れる(注)。
    6. 内側のループはここでおしまい。
    7. 外側のループを繰り返して、最後のタームまで処理すればおしまい。

    「注」のところで単純に userIDs へ入れると、userIDs の中に同じユーザーが重複して(2 回以上)出てくる場合があります。それだと困るときは、重複しないように工夫してみてください。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、お世話になります。

    現状では所属グループが複数になる予定はないのですが、プラグインの特性により、複数グループのタームを割り当てることが可能なので、使用者に渡した後のことを考えますと、その場合の対応をしておかないといけないと思いました。
    複数グループのタームを割り当てられないような構造にしておくのも有りなのですが、その場合は更に困難になるように思いましたので。

    gblsmさんのアドバイスを受けまして、少し試行錯誤してみます。
    引き続きよろしくお願い致します。

    トピック投稿者 JunichiK

    (@junichik)

    gblsmさん、お世話になります。度々すみません。

    よくよく考えますと、複数グループに所属させますと、操作ミスなどによってグループ分けの間違いなどを引き起こす可能性が大きくなりますので、グループは単一にしようと思います。
    その代わり、複数グループを選択出来ないような処置が必要になってきますが、これはプラグインの範囲になるでしょうか。

    それから、アドバイスいただいた上記方法で、ユーザーIDを取り出すには、どのような関数を使用すれば良いでしょうか?

    知識不足でご迷惑おかけいたしますが、何卒、引き続きよろしくお願い致します。

15件の返信を表示中 - 1 - 15件目 (全26件中)
  • トピック「同じカスタムタクソノミーに属しているユーザーIDを変数に格納」には新たに返信することはできません。