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

回答編集履歴

1

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

2016/01/30 08:43

投稿

unau
unau

スコア2468

answer CHANGED
@@ -39,4 +39,104 @@
39
39
  ;
40
40
  ```
41
41
 
42
- あとは、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 を発行できないか、というところでしょうか。
42
+ あとは、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 を発行できないか、というところでしょうか。
43
+
44
+ ---
45
+ 2016-01-30 17:30 追記
46
+
47
+ サブクエリを含むクエリを、WordPress のフックを使ってきれいにやる方法がわからなかったので、`$wpdb->get_result()` を直接叩く方法でやってみました。
48
+ あと、とりあえずの実装なので css もべた書きしてしまいましたが、本来は別ファイルにすべきですね。
49
+
50
+ 表示すべきカテゴリ名も、`get_categories()` を使わず、`$post` に入っているものを使えば余計な関数アクセス、DB アクセスがなくていいかな、と思いました。まだちゃんと把握していませんが、`$wpdb->get_results()` に渡すクエリでエイリアスをつけると (この場合 `main_cat.name as 'cat_name'` として `cat_namne` というエイリアスをつけています) それを簡単に拾えるみたいです (この場合 `$post->cat_name`)。
51
+
52
+ ```html
53
+ <?php
54
+ global $wpdb;
55
+ $query = "
56
+ select
57
+ main_posts.*,
58
+ main_cat.term_id as 'cat_id',
59
+ main_cat.name as 'cat_name'
60
+ from $wpdb->posts as main_posts
61
+ inner join $wpdb->term_relationships on main_posts.ID = $wpdb->term_relationships.object_id
62
+ inner join $wpdb->terms as main_cat on main_cat.term_id = $wpdb->term_relationships.term_taxonomy_id
63
+ where
64
+ not exists (
65
+ select 1
66
+ from $wpdb->posts as sub_posts
67
+ inner join $wpdb->term_relationships on sub_posts.ID = $wpdb->term_relationships.object_id
68
+ inner join $wpdb->terms as sub_cat on sub_cat.term_id = $wpdb->term_relationships.term_taxonomy_id
69
+ where
70
+ main_cat.term_id = sub_cat.term_id
71
+ and
72
+ main_posts.post_date < sub_posts.post_date
73
+ and
74
+ post_type = 'post'
75
+ and
76
+ post_status = 'publish'
77
+ order by
78
+ post_date desc
79
+ )
80
+ and
81
+ post_type = 'post'
82
+ and
83
+ post_status = 'publish'
84
+ order by
85
+ cat_id
86
+ ";
87
+ $postslist = $wpdb->get_results($query, OBJECT);
88
+ global $post;
89
+ ?>
90
+ <style>
91
+ ul.wp2clist {
92
+ list-style-type: none;
93
+ }
94
+ div.wp2box {
95
+ display: table;
96
+ }
97
+ div.wp2box .wp2image {
98
+ display: table-cell;
99
+ }
100
+ div.wp2box .wp2title {
101
+ display: table-cell;
102
+ list-style-type: none;
103
+ }
104
+ </style>
105
+ <ul class="wp2clist">
106
+ <?php foreach ( $postslist as $post ) :
107
+ setup_postdata( $post );
108
+ $link = get_permalink();
109
+ ?>
110
+ <li>
111
+ <div class="wp2box">
112
+ <div class="wp2image">
113
+ <a href="<?php echo $link; ?>">
114
+ <?php
115
+ if ( has_post_thumbnail() ) {
116
+ // サムネイル表示
117
+ the_post_thumbnail();
118
+ } else {
119
+ // サムネイルがない場合はNoImage画像表示
120
+ echo '<img src="NoImageURL" alt="NoImage">';
121
+ }
122
+ ?>
123
+ </a>
124
+ </div>
125
+ <ul class="wp2title">
126
+ <li><a href="<?php echo $link; ?>"><?php the_time('Y/m/d'); ?></a></li>
127
+ <li><a href="<?php echo $link; ?>"><?php echo $post->cat_name; ?></a></li>
128
+ <li><a href="<?php echo $link; ?>"><?php echo $post->post_title; ?></a></li>
129
+ </ul>
130
+ </div>
131
+ </li>
132
+ <?php endforeach; wp_reset_postdata(); ?>
133
+ </ul>
134
+ <?php
135
+
136
+
137
+ function xxx() {
138
+ // Exit if accessed directly
139
+ if ( !defined( 'ABSPATH' ) ) {
140
+ exit;
141
+ }
142
+ ```