回答編集履歴

5

補足

2019/04/23 02:41

投稿

CHERRY
CHERRY

スコア25171

test CHANGED
@@ -214,6 +214,16 @@
214
214
 
215
215
 
216
216
 
217
+ 使用している条件分岐タグは、下記です。
218
+
219
+ * `! is_admin()` 管理画面を除く( ! で否定 )
220
+
221
+ * `is_archive()` アーカイブテンプレート
222
+
223
+ * `is_main_query()` メインクエリー
224
+
225
+
226
+
217
227
  カスタムクエリの場合、表示まわりは、標準の archive.php のままで OK です。
218
228
 
219
229
 

4

追記修正

2019/04/23 02:41

投稿

CHERRY
CHERRY

スコア25171

test CHANGED
@@ -102,6 +102,10 @@
102
102
 
103
103
 
104
104
 
105
+ カスタムクエリで対応する例
106
+
107
+
108
+
105
109
  まず、[条件分岐タグ](http://wpdocs.osdn.jp/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%82%BF%E3%82%B0) を使って、どのテンプレートの場合に実行するのか条件を決めます。
106
110
 
107
111
  条件分岐タグで、使用場所を指定しない場合、全ての SQL に適用されることになります。
@@ -156,9 +160,9 @@
156
160
 
157
161
 
158
162
 
159
- 作成した SQL を WordPress の HOOK 合わせて構築しなおして、functions.php に記載します。
163
+ 作成した SQL を WordPress の HOOK で実行できるように構築しなおして、functions.php に記載します。
160
-
164
+
161
- INNER JOIN は `posts_join`フック、絞り込み条件がある場合の WHERE や AND は `posts_where`フックを使用します。
165
+ INNER JOIN は `posts_join`フック、絞り込み条件がある場合の WHERE や AND は `posts_where`フックを使用します。
162
166
 
163
167
 
164
168
 

3

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

2019/04/23 02:30

投稿

CHERRY
CHERRY

スコア25171

test CHANGED
@@ -93,3 +93,135 @@
93
93
 
94
94
 
95
95
  することもできます。
96
+
97
+
98
+
99
+ ----
100
+
101
+ (追記 2019.04.23 11:25)
102
+
103
+
104
+
105
+ まず、[条件分岐タグ](http://wpdocs.osdn.jp/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%82%BF%E3%82%B0) を使って、どのテンプレートの場合に実行するのか条件を決めます。
106
+
107
+ 条件分岐タグで、使用場所を指定しない場合、全ての SQL に適用されることになります。
108
+
109
+ 内容によっては、ログインできなくなったり、一切の投稿が表示されなくなったりしますので、注意してください。
110
+
111
+
112
+
113
+ 詳細がわかりませんので、アーカイブのメインクエリーと仮定します。
114
+
115
+
116
+
117
+ 希望する内容が取得できる SQL を考えます。
118
+
119
+
120
+
121
+ 質問の内容から推測して
122
+
123
+
124
+
125
+ ```
126
+
127
+ SELECT wp_posts.ID
128
+
129
+ FROM wp_posts
130
+
131
+ INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
132
+
133
+ INNER JOIN (
134
+
135
+ SELECT wp_postmeta.meta_value as number, max(wp_posts.post_date) as max_date
136
+
137
+ FROM wp_posts
138
+
139
+ INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
140
+
141
+ WHERE wp_postmeta.meta_key = 'number'
142
+
143
+ GROUP BY wp_postmeta.meta_value
144
+
145
+ ) AS j2
146
+
147
+ ON wp_postmeta.meta_value =j2.number AND wp_posts.post_date = j2.max_date
148
+
149
+ ```
150
+
151
+
152
+
153
+ のような感じでしょうか。
154
+
155
+
156
+
157
+
158
+
159
+ 作成した SQL を WordPress の HOOK 合わせて構築しなおして、functions.php に記載します。
160
+
161
+ INNER JOIN は、 `posts_join`フックで、絞り込み条件がある場合の WHERE や AND は、 `posts_where`フックを使用します。
162
+
163
+
164
+
165
+ ```
166
+
167
+ function my_posts_join_tt184471( $join )
168
+
169
+ {
170
+
171
+ global $wpdb;
172
+
173
+
174
+
175
+ if( ! is_admin() && is_archive() && is_main_query() ) {
176
+
177
+ $join .= "INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".ID = ". $wpdb->postmeta .".post_id ";
178
+
179
+
180
+
181
+ $join .= "INNER JOIN ( ";
182
+
183
+ $join .= " SELECT ". $wpdb->postmeta .".meta_value as number, max(". $wpdb->posts .".post_date) as max_date ";
184
+
185
+ $join .= " FROM ". $wpdb->posts;
186
+
187
+ $join .= " INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".id = ". $wpdb->postmeta .".post_id ";
188
+
189
+ $join .= " WHERE ". $wpdb->postmeta .".meta_key = 'number' ";
190
+
191
+ $join .= " GROUP BY ". $wpdb->postmeta .".meta_value ";
192
+
193
+ $join .= " ) AS j1 ";
194
+
195
+ $join .= " ON ". $wpdb->postmeta .".meta_value = j1.number AND ". $wpdb->posts .".post_date = j1.max_date ";
196
+
197
+ }
198
+
199
+
200
+
201
+ return $join;
202
+
203
+ }
204
+
205
+
206
+
207
+ add_filter('posts_join', 'my_posts_join_tt184471' );
208
+
209
+ ```
210
+
211
+
212
+
213
+ カスタムクエリの場合、表示まわりは、標準の archive.php のままで OK です。
214
+
215
+
216
+
217
+ --
218
+
219
+
220
+
221
+ 参考:
222
+
223
+ * [カスタムクエリ](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)
224
+
225
+ * [posts_join](https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join)
226
+
227
+ * [posts_where](https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where)

2

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

2019/04/23 02:29

投稿

CHERRY
CHERRY

スコア25171

test CHANGED
@@ -37,6 +37,10 @@
37
37
  'meta_value' => $value,
38
38
 
39
39
  'meta_compare' => '=',
40
+
41
+ 'order' => 'DESC',
42
+
43
+ 'orderby' => 'date',
40
44
 
41
45
  );
42
46
 

1

追記修正

2019/04/22 02:31

投稿

CHERRY
CHERRY

スコア25171

test CHANGED
@@ -12,9 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- という動作になります。
15
+ という処理を書く必要があります。
16
-
17
-
18
16
 
19
17
 
20
18