質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

316閲覧

WordPressプロフィール情報を指定し、同じ情報を持つユーザーIDを取得することはできますか?

daijin

総合スコア17

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/12/22 03:12

編集2018/12/30 15:36

会員サイトを作っているのですが、「おすすめユーザー」として「同じマイタグを1つ以上持つユーザー」を表示したいと考えています。

本人のマイタグは次のようにして取得できます。後述のコードの【STEP1】の部分です。

$mytags = xprofile_get_field_data( 'mytag', 1 );

(これをver_dump($mytags)するとstring(35) "餅,年賀状,初詣"のように、ID1さんのマイタグが取得できる。)

なので全体の流れは次のようになるかと考えているのですが、【STEP2】の部分がわかりません。

php

1function get_recommended_user_mytag( $userID ){ 2 3 /* 【STEP1】本人($userID)のマイタグを取得 */ 4 $mytags = xprofile_get_field_data( 'mytag', $userID ); 5 6 /* 【STEP2】それをマイタグに持つユーザーIDを取得 */ 7 $recommended_users = // わからない 8 9 /* 【STEP3】そのユーザーIDをランダムで5件取得して戻す */ 10 $result = array_rand( $recommended_users, 5 ); 11 return get_avatar($result); 12} 13 14/* 本人(ID1さん)にお勧めしたいユーザーを表示 */ 15echo get_recommended_user_mytag( 1 ); 16

get_user_byget_usersなど一通り関数を探したのですが、「$mytagsを持つユーザーID」を取得できそうな関数が見つかりません。
よろしければお詳しい方にご教示頂けますと幸いでございます。

以下、環境の補足です。
★PHP 7.0.23
★WordPress 5.2.0
★使用プラグイン
BuddyPress 4.1.0(会員サイトを作るプラグインで、xprofile_get_field_dataはこの関数です。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/12/22 10:56

お使いの環境を質問に追加していただけないでしょうか? バージョン、使用プラグイン、テーマ名等
daijin

2018/12/22 11:05

すみません、環境の補足をしました。ご指摘ありがとうございます。
daijin

2018/12/30 11:42

どなたかお分かりになる方いらっしゃいませんでしょうか…?
退会済みユーザー

退会済みユーザー

2018/12/30 15:47

matsuzakaqだろ
daijin

2018/12/30 16:31

すみません、検索したんですけど分かりませんでした。
guest

回答1

0

ベストアンサー

やり方①mytagに関するxprofile fieldデータを全件取得し、PHP側で絞り込む

PHP

1global $wpdb; 2$bp = buddypress(); 3$res = xprofile_get_field_data( 'mytag', $userID ); 4$mytags=explode(',',$res); 5 6$field_id = xprofile_get_field_id_from_name( 'mytag' ); 7$sql = sprintf("SELECT * FROM {$bp->profile->table_name_data} where field_id=%s ", $field_id); 8 9$datas= $wpdb->get_results( $sql ); 10$matchUserID = array(); 11foreach($datas as $data){ 12 13 /* 検索結果からuserIDを除外したい場合はこの部分を追加 14 if($data->user_id == $userID){ 15 continue; 16 } 17*/ 18 19 $mytags2 = ',' . $data->value . ',' ; 20 foreach($mytags as $mytag){ 21 22 if(strpos($mytags2, ',' . $mytag . ',')!==false){ 23 24 $matchUserID[]= $data->user_id; 25 break; 26 } 27 28 } 29} 30var_dump($matchUserID );

PHP側で絞り込む方法だと下の方法で起きる課題は発生しません。

やり方② sqlに条件を追加し、絞り込む

field_idの指定が抜けていたので修正

php

1global $wpdb; 2 $bp = buddypress(); 3 4 $res = xprofile_get_field_data( 'mytag', $userID ); 5 $mytags=explode(',',$res); 6 $conditions=""; 7 foreach($mytags as $key => $mytag){ 8 9 if(0 == $key){ 10 $conditions=sprintf(" and (value like '%%%s%%'", $mytag); 11 12 }else{ 13 $conditions.=sprintf(" or value like '%%%s%%'", $mytag); 14 } 15} 16 17$field_id = xprofile_get_field_id_from_name( 'mytag' ); 18$sql = sprintf("SELECT * FROM {$bp->profile->table_name_data} where field_id=%s ", $field_id); 19$sql .= $conditions . ")"; 20$profiledata = $wpdb->get_results( $sql ); 21var_dump($profiledata);

■課題
ユーザーAさんのタグ「餅」で検索した時に、ユーザーBさんのタグ「桜餅」もヒットする。
回避策)
mytagの入力を統一させる「,餅,桜,」※最初と最後にも必ず「,」を入力
select 文を「value like '%,餅,%'」となるように修正
$conditions=sprintf(" and (value like '%%,%s%,%'", $mytag);
$conditions.=sprintf(" or value like '%%,%s,%%'", $mytag);

■その他
エラーチェックはしていないので適宜追加してください。
mytagsが空の場合は処理を中断する等

投稿2018/12/25 03:34

編集2018/12/30 20:45
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/25 03:39

あ、これだと一つのタグに一人しかとれないですね。すんません。
退会済みユーザー

退会済みユーザー

2018/12/25 04:04

get_user_by関数だと一人しか引っ張れないので、get_users関数使ってください。
daijin

2018/12/30 13:33 編集

get_usersでどうやってxprofile_get_field_dataの値を取得するんですか??っていう話になりますよね?
退会済みユーザー

退会済みユーザー

2018/12/30 17:48

修正しました。
退会済みユーザー

退会済みユーザー

2018/12/30 20:06

やり方を二種類用意しました。buddypressで用意されている関数を駆使する方法は僕が調べた限り見つかりませんでした。
daijin

2018/12/31 03:34

すぐ取得できる関数があるだろうと甘く見ていたので、このレベルとは… それも二種類も、どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問