回答編集履歴

4

やり方①を改良

2018/12/30 20:45

投稿

退会済みユーザー
test CHANGED
@@ -1,14 +1,12 @@
1
- ### php側で絞り込むやり方
1
+ ### やり方①mytagに関するxprofile fieldデータを全件取得し、PHP側で絞り込む
2
2
 
3
- ```php
3
+ ```PHP
4
4
 
5
5
  global $wpdb;
6
6
 
7
7
  $bp = buddypress();
8
8
 
9
-
10
-
11
- $res = xprofile_get_field_data( 'mytag', 1 );
9
+ $res = xprofile_get_field_data( 'mytag', $userID );
12
10
 
13
11
  $mytags=explode(',',$res);
14
12
 
@@ -26,29 +24,37 @@
26
24
 
27
25
  foreach($datas as $data){
28
26
 
29
- $mytags2 = explode(',',$data->value);
27
+
30
28
 
31
- foreach($mytags2 as $mytag2){
29
+ /* 検索結果からuserIDを除外したい場合はこの部分を追加
32
30
 
33
- foreach($mytags as $mytag){
31
+ if($data->user_id == $userID){
34
32
 
35
- if($mytag2 == $mytag){
33
+ continue;
36
34
 
37
- $matchUserID []= $data->user_id;
35
+ }
38
36
 
39
- break;
37
+ */
40
38
 
39
+
40
+
41
+ $mytags2 = ',' . $data->value . ',' ;
42
+
43
+ foreach($mytags as $mytag){
44
+
45
+
46
+
47
+ if(strpos($mytags2, ',' . $mytag . ',')!==false){
48
+
49
+
50
+
51
+ $matchUserID[]= $data->user_id;
52
+
41
- }
53
+ break;
42
54
 
43
55
  }
44
56
 
45
- if($mytag2 == $mytag){
57
+
46
-
47
- break;
48
-
49
- }
50
-
51
-
52
58
 
53
59
  }
54
60
 
@@ -58,9 +64,7 @@
58
64
 
59
65
  ```
60
66
 
61
-
62
-
63
- このやり方だと下のような課題は発生しません。
67
+ PHP側で絞込むだと下の方法で起きる課題は発生しません。
64
68
 
65
69
 
66
70
 
@@ -72,7 +76,7 @@
72
76
 
73
77
 
74
78
 
75
- ### mysql側で絞り込むやり方
79
+ ### やり方② sqlに条件を追加し、絞り込む
76
80
 
77
81
 
78
82
 

3

回答の追加

2018/12/30 20:45

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,81 @@
1
+ ### php側で絞り込むやり方
2
+
3
+ ```php
4
+
5
+ global $wpdb;
6
+
7
+ $bp = buddypress();
8
+
9
+
10
+
11
+ $res = xprofile_get_field_data( 'mytag', 1 );
12
+
13
+ $mytags=explode(',',$res);
14
+
15
+
16
+
17
+ $field_id = xprofile_get_field_id_from_name( 'mytag' );
18
+
19
+ $sql = sprintf("SELECT * FROM {$bp->profile->table_name_data} where field_id=%s ", $field_id);
20
+
21
+
22
+
23
+ $datas= $wpdb->get_results( $sql );
24
+
25
+ $matchUserID = array();
26
+
27
+ foreach($datas as $data){
28
+
29
+ $mytags2 = explode(',',$data->value);
30
+
31
+ foreach($mytags2 as $mytag2){
32
+
33
+ foreach($mytags as $mytag){
34
+
35
+ if($mytag2 == $mytag){
36
+
37
+ $matchUserID []= $data->user_id;
38
+
39
+ break;
40
+
41
+ }
42
+
43
+ }
44
+
45
+ if($mytag2 == $mytag){
46
+
47
+ break;
48
+
49
+ }
50
+
51
+
52
+
53
+ }
54
+
55
+ }
56
+
57
+ var_dump($matchUserID );
58
+
59
+ ```
60
+
61
+
62
+
63
+ このやり方だと下のような課題は発生しません。
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+ ### mysql側で絞り込むやり方
76
+
77
+
78
+
1
79
  field_idの指定が抜けていたので修正
2
80
 
3
81
  ```php

2

select文の条件にfiled_id追加

2018/12/30 20:03

投稿

退会済みユーザー
test CHANGED
@@ -1,43 +1,69 @@
1
- 修正しました。
1
+ field_idの指定が抜けていたので修正
2
2
 
3
3
  ```php
4
4
 
5
5
  global $wpdb;
6
6
 
7
- $bp = buddypress();
7
+ $bp = buddypress();
8
8
 
9
9
 
10
10
 
11
- $res = xprofile_get_field_data( 'mytag', $userID );
11
+ $res = xprofile_get_field_data( 'mytag', $userID );
12
12
 
13
- $mytags=explode(',',$res);
13
+ $mytags=explode(',',$res);
14
14
 
15
- $conditions="";
15
+ $conditions="";
16
16
 
17
- foreach($mytags as $key => $mytag){
17
+ foreach($mytags as $key => $mytag){
18
18
 
19
19
 
20
20
 
21
- if(0 == $key){
21
+ if(0 == $key){
22
22
 
23
- $conditions="value like '%" . $mytag . "%'";
23
+ $conditions=sprintf(" and (value like '%%%s%%'", $mytag);
24
24
 
25
- }else{
25
+
26
26
 
27
- $conditions.=" or value like '%" . $mytag . "%'";
27
+ }else{
28
28
 
29
+ $conditions.=sprintf(" or value like '%%%s%%'", $mytag);
30
+
29
- }
31
+ }
30
32
 
31
33
  }
32
34
 
33
35
 
34
36
 
37
+ $field_id = xprofile_get_field_id_from_name( 'mytag' );
38
+
35
- $sql = "SELECT * FROM {$bp->profile->table_name_data} where " . $conditions;
39
+ $sql = sprintf("SELECT * FROM {$bp->profile->table_name_data} where field_id=%s ", $field_id);
40
+
41
+ $sql .= $conditions . ")";
36
42
 
37
43
  $profiledata = $wpdb->get_results( $sql );
38
44
 
39
45
  var_dump($profiledata);
40
46
 
47
+ ```
48
+
49
+ ■課題
50
+
51
+ ユーザーAさんのタグ「餅」で検索した時に、ユーザーBさんのタグ「桜餅」もヒットする。
52
+
53
+ 回避策)
54
+
55
+ mytagの入力を統一させる「,餅,桜,」※最初と最後にも必ず「,」を入力
56
+
57
+  select 文を「value like '%,餅,%'」となるように修正
58
+
59
+ $conditions=sprintf(" and (value like '%%,%s%,%'", $mytag);
60
+
61
+ $conditions.=sprintf(" or value like '%%,%s,%%'", $mytag);
41
62
 
