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

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

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

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

PHP

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

Q&A

解決済

2回答

2879閲覧

$wpdbを使用して、タグに紐づいている公開記事のみ修得

ikemon

総合スコア39

SQL

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

PHP

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

0グッド

0クリップ

投稿2017/03/27 09:05

###前提・実現したいこと
WordPressの$wpdbで、タグに紐づいている公開記事のみを習得したいです。

例)

タグ情報

タグ名term_id
果物18

記事情報(全てタグ「果物」に紐づき)

記事名IDステータス
レモン10private
メロン20publish
バナナ21publish
スイカ22publish

→ タグ「果物」に該当 & ステータス「publish」の記事のみ取得したい(メロン、バナナ、スイカ)

###試したこと
①まず、「wp_term_relationships」テーブルにアクセスし、タグに紐づく記事の「object_id」を取得。

PHP

1<?php 2global $wpdb; 3$myrows = $wpdb->get_results( "SELECT object_id FROM $wpdb->term_relationships WHERE 18" ); 4$gaitou = array(); //空の配列を用意 5foreach ($myrows as $value) { 6 $gaitou[] = $value->object_id; //ループを回して配列にobject_idを格納していく 7} 8 9■配列の中身 10<?php var_dump($gaitou); ?> 11 12↓↓ 13 14array (size=4) 15 0 => string '10' (length=2) 16 1 => string '20' (length=2) 17 2 => string '21' (length=2) 18 3 => string '22' (length=2) 19

②次に「wp_posts」にアクセスし、ステータスが「publish」の記事の「ID」のみ取得

PHP

1 2$kizi = "ID = '$gaitou[0]' OR ID = '$gaitou[1]' OR ID = '$gaitou[2]' OR ID = '$gaitou[3]'"; 3 4$data = $wpdb->get_results( " 5 SELECT post_title 6 FROM $wpdb->posts 7 WHERE $kizi 8 AND post_status = 'publish' 9" ); 10foreach ($data as $value) { 11 echo $value->post_title . "<br />"; 12} 13 14↓↓結果 15 16レモン 17メロン 18バナナ 19スイカ 20 21※非公開のレモンも取得されてしまします。 22

###発生している問題

②のwp_postsで取得時、WHEREで「post_status = 'publish'」を指定しても、「post_status = 'private'」のものまで取得されてしまいます。
タグに該当する記事の件数取得のためこのような処理が必要なのですが、コードで間違っている箇所などございますでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

手元に環境がないため マニュアルからの推測による回答となりますが、、
https://wpdocs.osdn.jp/データベース構造

ER図を見る限り、以下の通り 1回の SQL文の実行で望む結果は得られそうです。

sql

1SELECT p.post_title 2FROM wp_posts AS p 3INNER JOIN wp_term_relationships AS tr ON p.ID = tr.object_id 4INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id 5WHERE p.post_status = 'publish' 6 AND tt.term_id = 18;

上の SQL文を PHPコードに埋め込む作業はそれほど難しくないはずなので、そこはご自分で対応してください。


私が気づいた限りでご質問の

コードで間違っている箇所

は、以下のとおりです。

Before

sql

1$myrows = $wpdb->get_results( "SELECT object_id FROM $wpdb->term_relationships WHERE 18" );

After

sql

1$myrows = $wpdb->get_results( "SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.term_id = 18" );
  1. wp_term_relationships テーブルに object_id というカラムは存在しない。
  2. WHERE 18 は、意味的におかしい。

Before

php

1$kizi = "ID = '$gaitou[0]' OR ID = '$gaitou[1]' OR ID = '$gaitou[2]' OR ID = '$gaitou[3]'";

After

php

1$kizi = "(ID = '$gaitou[0]' OR ID = '$gaitou[1]' OR ID = '$gaitou[2]' OR ID = '$gaitou[3]')";
  1. ()を付けないと、演算子の優先順位により

sql

1ID = 1 OR ID = 2 OR ID = 3 AND post_status = 'publish'

sql

1ID = 1 OR ID = 2 OR (ID = 3 AND post_status = 'publish')

と同じ意味になる。
https://dev.mysql.com/doc/refman/5.6/ja/operator-precedence.html

おそらく、

「post_status = 'private'」のものまで取得されてしま

う直接の原因が、これです。

投稿2017/03/27 09:48

編集2017/03/27 09:50
KiyoshiMotoki

総合スコア4791

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

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

ikemon

2017/03/28 02:10

演算子に優先順位があるのですね。 お教えいただいた方法で実装ができました! 非常に分かりやすい説明で勉強にもなりました、ありがとうございます!
guest

0

以下のコードを試してみてください。

PHP

1$data = $wpdb->get_results( " 2 SELECT post_title 3 FROM $wpdb->posts 4 WHERE ( $kizi ) 5 AND post_status = 'publish' 6" );

投稿2017/03/27 09:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ikemon

2017/03/28 02:11

上記の方法で実装ができました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問