###実現したいこと
「WP_Query」を「オリジナルのSQL」へと書き換えたいです。
具体的にいいますと、こちらの「$event_query」に、後の「オリジナルのSQL」を入れたいです。
php
1if($event_query->have_posts()): while($event_query->have_posts()): $event_query->the_post(); 2 the_title(); 3endwhile; endif;
###オリジナルのSQL
カスタムフィールド「cf_number」に応じて記事を取得するオリジナルのSQLがこちらで、問題ないです。
php
1function my_posts_join( $join ){ 2 global $wpdb; 3 4 if( ! is_admin() ) { 5 $join .= "INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".ID = ". $wpdb->postmeta .".post_id "; 6 7 $join .= "INNER JOIN ( "; 8 $join .= " SELECT ". $wpdb->postmeta .".meta_value as cf_number, max(". $wpdb->posts .".post_date) as max_date "; 9 $join .= " FROM ". $wpdb->posts; 10 $join .= " INNER JOIN ". $wpdb->postmeta ." ON ". $wpdb->posts .".id = ". $wpdb->postmeta .".post_id "; 11 $join .= " WHERE ". $wpdb->postmeta .".meta_key = 'cf_number' "; 12 $join .= " GROUP BY ". $wpdb->postmeta .".meta_value "; 13 $join .= " ) AS j1 "; 14 $join .= " ON ". $wpdb->postmeta .".meta_value = j1.cf_number AND ". $wpdb->posts .".post_date = j1.max_date "; 15 } 16 17 return $join; 18} 19 20add_filter('posts_join', 'my_posts_join' );
###試したこと
上の「オリジナルのSQL」を「$event_query」に入れるために、「posts_request」を使ってみました。しかし下記の書き方ではできませんでした。
間違っているところがどこか、分かりますでしょうか?
php
1<?php 2// 「オリジナルのSQL」に書き変える 3add_filter('posts_request', function ($query) { 4 global $wpdb; 5 $query = " 6 SELECT wp_posts.ID 7 FROM wp_posts 8 INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 9 INNER JOIN ( 10 SELECT wp_postmeta.meta_value as cf_number, max(wp_posts.post_date) as max_date 11 FROM wp_posts 12 INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 13 WHERE wp_postmeta.meta_key = 'cf_number' 14 GROUP BY wp_postmeta.meta_value 15 ) AS j2 16 ON wp_postmeta.meta_value =j2.cf_number AND wp_posts.post_date = j2.max_date 17 "; 18 return $query; 19}); 20 21// 「オリジナルのSQL」で記事を取得する 22$event_query = new WP_Query([ 23 'posts_per_page' => 20, 24]); 25if($event_query->have_posts()): while($event_query->have_posts()): $event_query->the_post(); 26 the_title(); 27endwhile; endif; 28?>
###追記
なぜ「my_posts_join」だけでメインループを使うという方法ではなくて、わざわざ「$event_query」を使うのか。といいますと、記事を「表示ボタン」をクリックしたときに指定のdiv内に表示したいためです。
あなたの回答
tips
プレビュー