質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

SQL

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

WordPress

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

PHP

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

Q&A

0回答

880閲覧

WordPressで、「WP_Query」を「オリジナルのSQL」へと書き換えたい

jaimy

総合スコア13

MySQL

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

SQL

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

WordPress

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

PHP

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

0グッド

1クリップ

投稿2019/04/23 11:39

編集2019/04/23 11:48

###実現したいこと
「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内に表示したいためです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2019/04/24 16:34

何がどうダメだったのか、お願いします 少なくともまるっとSQLを上書きしちゃってるから posts_per_pageが効かなくなってるだろうし フィルタに条件がないので後のget_postsとかに影響してしまうだろうし post_statusの条件がないのでゴミ箱の中のものも拾うだろうし $wpdb->postsとかでテーブルの名前を取得していないので プレフィクスがwp_じゃなかったら動かないだろうし たくさん問題は見えます
dany

2019/07/14 09:51 編集

そこまでオリジナルSQLへのこだわりが強ければ、WP_Queryを使うメリットがないのでは? <?php $event_posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->posts INNER JOI...")); $event_posts = array_map('get_post', $event_posts); foreach ($event_posts as $p) { echo get_the_title($p->ID); } ?>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問