回答編集履歴

1

実際に WordPress で動かしてみたコードを追記した。

2016/01/30 08:43

投稿

unau
unau

スコア2468

test CHANGED
@@ -81,3 +81,203 @@
81
81
 
82
82
 
83
83
  あとは、WordPress の[カスタムクエリ](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)機能を使って、どうにかこれ相当の sql を発行できないか、というところでしょうか。
84
+
85
+
86
+
87
+ ---
88
+
89
+ 2016-01-30 17:30 追記
90
+
91
+
92
+
93
+ サブクエリを含むクエリを、WordPress のフックを使ってきれいにやる方法がわからなかったので、`$wpdb->get_result()` を直接叩く方法でやってみました。
94
+
95
+ あと、とりあえずの実装なので css もべた書きしてしまいましたが、本来は別ファイルにすべきですね。
96
+
97
+
98
+
99
+ 表示すべきカテゴリ名も、`get_categories()` を使わず、`$post` に入っているものを使えば余計な関数アクセス、DB アクセスがなくていいかな、と思いました。まだちゃんと把握していませんが、`$wpdb->get_results()` に渡すクエリでエイリアスをつけると (この場合 `main_cat.name as 'cat_name'` として `cat_namne` というエイリアスをつけています) それを簡単に拾えるみたいです (この場合 `$post->cat_name`)。
100
+
101
+
102
+
103
+ ```html
104
+
105
+ <?php
106
+
107
+ global $wpdb;
108
+
109
+ $query = "
110
+
111
+ select
112
+
113
+ main_posts.*,
114
+
115
+ main_cat.term_id as 'cat_id',
116
+
117
+ main_cat.name as 'cat_name'
118
+
119
+ from $wpdb->posts as main_posts
120
+
121
+ inner join $wpdb->term_relationships on main_posts.ID = $wpdb->term_relationships.object_id
122
+
123
+ inner join $wpdb->terms as main_cat on main_cat.term_id = $wpdb->term_relationships.term_taxonomy_id
124
+
125
+ where
126
+
127
+ not exists (
128
+
129
+ select 1
130
+
131
+ from $wpdb->posts as sub_posts
132
+
133
+ inner join $wpdb->term_relationships on sub_posts.ID = $wpdb->term_relationships.object_id
134
+
135
+ inner join $wpdb->terms as sub_cat on sub_cat.term_id = $wpdb->term_relationships.term_taxonomy_id
136
+
137
+ where
138
+
139
+ main_cat.term_id = sub_cat.term_id
140
+
141
+ and
142
+
143
+ main_posts.post_date < sub_posts.post_date
144
+
145
+ and
146
+
147
+ post_type = 'post'
148
+
149
+ and
150
+
151
+ post_status = 'publish'
152
+
153
+ order by
154
+
155
+ post_date desc
156
+
157
+ )
158
+
159
+ and
160
+
161
+ post_type = 'post'
162
+
163
+ and
164
+
165
+ post_status = 'publish'
166
+
167
+ order by
168
+
169
+ cat_id
170
+
171
+ ";
172
+
173
+ $postslist = $wpdb->get_results($query, OBJECT);
174
+
175
+ global $post;
176
+
177
+ ?>
178
+
179
+ <style>
180
+
181
+ ul.wp2clist {
182
+
183
+ list-style-type: none;
184
+
185
+ }
186
+
187
+ div.wp2box {
188
+
189
+ display: table;
190
+
191
+ }
192
+
193
+ div.wp2box .wp2image {
194
+
195
+ display: table-cell;
196
+
197
+ }
198
+
199
+ div.wp2box .wp2title {
200
+
201
+ display: table-cell;
202
+
203
+ list-style-type: none;
204
+
205
+ }
206
+
207
+ </style>
208
+
209
+ <ul class="wp2clist">
210
+
211
+ <?php foreach ( $postslist as $post ) :
212
+
213
+ setup_postdata( $post );
214
+
215
+ $link = get_permalink();
216
+
217
+ ?>
218
+
219
+ <li>
220
+
221
+ <div class="wp2box">
222
+
223
+ <div class="wp2image">
224
+
225
+ <a href="<?php echo $link; ?>">
226
+
227
+ <?php
228
+
229
+ if ( has_post_thumbnail() ) {
230
+
231
+ // サムネイル表示
232
+
233
+ the_post_thumbnail();
234
+
235
+ } else {
236
+
237
+ // サムネイルがない場合はNoImage画像表示
238
+
239
+ echo '<img src="NoImageURL" alt="NoImage">';
240
+
241
+ }
242
+
243
+ ?>
244
+
245
+ </a>
246
+
247
+ </div>
248
+
249
+ <ul class="wp2title">
250
+
251
+ <li><a href="<?php echo $link; ?>"><?php the_time('Y/m/d'); ?></a></li>
252
+
253
+ <li><a href="<?php echo $link; ?>"><?php echo $post->cat_name; ?></a></li>
254
+
255
+ <li><a href="<?php echo $link; ?>"><?php echo $post->post_title; ?></a></li>
256
+
257
+ </ul>
258
+
259
+ </div>
260
+
261
+ </li>
262
+
263
+ <?php endforeach; wp_reset_postdata(); ?>
264
+
265
+ </ul>
266
+
267
+ <?php
268
+
269
+
270
+
271
+
272
+
273
+ function xxx() {
274
+
275
+ // Exit if accessed directly
276
+
277
+ if ( !defined( 'ABSPATH' ) ) {
278
+
279
+ exit;
280
+
281
+ }
282
+
283
+ ```