質問編集履歴

1 質問に至った理由を追記しました

jaimy

jaimy score 7

2019/04/23 20:48  投稿

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

    28143 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    8358 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • SQL

    3686 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • WordPress

    10758 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る