teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

補足

2019/04/23 02:41

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -106,6 +106,11 @@
106
106
  add_filter('posts_join', 'my_posts_join_tt184471' );
107
107
  ```
108
108
 
109
+ 使用している条件分岐タグは、下記です。
110
+ * `! is_admin()` 管理画面を除く( ! で否定 )
111
+ * `is_archive()` アーカイブテンプレート
112
+ * `is_main_query()` メインクエリー
113
+
109
114
  カスタムクエリの場合、表示まわりは、標準の archive.php のままで OK です。
110
115
 
111
116
  --

4

追記修正

2019/04/23 02:41

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -50,6 +50,8 @@
50
50
  ----
51
51
  (追記 2019.04.23 11:25)
52
52
 
53
+ カスタムクエリで対応する例
54
+
53
55
  まず、[条件分岐タグ](http://wpdocs.osdn.jp/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%82%BF%E3%82%B0) を使って、どのテンプレートの場合に実行するのか条件を決めます。
54
56
  条件分岐タグで、使用場所を指定しない場合、全ての SQL に適用されることになります。
55
57
  内容によっては、ログインできなくなったり、一切の投稿が表示されなくなったりしますので、注意してください。
@@ -77,8 +79,8 @@
77
79
  のような感じでしょうか。
78
80
 
79
81
 
80
- 作成した SQL を WordPress の HOOK 合わせて構築しなおして、functions.php に記載します。
82
+ 作成した SQL を WordPress の HOOK で実行できるように構築しなおして、functions.php に記載します。
81
- INNER JOIN は `posts_join`フック、絞り込み条件がある場合の WHERE や AND は `posts_where`フックを使用します。
83
+ INNER JOIN は `posts_join`フック、絞り込み条件がある場合の WHERE や AND は `posts_where`フックを使用します。
82
84
 
83
85
  ```
84
86
  function my_posts_join_tt184471( $join )

3

カスタムクエリの例を追加

2019/04/23 02:30

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -45,4 +45,70 @@
45
45
  * [カスタムクエリ](https://wpdocs.osdn.jp/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AF%E3%82%A8%E3%83%AA) を利用して、WP_Query の条件を SQL で設定したり
46
46
  * [関数リファレンス/wpdb_Class](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class) を利用して、直接、SQLで検索したり
47
47
 
48
- することもできます。
48
+ することもできます。
49
+
50
+ ----
51
+ (追記 2019.04.23 11:25)
52
+
53
+ まず、[条件分岐タグ](http://wpdocs.osdn.jp/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%82%BF%E3%82%B0) を使って、どのテンプレートの場合に実行するのか条件を決めます。
54
+ 条件分岐タグで、使用場所を指定しない場合、全ての SQL に適用されることになります。
55
+ 内容によっては、ログインできなくなったり、一切の投稿が表示されなくなったりしますので、注意してください。
56
+
57
+ 詳細がわかりませんので、アーカイブのメインクエリーと仮定します。
58
+
59
+ 希望する内容が取得できる SQL を考えます。
60
+
61
+ 質問の内容から推測して
62
+
63
+ ```
64
+ SELECT wp_posts.ID
65
+ FROM wp_posts
66
+ INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
67
+ INNER JOIN (
68
+ SELECT wp_postmeta.meta_value as number, max(wp_posts.post_date) as max_date
69
+ FROM wp_posts
70
+ INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
71
+ WHERE wp_postmeta.meta_key = 'number'
72
+ GROUP BY wp_postmeta.meta_value
73
+ ) AS j2
74
+ ON wp_postmeta.meta_value =j2.number AND wp_posts.post_date = j2.max_date
75
+ ```
76
+
77
+ のような感じでしょうか。
78
+
79
+
80
+ 作成した SQL を WordPress の HOOK 合わせて構築しなおして、functions.php に記載します。
81
+ INNER JOIN は、 `posts_join`フックで、絞り込み条件がある場合の WHERE や AND は、 `posts_where`フックを使用します。
82
+
83
+ ```
84
+ function my_posts_join_tt184471( $join )
85
+ {
86
+ global $wpdb;
87
+
88
+ if( ! is_admin() && is_archive() && is_main_query() ) {
89
+ $join .= "INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".ID = ". $wpdb->postmeta .".post_id ";
90
+
91
+ $join .= "INNER JOIN ( ";
92
+ $join .= " SELECT ". $wpdb->postmeta .".meta_value as number, max(". $wpdb->posts .".post_date) as max_date ";
93
+ $join .= " FROM ". $wpdb->posts;
94
+ $join .= " INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".id = ". $wpdb->postmeta .".post_id ";
95
+ $join .= " WHERE ". $wpdb->postmeta .".meta_key = 'number' ";
96
+ $join .= " GROUP BY ". $wpdb->postmeta .".meta_value ";
97
+ $join .= " ) AS j1 ";
98
+ $join .= " ON ". $wpdb->postmeta .".meta_value = j1.number AND ". $wpdb->posts .".post_date = j1.max_date ";
99
+ }
100
+
101
+ return $join;
102
+ }
103
+
104
+ add_filter('posts_join', 'my_posts_join_tt184471' );
105
+ ```
106
+
107
+ カスタムクエリの場合、表示まわりは、標準の archive.php のままで OK です。
108
+
109
+ --
110
+
111
+ 参考:
112
+ * [カスタムクエリ](http://wpdocs.osdn.jp/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AF%E3%82%A8%E3%83%AA)
113
+ * [posts_join](https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join)
114
+ * [posts_where](https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where)

2

ソート条件を明記 (デフォルトも 'date' / 'DESC' なので動作は同じ)

2019/04/23 02:29

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -18,6 +18,8 @@
18
18
  'meta_key' => 'number',
19
19
  'meta_value' => $value,
20
20
  'meta_compare' => '=',
21
+ 'order' => 'DESC',
22
+ 'orderby' => 'date',
21
23
  );
22
24
  $query = new WP_Query( $args );
23
25
  if ( $query->have_posts() ) {

1

追記修正

2019/04/22 02:31

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -5,9 +5,8 @@
5
5
  1. カスタムフィールドに含まれる値一覧の配列を用意
6
6
  2. カスタムフィールドの値を1つずつループさせて WP_Query でデータ取得
7
7
 
8
- という動作になります。
8
+ という処理を書く必要があります。
9
9
 
10
-
11
10
  たとえば、$values にカスタムフィールドの値一覧を用意しておいて、foreach でカスタムフィールドの項目を1項目ずつ WP_Query に渡して カスタムフィールドの値ごとに1回ずつ検索する必要があります。
12
11
 
13
12
  ```