- ベストアンサー
WordPressで投稿記事を3パターン表示したい
- WordPressで投稿記事を3パターン表示するための方法について相談です。
- 投稿記事を3ファイルに分けて表示したいが、うまくいかず全てpage.phpとして表示されます。アドバイスをお願いします。
- page.php、page-secound.php、page-third.phpの3つのファイルがあり、それぞれのページに割り当てたカスタムフィールドを使って振り分けたいです。
- みんなの回答 (30)
- 専門家の回答
質問者が選んだベストアンサー
front-page.phpのコードをもとにして、search.phpを作ってみました。 コードはこちらです。 https://wandbox.org/permlink/vqm36EiTCbCl1QKF 私のfront-page.phpが古いかも知れませんが、変更箇所がわかるようにしていますので、最新のものと見比べてみてください。 削除している箇所は以下のように括ってコメント化しています。 /* ここから削除 (もとのコード) ここまで削除 */ 追加している箇所は以下のように括っています。 /* ここから追加 */ (追加したコード) /* ここまで追加 */ 削除と追加はそれぞれ二か所ずつあります。 SQL文は大幅に変更しています。 1.'single_rss_feed1'は以前やられていたように直接JOINしました。 2.画像はWordPress関数で取得するのでなくしました。 3.カテゴリーはWordPress関数で取得するのでなくしました。 4.$post_itemsとして使えるよう取得項目はwp_postsのすべての項目にしました。 5.全件件数取得のためのSQL文を別途追加しました。
その他の回答 (29)
- dell_OK
- ベストアンサー率13% (766/5720)
・ON テーブルのキー項目を接続ですが、下記の2つはフィールド名でしょうか? ON thumbnail.meta_value=attachment.ID はい、フィールド名です。 thumbnail.meta_value → thumbnailはwp_postmetaの別名なのでwp_postmetaのmeta_valueです。 attachment.ID → attachmentはwp_postsの別名なのでwp_postsのIDです。 私は項目名と呼んでいますが、WordPressのデータベース構造ではフィールドと表現されているので同じものだと思ってください。 ただ、キー項目はJOINで関連付けのためのキーとなる項目と言う意味で私がそう呼んでいるだけなので、WordPressのデータベース構造でキーとして定義されているもの、とは別のものだと思ってください。 ・JOINからすると画像のテーブルはwp_postmetaでしょうか? これがWordPressが複雑なところです。 画像のテーブル(画像専用のテーブル)と言うものはありません。 画像の情報はwp_postsとwp_postmetaにあります。 試しにWordPressのメディアのライブラリに画像を追加してみてください。 追加前にwp_postsとwp_postmetaの件数を確認しておいて、追加後にも確認してください wp_postsに1件、wp_postmetaに2件、データが増えると思います。 確認には以下のふたつのSQL文をそれぞれ別々に実行してみてください。 SELECT * FROM wp_posts ORDER BY ID DESC SELECT * FROM wp_postmeta ORDER BY meta_id DESC 追加後にデータの内容も確認してみましょう。 追加されたデータが最初に表示されると思います。 wp_postsはIDとguidとpost_typeを見てください。 post_typeはattachmentでguidがURLになっていると思います。 wp_postmetaはpost_idを見てください。 2件ともwp_postsのIDと同じ値だと思います。 これが画像のIDになります。 画像の情報としてはここまでで、wp_postsが主としてあって、それにwp_postmetaが従としてあるような感じです。 この段階ではまだ投稿記事とは関連付けられていません。 すでにある投稿記事のひとつにアイキャッチ画像として先ほど追加した画像を設定してください。 投稿記事のデータを確認してみます。 以下のSQL文で最後に更新された投稿記事が最初に表示されると思います。 SELECT * FROM wp_posts WHERE post_type='post' ORDER BY post_modified DESC IDを見てください。 次にwp_postmetaの内容を確認します。 たぶん最初に表示されているデータでいいと思います。 SELECT * FROM wp_postmeta ORDER BY meta_id DESC post_idはwp_postsのIDと同じ値で、meta_keyが_thumbnail_idになっていると思います。 meta_valueが先ほど画像を追加した時に確認した画像のIDと同じ値になっていると思います。 データの確認で長くなりましたが、言葉で説明してみます。 wp_postsに投稿記事のIDがある。 wp_postsに画像のIDがある。 どちらも同じテーブルにあり、それぞれに関連付けはありません。 アイキャッチ画像として、投稿記事と画像を関連付けているテーブルがwp_postmetaです。 wp_postmetaの項目は以下のようになっています。 post_id 投稿記事のID meta_key _thumbnail_id(meta_valueの値はアイキャッチ画像のIDですよの意味) meta_value 画像のID 改めてSQL文を見てみます。 FROM wp_posts AS post(投稿記事) LEFT JOIN ( SELECT * FROM wp_postmeta(関連付けテーブル) WHERE meta_key = '_thumbnail_id'(meta_valueの値はアイキャッチ画像のIDですよ) ) AS thumbnail ON post.ID(投稿記事の投稿記事のID) = thumbnail.post_id(関連付けテーブルの投稿記事のID) LEFT JOIN wp_posts AS attachment(画像) ON thumbnail.meta_value(関連付けテーブルの画像のID) = attachment.ID(画像の画像のID) ・カテゴリーのテーブルはwp_termsでフィールドはterm_idであってますでしょうか? カテゴリー自体のテーブルはwp_termsであっていると思います。 ただ、画像と同じで、投稿記事と関連付けているテーブルが別にあるはずです。 さらに、画像よりも難しいのはカテゴリーは投稿記事ひとつに複数設定できることです。
お礼
下記のサイトでカテゴリーを表示する方法があったのですが、個別の投稿IDなどから記事別のカテゴリーを制限して表示することなどはSQLでは不可能なのでしょうか? http://dbinfo.sakura.ne.jp/?contents_id=42 SELECT DISTINCT cate.category_name, COUNT(*) category_cnt, cate.category_id FROM contents AS con LEFT JOIN category AS cate USING(category_id) GROUP BY category_id 結果を$category_allに格納しsmartyにアサイン。 [smarty側記述例] {foreach from=$category_all item=value} {$value.category_name}({$value.category_cnt}) {/foreach}
補足
・ON テーブルのキー項目を接続ですが、下記の2つはフィールド名でしょうか? ON thumbnail.meta_value=attachment.ID はい、フィールド名です。 thumbnail.meta_value → thumbnailはwp_postmetaの別名なのでwp_postmetaのmeta_valueです。 attachment.ID → attachmentはwp_postsの別名なのでwp_postsのIDです。 私は項目名と呼んでいますが、WordPressのデータベース構造ではフィールドと表現されているので同じものだと思ってください。 A.詳しく解説いただきありがとうございます。略称なのですね、別のフィールド名かと勘違いしておりました。 これがWordPressが複雑なところです。 画像のテーブル(画像専用のテーブル)と言うものはありません。 画像の情報はwp_postsとwp_postmetaにあります。 A.テーブルがない項目もあるんですね。 wp_postsに投稿記事のIDがある。 wp_postsに画像のIDがある。 どちらも同じテーブルにあり、それぞれに関連付けはありません。 アイキャッチ画像として、投稿記事と画像を関連付けているテーブルがwp_postmetaです。 wp_postmetaの項目は以下のようになっています。 post_id 投稿記事のID meta_key _thumbnail_id(meta_valueの値はアイキャッチ画像のIDですよの意味) meta_value 画像のID 改めてSQL文を見てみます。 FROM wp_posts AS post(投稿記事) LEFT JOIN ( SELECT * FROM wp_postmeta(関連付けテーブル) WHERE meta_key = '_thumbnail_id'(meta_valueの値はアイキャッチ画像のIDですよ) ) AS thumbnail ON post.ID(投稿記事の投稿記事のID) = thumbnail.post_id(関連付けテーブルの投稿記事のID) LEFT JOIN wp_posts AS attachment(画像) ON thumbnail.meta_value(関連付けテーブルの画像のID) = attachment.ID(画像の画像のID) A.共通の項目から関連付けを行うのですね、理解することができました。ありがとうございます。 ・カテゴリーのテーブルはwp_termsでフィールドはterm_idであってますでしょうか? カテゴリー自体のテーブルはwp_termsであっていると思います。 ただ、画像と同じで、投稿記事と関連付けているテーブルが別にあるはずです。 さらに、画像よりも難しいのはカテゴリーは投稿記事ひとつに複数設定できることです。 A.再度探してみます。カテゴリーが複数ある場合処理を繰り返すコードが必要なのでしょうか…
- dell_OK
- ベストアンサー率13% (766/5720)
・1番上は何を示しているのでしょうか? attachment.guid AS thumnail.url これのことですね。 これはその上の、 post.comment_count, に続いて取得する項目を指定しているだけです。 ASがあったので何か特別なものと思われたでしょうか。 説明しておくと、これはサムネイルのURLと言う意味で、項目名に別名を付けています。 なぜかと言うと元の名前であるguidと言うものがそもそもそのためのものの名前ではないからです。 たまたまguidと言う項目にURLっぽいものがあったので使いましたが、このguidと言う名称の意味はIDであるため、別名を付けました。 他の項目、 post_title post_date post_excerpt comment_count にも別名を付けることはできますが、このままの名前で項目の意味がわかるのと、項目名が重複していないので、別名を付ける必要はないと判断して付けていません。 もしかすると今後、重複する項目名が登場したらその時にまた説明すると思います。 余談ですが、予備知識として。 guid改めGUIDとは、とんでもなくおそろしいものです。 その構造はたいていのシステムがうまくやってくれるので利用者が覚える必要はありません。 検索すると以下のような説明がありました。 「世界中で重複することがなく、ユニーク(唯一)であることが保証された128bitのランダムな数値。オブジェクト指向システムにおいて、オブジェクトを識別するためなどに利用される。」 おそろしいのは「世界で唯一」と言うことです。 前の回答でIDはテーブル内でユニークと説明しましたが、それをはるかにこえて世界で唯一なのです。 大げさに言いましたが、単純に言うとIDなので、別名を付けたわけです。 それにWordPress内でどのようにGUIDとして機能させているのかデータベース構造には書かれていないので用途不明です。
お礼
投稿のIDからカテゴリーを取得できそうなのですが、どうでしょうか? 2通り方法がありそうです。投稿した記事一覧のカテゴリーを取得する方法とあるので、記事ごとのカテゴリーを取得できるのか不明ですが… wp_term_relationshipsをジョインしてwp_term_taxonomy、wp_termsから紐づくカテゴリを取得する https://www.agent-grow.com/self20percent/2017/04/20/get-articles-list-from-database-of-wordpress/
補足
GURIDのままだとわかりにくいので、別名を付けたということですね、post-_は確かに用途がわかりやすいです。 勉強になりました。ありがとうございます。
- dell_OK
- ベストアンサー率13% (766/5720)
・キー項目というのは前日挙げたフィールドのことでしょうか?(post_titleやpost_dateなど) いいえ、テーブル同士を関連付けるための項目です。 キー項目としてはIDと呼ばれるものを使うのが一般的です。 IDと言うのはその主となるテーブル内でユニークであることが前提となるものです。 wp_postsのIDはたまたまかどうか名前がIDになっていますが、名前がIDでなければいけないわけではありません。 ただ~_IDのようにそれがIDだとわかるような名前であるべきだとは思います。 また従となるテーブルに対となるように同じ意味で同じ値を保持する項目を持たせることで主従のテーブルを関連付けることができます。 主従でキー項目の名前が同じである必要はありませんが、なるべく同じであった方がいいとは思います。 WordPressのデータベース構造は簡単そうな構成で複雑に絡み合っているので、一般的なと言う私の話しは通用しません。 WordPressのデータベース構造がなぜこうなっているのかはわかりかねますが、名前のIDが大文字のものもあれば小文字のものもあって、WordPress新参者には理解できません。 その長い歴史の中で試行錯誤の結果こうなったのでしょう。 post_titleやpost_dateがキー項目としては使えない、と言い切るわけではありません。 これと対になるような項目が他にあれば関連付けはできます。 関連付けるテーブル同士に同じ意味で同じ値を持つものがあればそれをキー項目として使えます。 前にも書きましたが、おそらくWordPressではID(名前はIDや~_IDや~_id)だけで関連付けできそうです。 できない場合が出てきたらその時に考えたいと思います。 ・エラーが出ており原因を調べています。 wp-posts → wp_posts INNNER → INNER
お礼
回答を分けてしまいすみません。 下記のサイトでobject_id に投稿記事の ID 、レコードの term_taxonomy_id にカテゴリーIDが格納されている とありますので、投稿IDとカテゴリーIDを紐付けてカテゴリーを出力するようなことは可能でしょうか? 表示する際はカテゴリーを一覧表示するような形を想像しているのですが。 ※参考サイト https://www.dogrow.net/php/blog50/ https://buco-bianco.com/wordpress-get-tag-join-sql/
補足
説明ありがとうございます。IDなのですね、勉強になりました。
- dell_OK
- ベストアンサー率13% (766/5720)
続きを読むについては未調査です。 画像の方が簡単そうだったので先にこちらを。 ---- SELECT post.post_title, post.post_date, post.post_excerpt, post.comment_count, attachment.guid AS thumbnail_url FROM wp_posts AS post LEFT JOIN ( SELECT * FROM wp_postmeta WHERE meta_key = '_thumbnail_id' ) AS thumbnail ON post.ID = thumbnail.post_id LEFT JOIN wp_posts AS attachment ON thumbnail.meta_value = attachment.ID WHERE post.post_type = 'post' AND post.post_status = 'publish' ORDER BY post.post_date DESC ---- AS ~は別名と呼ばれるもので、テーブル名や項目名に別の名前を付けることができます。 その名前で何かがわかるようにするために上記のような例にしていますが、postはp、thumbnailはt、attachmentはaのように一文字でもかまいません。 意味を重視するか、短くして書きやすくするか、という違いです。 意味重視で説明していきますので、書き間違えないように気を付けてください。 wp_postmetaは直接JOINせずに副問い合わせと呼ばれるものにしています。 他の書き方もあるのですが、ここはwp_postmetaからサムネイルを取得する、というのがわかりやすく見えるのでこうしています。 attachment.guidは画像ファイルのURLぽいもののようだったのでこれを使いました。 ただしデータベース構造にはそのような記述はありません。 サムネイルURLを取得するWordPress関数を調べてみましたが、全然違う方法で、フォルダ名を生成していたので、SQLだけでは取得できないみたいでした。 とりあえずは、このURLを使ってみて、問題が発生したら別の方法を考えたいと思います。
補足
分からなかったことが数点あり質問させていただきます。 ASは別名、テーブル名、項目名ですが、下2つはテーブルとして扱っているのはわかるのですが、1番上は何を示しているのでしょうか? attachment.guid AS thumnail.url wp_posts AS post wp_posts AS attachment ON テーブルのキー項目を接続ですが、下記の2つはフィールド名でしょうか? ON thumbnail.meta_value=attachment.ID JOINからすると画像のテーブルはwp_postmetaでしょうか? カテゴリーのテーブルはwp_termsでフィールドはterm_idであってますでしょうか?
- dell_OK
- ベストアンサー率13% (766/5720)
・INNER JOINでテーブルの合成ができるようですが上手く出来ません、どうすれば良いのでしょうか? SQL文の書き方を説明するのは簡単ですし、書き方も簡単なのですが、テーブルや項目をどのように組み合わせるかと言うのはまったく別の話しでとても難しく期待しているものを取得するのは大変だと思います。 JOINの基本的な書き方は説明しておきます。 簡単にふたつのテーブルをひとつのキーで結合する場合はこんな感じです。 ---- SELECT * FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.キー1=テーブル2.キー1 ---- みっつのテーブルやふたつのキーで結合する場合はこんな感じです。 ---- SELECT * FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.キー1=テーブル2.キー1 INNER JOIN テーブル3 ON テーブル1.キー1=テーブル3.キー1 AND テーブル1.キー2=テーブル3.キー2 ---- 結合テーブルごとにキーの指定が必要です。 ON を書いて続いてそれぞれのテーブルのキー項目を=で接続します。 キー項目が複数ある場合はANDで接続します。 WordPressではIDがこまかく割り当てられているので、複数書くことはないかもしれません。 上記例ではテーブル1にテーブル2とテーブル3の両方を結合していますが、テーブル1にテーブル2を結合し、テーブル2にテーブル3を結合する、というひとつずつを連鎖させて結合する場合もあります。 ・INNER JOIN $wpdb->wp-posts INNER JOIN wp_comment INNER JOIN wp_terms ON post_id = ID こちらを訂正するとしたら、全文がないので微妙ですが。 wp_postsの前はFROMです。 wp_commentはwp_commentsでテーブル名誤りです。 wp_commentsにONが必要です。 wp_termsにはpost_idもIDもないのでwp_postsとは結合できませんし、wp_commentsと結合するつもりではないでしょうし適切なキーもありませんので、どちらとも直接結合することはできません。 wp_postsとwp_commentsとだけ結合すると以下のようになります。 ---- SELECT * FROM wp_posts INNER JOIN wp_comments ON wp_posts.ID = wp_comments.comment_post_ID WHERE wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish' ORDER BY wp_posts.post_date DESC ---- まずは、これを実行して確認してください。 出ているのはコメントがある投稿のみです。 コメントがなくても投稿は取得する必要があるはずですので、そのような場合はINNER JOINではなくOUTER JOINを使います。 ---- SELECT * FROM wp_posts LEFT OUTER JOIN wp_comments ON wp_posts.ID = wp_comments.comment_post_ID WHERE wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish' ORDER BY wp_posts.post_date DESC ---- OUTER JOINにはLEFT OUTER JOINとRIGHT OUTER JOINがあります。 これからSQLを習得すると言う段階では、LEFT OUTER JOINだけ覚えて、これしか使わないと言う考えでいいと思います。 LEFT OUTER JOINのOUTERは省略してLEFT JOINと書くこともできます。 INNERとOUTERを対比するためにあえてOUTERを書きましたが、OUTERが書かれているものはあまり見たことがないので省略していいと思います。 結合SQLがある程度できあがるまでは、SELECTは*だけにして全項目を確認できるようにしておいた方がいいと思います。 なぜいらないレコードが取得されているのか、なぜいるレコードが取得されていないのか、をいろいろな項目を自分の目で見て判断するためです。 結合SQLの場合は、項目名は、テーブル名.項目名のように書くようにしてください。 それぞれのテーブルに同じ項目名がない場合はテーブル名を省略できるのですが、後から見た時にその項目がどのテーブルのものなのかわからなくて困ることがあるからです。 実行結果は、投稿とコメント、コメントがない投稿についてはコメントの項目がNULLで表示されると思います。 このSQL文の問題は、投稿に複数のコメントがあった場合に投稿が重複して取得されてしまうことです。 投稿一覧を表示する時に同じ投稿がコメントごとに表示されるのは本意ではないと思います。 投稿とコメントとおそらくカテゴリーのためのwp_termsを結合しようと思われたのだと思いますが、1対1のレコード関係でない結合は、プログラム側で重複対応するか、より複雑なSQL文を書いて重複対応する必要があります。 ですが、これでJOINの勉強にはなったと思いますので、次回予定していた説明がだいぶ楽になりました。
補足
結合テーブルごとにキーの指定が必要です。 ON を書いて続いてそれぞれのテーブルのキー項目を=で接続します。 キー項目が複数ある場合はANDで接続します。 A.キー項目というのは前日挙げたフィールドのことでしょうか?(post_titleやpost_dateなど) wp_termsにはpost_idもIDもないのでwp_postsとは結合できませんし、wp_commentsと結合するつもりではないでしょうし適切なキーもありませんので、どちらとも直接結合することはできません。 A.テーブルが違うものは結合できないのですね、勉強になりました。ありがとうございます。 wp_postsとwp_commentsとだけ結合すると以下のようになります。 ---- SELECT * FROM wp_posts INNER JOIN wp_comments ON wp_posts.ID = wp_comments.comment_post_ID WHERE wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish' ORDER BY wp_posts.post_date DESC ---- まずは、これを実行して確認してください。 出ているのはコメントがある投稿のみです。 A.エラーが出ており原因を調べています。 ※エラー文の詳細 SELECT * FROM wp-posts INNNER JOIN wp_comments ON wp_posts.ID=wp_comments.comment_post_ID WHERE wp_posts.post_type='post' AND wp_posts.post_status='publish' ORDER BY wp_posts.post_date DESC LIMIT 0, 25 MySQL のメッセージ: ドキュメント #1064 - SQL構文エラーです。バージョンに対応するマニュアルを参照して正しい構文を確認してください。 : '-posts INNNER JOIN wp_comments ON wp_posts.ID=wp_comments.comment_post_ID ...' 付近 4 行目 _________________________ OUTER JOINにはLEFT OUTER JOINとRIGHT OUTER JOINがあります。 これからSQLを習得すると言う段階では、LEFT OUTER JOINだけ覚えて、これしか使わないと言う考えでいいと思います。 A.覚えておきます。ありがとうございます。 結合SQLがある程度できあがるまでは、SELECTは*だけにして全項目を確認できるようにしておいた方がいいと思います。 なぜいらないレコードが取得されているのか、なぜいるレコードが取得されていないのか、をいろいろな項目を自分の目で見て判断するためです。 A.なぜ省略されてるのか分からなかったので、助かりました。
- dell_OK
- ベストアンサー率13% (766/5720)
コメント数はwp_postsが持っていました。 承認されているコメントの数が随時更新されているようでしたので、これが使えると思います。 ---- SELECT post_title, post_date, post_excerpt, comment_count FROM wp_posts WHERE post_type='post' AND post_status='publish' ORDER BY post_date DESC ----
補足
一応このような形でアドバイスを頂いたので、組んでいく予定ですが画像が難しいようで2段階取得が必要なようです… 続きを読むのリンクはpost_linkになるのでしょうか? SELECT post_title, post_date, post_excerpt (別テーブルから取得したいカラム名を列挙) FROM wp_posts left join 別テーブルの名前 on wp_posts.xx = 別テーブル.xx // テーブルを結合する条件 WHERE post_type='post' AND post_status='publish' ORDER BY post_date DESC 結合条件は必須です。wp_posts に対する別テーブルレコードがないときを想定して left join にしていますが、もちろん確実に存在するなら inner join でもいいです。
- dell_OK
- ベストアンサー率13% (766/5720)
それではSQLで以下の項目を取得する方法を考えてみます。 すべて取得できるかどうかわからないので、やりながら検討していきたいと思います。 画像 タイトル 日付 カテゴリー コメント数 抜粋 続きを読む まずは簡単なところで主となるwp_postsから取得してみます。 phpMyAdminでひとつひとつ実行してみてください。 ---- SELECT * FROM wp_posts ---- 質問者さまのSQLの理解の程度がわからないので、何も知らない扱いで説明していきます。 SELECTはデータを取得する構文であることを示すもので最初に書きます。 FROM テーブル名でどのテーブルから取得するかを書きます。 SELECTとFROMの間に取得する項目を書きます。 *はすべての項目という意味の記号です。 実行すると全レコードの全項目が表示されると思います。 phpMyAdminが自動でページ処理してくれるので実際は全レコードではないかも知れませんが、上の方に(合計 n,~)と表示されているnが取得件数です。 次に取得する項目を指定してみましょう。 先ほどの結果を見て取得できそうなのは以下のものです。 項目名はデータベース構造にならった名称で説明します。 タイトル post_title 投稿日時 post_date 抜粋オプション post_excerpt *のところをそれぞれの項目名にしてみます。 項目名を複数書く場合はカンマで区切ります。 ---- SELECT post_title, post_date, post_excerpt FROM wp_posts ---- 実行すると指定した項目だけが表示されるかと思います。 ですが、投稿ではないもの(固定ページなど)や、同じタイトルがいくつか表示されていると思います。 そこで条件を指定していきます。 まずは投稿種別です。 データベース構造によると投稿種別には以下のようなものがあるそうです。 'post': 投稿 'page': ページ 'attachment': 添付ファイル 'revision': 改訂履歴・自動保存 条件を指定するにはWHEREを書きます。 WHEREに続いて条件を書きます。 取得したいのは投稿のみ'post'ですので、その条件を追加します。 post_typeが投稿種別です。 ---- SELECT post_title, post_date, post_excerpt FROM wp_posts WHERE post_type='post' ---- 実行すると取得件数が減ったと思います。 これだとわかりづらいですが、投稿ステータスが公開済みではないものも表示されています。 試しにいくつかの投稿の投稿ステータスを下書きに更新してみてください。 更新してから、同じSQLを実行するとそれも表示されるのが確認できると思います。 下書きは表示したくないので、投稿ステータスの条件を追加します。 投稿ステータスには以下のようなものがあるそうです。 'publish': 公開済み 'pending': ペンディング 'draft': 草稿 'private': プライベート(非公開) 'static':(2.0.x 以前はページ) 'object': 'attachment': 'inherit': 継承(添付ファイル、改訂履歴・自動保存のとき) 'future': 予約投稿 条件を追加するにはANDまたはORを書きます。 ANDは前後の条件の両方を満たすものです。 ORは前後の条件のどちらかを満たすものです。 ここでは投稿種別と投稿ステータスの両方の条件を満たすものを取得したいのでANDになります。 取得したいのは公開済みのみですのでその条件を指定します。 post_statusが投稿ステータスです。 もともと指定されていたので見たことはあると思います。 ---- SELECT post_title, post_date, post_excerpt FROM wp_posts WHERE post_type='post' AND post_status='publish' ---- 実行すると下書きは表示されなくなったと思います。 それが確認できたら、先ほど下書きにした投稿ステータスを投稿に戻しておいてください。 今のところ条件はこれだけにしておきます。 次は取得する順序を指定してみます。 順序を指定するにはORDER BY書きます。 ORDER BYに続いて項目名を書きます。 ここでは投稿日時が新しい順ということにしておきます。 post_dateは投稿日時です。 DESCは逆順、降順、大きい順と呼ばれるものです。 日時新しい順とは日時が大きい順ということになりますので、DESCを付けています。 ---- SELECT post_title, post_date, post_excerpt FROM wp_posts WHERE post_type='post' AND post_status='publish' ORDER BY post_date DESC ---- 実行すると投稿日時の新しい順に表示されたと思います。 試しにDESCをなくして実行もしてみてください。 投稿日時の古い順に表示されたと思います。 ひとまずここまで。
お礼
INNER JOINでテーブルの合成ができるようですが上手く出来ません、どうすれば良いのでしょうか? INNER JOIN $wpdb->wp-posts INNER JOIN wp_comment INNER JOIN wp_terms ON post_id = ID
補足
解説ありがとうございます 初めはANDは必要ないものだと思っておりました。 SELECTでPOST_IDを固定で選択して、FROM wp_postmetaで記事の重複を回避するものだと思っておりました。 調べたサイトによりますと下記のように取得可能では無いかと考えたのですが、 画像はwp-postsのテーブルからは取得出来ないのですね 画像 | wp_posts | post_name→post_content タイトル | wp_posts | post_title 日付け | wp_posts | post_date カテゴリー | wp_terms | term_id コメント数 | wp_comment | comment_approved 抜粋 | wp_posts | post_exeerpt 続きを読む | wp_posts | post_link?
- dell_OK
- ベストアンサー率13% (766/5720)
表示する項目をSQLで取得する方針でしょうか。 WordPressの関数を使った方が簡単だと思いますが、SQLの勉強を含めてということでしたら、そのように案内していきたいと思います。
お礼
参考サイトを参照するとJOINでテーブルを選択、ONでフィールドを選択していました。これに※テーブルとフィールド名をあてはめたいのですが、書き方がよくわかりません。アドバイスお願いいたします。 下記サイトを読んで心配になった点があるのですが、ofsetでのコンテンツ出力制限を設ける場合、今まで通りRSSと合わせてコード制限することは可能でしょうか? https://lindsay.chunk.jp/wordpress_customize/freeword-search/ JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id ")); これに下記のテーブルとフィールドをあてはめたいのですが、カテゴリー、コメント数、画像、続きを読むのフィールド名が間違っている気がします。訂正お願いいたします。 ※テーブルとフィールド名 画像 | wp_posts | post_name→post_content タイトル | wp_posts | post_title 日付け | wp_posts | post_date カテゴリー | wp_terms | term_id コメント数 | wp_comment | comment_approved 抜粋 | wp_posts | post_exeerpt 続きを読む | wp_posts | post_link? ※考えてみたコード //取得したいテーブルを羅列 JOIN $wpdb->wp_posts,wp_terms,wp_comments //取得したいフィールドを=でつなぐ ON $wpdb->post_title=post_date=post_excerpt=term_id=comment_approved=post_name->post_content=post_name->post_content "));
補足
可能であればSQLで勉強したいのです。 何から手をつけていけば良いのかよく分かっていないので、アドバイスを頂ければ助かります。
- dell_OK
- ベストアンサー率13% (766/5720)
・今回の文はどちらに該当するのでしょうか? phpのコードの中で文字列を組み立てて生成したselect文と、phpmyadminのSQL入力画面で入力するSQL どの文かわかりませんが、指摘コメントからすると、実行してエラーになったものですね。 これはSQL文のように見えていますが、あくまでPHPのコードで、SQL文生成前のものです。 なので、生成したSQL文でも、phpMyAdminで入力するSQL文でもありません。 phpMyAdminで実行して欲しかったのは「全体だとこんな感じです。」の下にあるSQL文です。 おそらく「サンプルコードとして記載はしますが、~」の下にあるPHPコードのSELECTの部分からを実行されたのですね。 私の書き方がよくなかったです。 あそこに<?php ?>を書いておけばそれがPHPコードであるとわかっていただけたかと思うと、申し訳ないです。 上のSQL文を生成させるためのPHPのサンプルコードという意味でした。
お礼
https://www.webopixel.net/wordpress/144.html こちらのサイトも参考にいたしました。
補足
勘違いしておりました。ご説明ありがとうございます。 画像、タイトル、日付け、カテゴリー、コメント数、抜粋、続きを読むを出力する方法がわからずテーブルの内部結合をしてみたのですが、テーブルの重複を取り除くとかよくわからない状態です… https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0 画像 | wp_posts | post_name→post_content タイトル | wp_posts | post_title 日付け | wp_posts | post_date カテゴリー | wp_terms | term_id コメント数 | wp_comment | comment_approved 抜粋 | wp_posts | post_exeerpt 続きを読む | wp_posts | post_link? 調べた限りだとこのようになります、post_idはコンテンツの重複をDISTINCT post_id で防いでいるようなのでそのままです。 続きをよむと画像がわからなくて、あいまいなのでアドバイスお願いいたします。 <?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> $results = $wpdb->get_results($wpdb->prepare(" SELECT DISTINCT post_id FROM wp_postmeta INNER JOIN $wpdb->wp-posts INNER JOIN wp_comment INNER JOIN wp_terms ON post_id = ID WHERE wp_postmeta.meta_key ='single_rss_feed1' AND post_status = 'publish' AND ({$wpdb->posts}.post_content LIKE %s OR {$wpdb->posts}.post_title LIKE %s OR {$wpdb->posts}.post_excerpt LIKE %s) "; $results = $wpdb->get_results(); ?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> </li> <?php endforeach; ?> </ul>
お礼
コードの修正ありがとうございます。 どうしても腑に落ちなかったため先に質問だけをしてしまいました。すみません。 あと2日で質問の期限が切れてしまうので、続きはこちらにお願いいたします。 https://okwave.jp/qa/q10006002.html
補足
2.画像はWordPress関数で取得するのでなくしました。 3.カテゴリーはWordPress関数で取得するのでなくしました。 4.$post_itemsとして使えるよう取得項目はwp_postsのすべての項目にしました。 A.それぞれSQLで取得しなければいけない項目だと思っていたのですが、postから取得できるのでしょうか? 今回の場合、検索データを使うためにはSQLを通す必要がある。データベースから情報をもらい、そこを通して各項目を表示する、postの場合現在のデータを表示するものだと思っていて、自分の中では$resultを通さないと条件の指定はできないと考えております。 function set_other_data($post)にSresultは通す必要はないのでしょうか? SQLを使い表示する場合は条件もSQLの関数を使うものだと思っておりました。