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

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

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

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

PHP

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

Q&A

解決済

2回答

1945閲覧

【$wpdb】'meta_key'で絞った投稿の数をCOUNTで取得したい

pineappleman

総合スコア26

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/10/02 12:08

前提・実現したいこと

Wordpressでレビューサイトを作成しています。

発生している問題・エラーメッセージ

質問はpost_metaテーブルの
「pm.meta_key」で絞り込んだ投稿の件数を取得したいのですが
返り値が次のようになってしまい困惑しています。

array(0) { }

該当のソースコード

php

1<?php 2 global $wpdb; 3 $cnt = $wpdb->get_results 4 ("SELECT count(*) 5 FROM $wpdb->posts 6 INNER JOIN 'wp_postmeta pm' ON wp_posts.id = pm.post_id 7 WHERE wp_posts.post_status = 'publish' 8 AND wp_posts.post_type = 'post' 9 AND pm.meta_key = '_keyname' 10 "); 11 var_dump($cnt); 12 ?>

試したこと

検索と書籍で数々のソースを試したのですが
基礎知識が不足しているため理解が及ばず
それらしいコードで組み上げた形です。

初心者レベルのため初歩的なつまずきがあるかと思いますが
問題点をご指摘いただけると大変助かります。

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

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

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

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

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

m.ts10806

2018/10/02 12:12

PHPからではなく直接SQLを実行して確認してみましたか?$wpdb->postsなど変数のところか実際の情報に置き換える必要はありますが、そこで間違いなく結果が返ってくれば大丈夫だと思います。
m.ts10806

2018/10/02 12:17

一応、回答はしてみますが、あくまで「エラーが出ないSQL」にしただけです。データ・テーブルが確実に存在しているかはもちろんですが、実際にDB上でSQLを実行してみて想定通りの結果が返ってくるかどうかを確かめてからプログラム上で利用するのが確実です。
guest

回答2

0

SQLに自信が無いなら、WP_Queryで絞り込んでそのSQLを流用するとか。

【Query Monitor | WordPress.org】
https://ja.wordpress.org/plugins/query-monitor/

【WordPressのデバッグプラグイン「Query Monitor」をサイト制作・カスタマイズに役立てよう | 東京上野のWeb制作会社LIG】
https://liginc.co.jp/web/wp/plug-in/151347

投稿2018/10/02 13:19

kei344

総合スコア69364

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

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

pineappleman

2018/10/30 03:11

ご返信が遅くなり、大変失礼致しました。 こんな機能があるとは知らず、驚きました。 ご回答、ありがとうございました!
guest

0

ベストアンサー

現在のSQLではPHPの変数部分を置き換えたとしてもSQL上のエラーが出るのでおそらくこうです。

php

1(" 2SELECT count(*) 3 FROM {$wpdb->posts} 4 INNER JOIN `wp_postmeta` pm ON {$wpdb->posts}.id = pm.post_id 5 WHERE {$wpdb->posts}.post_status = 'publish' 6 AND {$wpdb->posts}.post_type = 'post' 7 AND pm.meta_key = '_keyname' 8")
  • $wpdb->posts はおそらく対応するテーブル名だが、他の個所では直で入力されている。汎用的ではないので同じテーブルなのであれば同じように導入すること
  • テーブル名やカラム名を囲うのは'(シングルクォート)ではなく`(バッククォート)
  • また、表の別名をつけたいのであればクォートで囲ってはいけない。

別途気になったところ。
inner joinであるなら・・というわけではないですが、下記のようにinner join の条件に入れていしまっても良いと思う。

php

1(" 2SELECT count(*) 3 FROM {$wpdb->posts} 4 INNER JOIN `wp_postmeta` pm ON {$wpdb->posts}.id = pm.post_id AND pm.meta_key = '_keyname' 5 WHERE {$wpdb->posts}.post_status = 'publish' 6 AND {$wpdb->posts}.post_type = 'post' 7")

また、wp_postmetaと直ではなく「$wpdb->postmeta」みたいに変数でテーブル名とってこれませんか?
WordPressなどでCMSであればなるべくそのCMSで提供している機能・定数などを利用して、直に書かないほうがトラブルが少ないと思います。

投稿2018/10/02 12:23

m.ts10806

総合スコア80765

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

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

pineappleman

2018/10/30 03:11

ご返信が遅くなり、大変失礼致しました。 実は回答いただいた内容がすぐに理解できなくて 単語レベルから勉強しておりました。 今回の原因はテーブル名と変数がそもそも違っていたこともあって 自分なりに難解でお手上げ状態でしたが 結果的に、なんとか希望の実装が叶いました。 ご回答いただいたソースがとても参考になりました。 本当にありがとうございました!
m.ts10806

2018/10/30 03:16

解決できたようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問