• 解決済 kokorog

    (@kokorog)


    ユーザー一覧を50音順に表示することはできたのですが、人数が多いのでもうちょっと気が利いた表示にしたいと思い、記事を50音順に見出し付きで表示させているソースを参考にユーザーでもできるのではないかと試しているのですが上手く表示されません…

    参考にしたソース
    投稿したタイトルを五十音順に並び替える

    ユーザーのよみがなはmeta_key ”yomi”でひらがなで入力しています。

    もし分かる方がいらっしゃいましたらよろしくお願いします。

    <!--投稿者一覧を50音順にタブを付けて表示-->
    <?php
    
        //目次(行)
        $indexes_parents = array(
            "あ行" => "[ア-オ]",
            "か行" => "[カ-コ]",
            "さ行" => "[サ-ソ]",
            "た行" => "[タ-ト]",
            "な行" => "[ナ-ノ]",
            "は行" => "[ハ-ホ]",
            "ま行" => "[マ-モ]",
            "や行" => "[ヤ-ヨ]",
            "ら行" => "[ラ-ロ]",
            "わ行" => "[ワ-ン]",
            "その他" => ".*"
        );
        // 目次(五十音順)
        $indexes = array(
            "ア" => "[ア]", "イ" => "[イ]", "ウ" => "[ウ]", "エ" => "[エ]", "オ" => "[オ]",
            "カ" => "[カ]", "キ" => "[キ]", "ク" => "[ク]", "ケ" => "[ケ]", "コ" => "[コ]",
            "サ" => "[サ]", "シ" => "[シ]", "ス" => "[ス]", "セ" => "[セ]", "ソ" => "[ソ]",
            "タ" => "[タ]", "チ" => "[チ]", "ツ" => "[ツ]", "テ" => "[テ]", "ト" => "[ト]",
            "ナ" => "[ナ]", "ニ" => "[ニ]", "ヌ" => "[ヌ]", "ネ" => "[ネ]", "ノ" => "[ノ]",
            "ハ" => "[ハ]", "ヒ" => "[ヒ]", "フ" => "[フ]", "ヘ" => "[ヘ]", "ホ" => "[ホ]",
            "マ" => "[マ]", "ミ" => "[ミ]", "ム" => "[ム]", "メ" => "[メ]", "モ" => "[モ]",
            "ヤ" => "[ヤ]", "ユ" => "[ユ]", "ヨ" => "[ヨ]",
            "ラ" => "[ラ]", "リ" => "[リ]", "ル" => "[ル]", "レ" => "[レ]", "ロ" => "[ロ]",
            "ワ" => "[ワ]", "ン" => "[ン]",
            "その他" => ".*"
        );
    
    	// ユーザーの取得条件
    	$args = array(
    	'exclude' => array( 1 ),// adminを除外
    	'orderby' => 'meta_value',
    	'meta_key' => 'yomi',
    	'order'    => 'ASC',
    	);
    
        $my_users = get_users($args);
        $user_data_set = array();
    
        if ($my_users) {
    
      foreach( $users as $user ):
    	$uid = $user->ID;
    	$userData = get_userdata($uid);
    	// ヨミガナの1文字目を取得する(濁点、半濁点は分離)
    	$yomi = get_user_meta($uid, 'yomi', true); // カスタムフィールドyomiの値を取得
            $yomi_conv = mb_convert_yomi($yomi, 'h', 'UTF-8'); //全角ひらがなを半角カタカナに変換 ※ここで濁点、半濁点を分離する
            $yomi_conv = mb_convert_yomi($yomi_conv, 'K', 'UTF-8');//半角カタカナを全角カタカナに変換
    	$yomi_first = mb_substr($yomi, 0, 1); // 先頭の1文字を取得
    
            endforeach;
        }
    
        // 目次(五十音順)ごとにユーザーのデータを格納する
        $user_data_set_index = array();
        foreach ( $user_data_set as $key => $val) {
            $char = mb_substr( $val['yomi_first'], 0, 1);
            foreach ( $indexes as $index => $pattern ) {
                if (preg_match("/^" . $pattern . "/u", $char)) {
                    $user_data_set_index[$index][] = $user_data_set[$key];
                    break;
                }
            }
        }
        //目次(行)ごとにユーザーのデータを格納する
        $user_data_set_index_parent = array();
        foreach ( $user_data_set_index as $key => $val) {
            foreach ( $indexes_parents as $indexes_parent => $patterns ) {
                if (preg_match("/^" . $patterns . "/u", $key)) {
                    $user_data_set_index_parent[$indexes_parent][$key] = $user_data_set_index[$key];
                    break;
    			}
    		}
        }
     ?>
    
        <!--ここから出力!-->
        <div class="js-tab">
        <?php if ($user_data_set_index_parent):?>
        <ul class="js-tab-title">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $x++; $x = sprintf("%02d",$x); ?>
            <li><a href="#anc-tab<?php echo $x; ?>"><h2><?php echo $indexes_parent; ?></h2></a></li>
            <?php endforeach; ?>
            </ul>
             
            <div class="js-tab-content">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $i++; $i = sprintf("%02d",$i); ?>
                <div class="az_list" id="anc-tab<?php echo $i; ?>">
                <?php
                foreach ($users as $index => $user):  ?>
                 
                 
                <h3><?php echo $index; ?></h3>
                <ul>
                <?php foreach ($user as $key => $val) { ?>
                <li><?php echo '<a href="'.get_bloginfo(url).'/profile/'.$user->user_nicename.'">'.$user->display_name.'</a>'; ?></li>
                <?php } ?>        
                </ul>
                <?php endforeach; ?>
                </div><!-- .az_list -->
                <?php endforeach; ?>
                </div><!-- .js-tab-content -->
                <?php endif;wp_reset_userdata(); ?>
                </div><!-- .js-tab -->
        <!--出力ここまで-->
    
    • このトピックはkokorogが5年、 8ヶ月前に変更しました。
    • このトピックはkokorogが5年、 8ヶ月前に変更しました。
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんにちは

    ソースが長くてちょっと分からないのですが、出来ていないのは、どの部分でしょうか?
    get_users で meta_value でソートされたものを取得できないということでしょうか?

    こんにちは

    上手く表示されません…

    具体的にどのように上手く表示されないのでしょうか?

    とりあえず、ざっとコード見た感じでは・・・

    • foreach( $users as $user ): の $users が未定義の変数。
    • mb_convert_yomi() が未定義の関数。
    • $user_data_set[] に何も値が代入されていない。
    • foreach ($users as $index => $user): の直後に全角スペースが挿入されている。
    • get_bloginfo(url) の url が未定義の定数。
    • この返信は5年、 8ヶ月前にishitakaが編集しました。
    トピック投稿者 kokorog

    (@kokorog)

    munyagu 様
    ishitaka 様

    ありがとうございます。
    最初はhtmlの出力の<?php if ($user_data_set_index_parent):?>で読み込みが止まってしまっていて、そのあとに読み込まれる<?php get_sidebar(); ?>も出てこないような状態だったのですが
    ishitaka 様に頂いた修正点を修正したところ正しいデータは出ていませんが最後までソースは読み込まれるようになりました。

    データがまだ全く出ておらず、その他のところだけ空データが出力されています…
    $user_data_set[]が間違っているんだろうなと見直しています。

    foreach( $users as $user ): の $users が未定義の変数。

    foreach( $my_users as $user ):でした…

    mb_convert_yomi() が未定義の関数。

    mb_convert_kana の間違いでした

    $user_data_set[] に何も値が代入されていない。

    $user_data_set[] = $users;に直しました。

    foreach ($users as $index => $user): の直後に全角スペースが挿入されている。

    気づいていませんでした。ありがとうございます。

    get_bloginfo(url) の url が未定義の定数

    $site_url = network_site_url( '/' );にしてget_bloginfo(url).$site_url.にしました。

    修正後のソース

    <!--投稿者一覧を表示-->
    <div class="cf">
    
    <?php
    
        //目次(行)
        $indexes_parents = array(
            "あ行" => "[ア-オ]",
            "か行" => "[カ-コ]",
            "さ行" => "[サ-ソ]",
            "た行" => "[タ-ト]",
            "な行" => "[ナ-ノ]",
            "は行" => "[ハ-ホ]",
            "ま行" => "[マ-モ]",
            "や行" => "[ヤ-ヨ]",
            "ら行" => "[ラ-ロ]",
            "わ行" => "[ワ-ン]",
            "その他" => ".*"
        );
        // 目次(五十音順)
        $indexes = array(
            "ア" => "[ア]", "イ" => "[イ]", "ウ" => "[ウ]", "エ" => "[エ]", "オ" => "[オ]",
            "カ" => "[カ]", "キ" => "[キ]", "ク" => "[ク]", "ケ" => "[ケ]", "コ" => "[コ]",
            "サ" => "[サ]", "シ" => "[シ]", "ス" => "[ス]", "セ" => "[セ]", "ソ" => "[ソ]",
            "タ" => "[タ]", "チ" => "[チ]", "ツ" => "[ツ]", "テ" => "[テ]", "ト" => "[ト]",
            "ナ" => "[ナ]", "ニ" => "[ニ]", "ヌ" => "[ヌ]", "ネ" => "[ネ]", "ノ" => "[ノ]",
            "ハ" => "[ハ]", "ヒ" => "[ヒ]", "フ" => "[フ]", "ヘ" => "[ヘ]", "ホ" => "[ホ]",
            "マ" => "[マ]", "ミ" => "[ミ]", "ム" => "[ム]", "メ" => "[メ]", "モ" => "[モ]",
            "ヤ" => "[ヤ]", "ユ" => "[ユ]", "ヨ" => "[ヨ]",
            "ラ" => "[ラ]", "リ" => "[リ]", "ル" => "[ル]", "レ" => "[レ]", "ロ" => "[ロ]",
            "ワ" => "[ワ]", "ン" => "[ン]",
            "その他" => ".*"
        );
    
        $site_url = network_site_url( '/' );
    
    	$args = array(
    	'exclude' => array( 1 ),// adminを除外
    	'orderby' => 'meta_value',
    	'meta_key' => 'yomi',
    	'order'    => 'ASC',
    	'meta_query' => array(
                   'key'     => 'sakka',
                   'value'   => 'author',
                   'compare' => 'like'
    		)
    	);
    
        $my_users = get_users($args);
        $user_data_set = array();
        // 上記の条件のユーザーがいる場合は下記を指定
        if ($my_users) {
    	  foreach( $my_users as $user ):
    		setup_userdata($user);
    		$uid = $user->ID;
    		$userData = get_userdata($uid);
    		// ヨミガナの1文字目を取得する(濁点、半濁点は分離)
    		$yomi = get_user_meta($uid, 'yomi', true); // カスタムフィールドyomiの値を取得
    	        $yomi_conv = mb_convert_kana($yomi, 'h', 'UTF-8'); //全角ひらがなを半角カタカナに変換 ※ここで濁点、半濁点を分離する
    	        $yomi_conv = mb_convert_kana($yomi_conv, 'K', 'UTF-8');//半角カタカナを全角カタカナに変換
    		$yomi_first = mb_substr($yomi, 0, 1); // 先頭の1文字を取得
    
    		$users['yomi'] = $yomi; //読み仮名
    		$users['yomi_first'] = $yomi_first; //読み仮名1文字目
    		$user_data_set[] = $users;
    
            endforeach;
        }
    
        // 目次(五十音順)ごとにユーザーのデータを格納する
        $user_data_set_index = array();
        foreach ( $user_data_set as $key => $val) {
            $char = mb_substr( $val['yomi_first'], 0, 1);
            foreach ( $indexes as $index => $pattern ) {
                if (preg_match("/^" . $pattern . "/u", $char)) {
                    $user_data_set_index[$index][] = $user_data_set[$key];
                    break;
                }
            }
        }
        //目次(行)ごとにユーザーのデータを格納する
        $user_data_set_index_parent = array();
        foreach ( $user_data_set_index as $key => $val) {
            foreach ( $indexes_parents as $indexes_parent => $patterns ) {
                if (preg_match("/^" . $patterns . "/u", $key)) {
                    $user_data_set_index_parent[$indexes_parent][$key] = $user_data_set_index[$key];
                    break;
    			}
    		}
        }
     ?>
    
        <!--ここから出力-->
        <div class="js-tab">
        <?php if ($user_data_set_index_parent):?>
        <ul class="js-tab-title">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $x++; $x = sprintf("%02d",$x); ?>
            <li><a href="#anc-tab<?php echo $x; ?>"><h2><?php echo $indexes_parent; ?></h2></a></li>
            <?php endforeach; ?>
            </ul>
             
            <div class="js-tab-content">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $i++; $i = sprintf("%02d",$i); ?>
                <div class="az_list" id="anc-tab<?php echo $i; ?>">
                <?php
                foreach ($users as $index => $user): ?>
                 
                 
                <h3><?php echo $index; ?></h3>
                <ul>
                <?php foreach ($user as $key => $val) { ?>
                <li><?php echo '<a href="'.$site_url.'profile/'.$user->user_nicename.'">'.$user->display_name.'</a>'; ?></li>
                <?php } ?>        
                </ul>
                <?php endforeach; ?>
                </div><!-- .az_list -->
                <?php endforeach; ?>
                </div><!-- .js-tab-content -->
                <?php endif; ?>
                </div><!-- .js-tab -->
        <!--ここまで出力-->

    get_users() で希望通りのユーザーデータを取得できていますか?
    $my_users をダンプ(var_dump)して確認してみてはと思います。

    $my_users = get_users( $args );
    var_dump( $my_users );
    トピック投稿者 kokorog

    (@kokorog)

    ishitaka 様

    ありがとうございます。
    $my_usersのデータは正常なのでそれ以下の処理の部分で何かやらかしているのだと思います…

    ちょっとがんばって見直してみたらなんとかできそうな気がします。
    修正できたら完成コードを張り付けられたらと思うので、(こんなニッチな仕様に需要があるか分からないですが)質問は解決済みにせずちょっとこのままにしておきます。

    トピック投稿者 kokorog

    (@kokorog)

    できました!
    ひとまずシンプルに名前のみのリスト表示ですが、やりたかったことはできました。

    $yomi_first = mb_substr($yomi_conv, 0, 1);としなければいけないところを$yomi_first = mb_substr($yomi, 0, 1);になっていたため一覧が出なかったのでした…

    参考にした元のソースは読みをカタカナで入力する前提だったため$yomi_first = mb_substr($yomi, 0, 1);でも大丈夫だったのですが、自分のサイトは読みをひらがなで入れていたので$yomiで返ってくるのがひらがなでひとつもデータがないことになっていたという…

    最初に基本的な間違いを指摘してくださったishitaka様がいなかったらずっと見当違いなところを直して悩んでいたと思います。
    本当にありがとうございました!

    <?php
    
        //目次(行)
        $indexes_parents = array(
            "あ行" => "[ア-オ]",
            "か行" => "[カ-コ]",
            "さ行" => "[サ-ソ]",
            "た行" => "[タ-ト]",
            "な行" => "[ナ-ノ]",
            "は行" => "[ハ-ホ]",
            "ま行" => "[マ-モ]",
            "や行" => "[ヤ-ヨ]",
            "ら行" => "[ラ-ロ]",
            "わ行" => "[ワ-ン]",
            "その他" => ".*"
        );
        // 目次(五十音順)
        $indexes = array(
            "ア" => "[ア]", "イ" => "[イ]", "ウ" => "[ウ]", "エ" => "[エ]", "オ" => "[オ]",
            "カ" => "[カ]", "キ" => "[キ]", "ク" => "[ク]", "ケ" => "[ケ]", "コ" => "[コ]",
            "サ" => "[サ]", "シ" => "[シ]", "ス" => "[ス]", "セ" => "[セ]", "ソ" => "[ソ]",
            "タ" => "[タ]", "チ" => "[チ]", "ツ" => "[ツ]", "テ" => "[テ]", "ト" => "[ト]",
            "ナ" => "[ナ]", "ニ" => "[ニ]", "ヌ" => "[ヌ]", "ネ" => "[ネ]", "ノ" => "[ノ]",
            "ハ" => "[ハ]", "ヒ" => "[ヒ]", "フ" => "[フ]", "ヘ" => "[ヘ]", "ホ" => "[ホ]",
            "マ" => "[マ]", "ミ" => "[ミ]", "ム" => "[ム]", "メ" => "[メ]", "モ" => "[モ]",
            "ヤ" => "[ヤ]", "ユ" => "[ユ]", "ヨ" => "[ヨ]",
            "ラ" => "[ラ]", "リ" => "[リ]", "ル" => "[ル]", "レ" => "[レ]", "ロ" => "[ロ]",
            "ワ" => "[ワ]", "ン" => "[ン]",
            "その他" => ".*"
        );
    
        $site_url = network_site_url( '/' );
    
    	$args = array(
    	'exclude' => array( 1 ),// adminを除外
    	'orderby' => 'meta_value',
    	'meta_key' => 'yomi',
    	'order'    => 'ASC',
    	);
    
        $my_users = get_users($args);
        $user_data_set = array();
        // 上記の条件のユーザーがいる場合は下記を指定
        if ($my_users) {
    	  foreach( $my_users as $user ):
    		setup_userdata($user);
    		$uid = $user->ID;
    		$userData = get_userdata($uid);
    		$user_name =  $userData->display_name;
    		// ヨミガナの1文字目を取得する(濁点、半濁点は分離)
    		$yomi = get_user_meta($uid, 'yomi', true); // カスタムフィールドyomiの値を取得
    	        $yomi_conv = mb_convert_kana($yomi, 'h', 'UTF-8'); //全角ひらがなを半角カタカナに変換 ※ここで濁点、半濁点を分離する
    	        $yomi_conv = mb_convert_kana($yomi_conv, 'K', 'UTF-8');//半角カタカナを全角カタカナに変換
    		$yomi_first = mb_substr($yomi_conv, 0, 1); // 先頭の1文字を取得
    		$users['name'] = $user_name; //名前(ペンネーム)
    		$users['yomi'] = $yomi; //読み仮名
    		$users['yomi_first'] = $yomi_first; //読み仮名1文字目
    		$user_data_set[] = $users;
    
            endforeach;
        }
    
        // 目次(五十音順)ごとにユーザーのデータを格納する
        $user_data_set_index = array();
        foreach ( $user_data_set as $key => $val) {
            $char = mb_substr( $val['yomi_first'], 0, 1);
            foreach ( $indexes as $index => $pattern ) {
                if (preg_match("/^" . $pattern . "/u", $char)) {
                    $user_data_set_index[$index][] = $user_data_set[$key];
                    break;
                }
            }
        }
        //目次(行)ごとにユーザーのデータを格納する
        $user_data_set_index_parent = array();
        foreach ( $user_data_set_index as $key => $val) {
            foreach ( $indexes_parents as $indexes_parent => $patterns ) {
                if (preg_match("/^" . $patterns . "/u", $key)) {
                    $user_data_set_index_parent[$indexes_parent][$key] = $user_data_set_index[$key];
                    break;
    			}
    		}
        }
     ?>
    
        <!--ここから出力-->
        <div class="js-tab">
        <?php if ($user_data_set_index_parent):?>
        <ul class="js-tab-title">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $x++; $x = sprintf("%02d",$x); ?>
            <li><a href="#anc-tab<?php echo $x; ?>"><h2><?php echo $indexes_parent; ?></h2></a></li>
            <?php endforeach; ?>
            </ul>
             
            <div class="js-tab-content">
            <?php
                foreach ($user_data_set_index_parent as $indexes_parent => $users): $i++; $i = sprintf("%02d",$i); ?>
                <div class="az_list" id="anc-tab<?php echo $i; ?>">
                <?php
                foreach ($users as $index => $user): ?>
                 
                 
                <h3><?php echo $index; ?></h3>
                <ul>
                <?php foreach ($user as $key => $val) { ?>
                <li><?php echo $val['name']; ?></li>
                <?php } ?>        
                </ul>
                <?php endforeach; ?>
                </div><!-- .az_list -->
                <?php endforeach; ?>
                </div><!-- .js-tab-content -->
                <?php endif; ?>
                </div><!-- .js-tab -->
        <!--ここまで出力-->
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ユーザー一覧を50音順に見出しつきで表示」には新たに返信することはできません。