42
63
 
64
+
43
- ```
65
+ ■その他
66
+
67
+ エラーチェックはしていないので適宜追加してください。
68
+
69
+ mytagsが空の場合は処理を中断する等

1

回答内容修正

2018/12/30 19:20

投稿

退会済みユーザー
test CHANGED
@@ -1,9 +1,43 @@
1
+ 修正しました。
2
+
1
3
  ```php
2
4
 
3
- foreach($mytags as $mytag){
5
+ global $wpdb;
4
6
 
7
+ $bp = buddypress();
8
+
9
+
10
+
5
- $recommended_users[]= get_user_by('mytag', $mytag);
11
+ $res = xprofile_get_field_data( 'mytag', $userID );
12
+
13
+ $mytags=explode(',',$res);
14
+
15
+ $conditions="";
16
+
17
+ foreach($mytags as $key => $mytag){
18
+
19
+
20
+
21
+ if(0 == $key){
22
+
23
+ $conditions="value like '%" . $mytag . "%'";
24
+
25
+ }else{
26
+
27
+ $conditions.=" or value like '%" . $mytag . "%'";
28
+
29
+ }
6
30
 
7
31
  }
8
32
 
33
+
34
+
35
+ $sql = "SELECT * FROM {$bp->profile->table_name_data} where " . $conditions;
36
+
37
+ $profiledata = $wpdb->get_results( $sql );
38
+
39
+ var_dump($profiledata);
40
+
41
+
42
+
9
43
  ```