【WordPress】データベースの情報を固定ページに表示するには【PHP】

WordPressを使っています。WordPressが持っているデータベースの情報を、自分のブログに活用したいのですが、どうしたらよいのでしょう?

今回はこちらのサイトを参考にしました。

【WordPress初心者卒業!】欲しい情報をデータベースから取得する方法

https://blog.codecamp.jp/wordpress-acquisition-data

デバッグ用のテンプレートを用意する

まずはデバッグ用の固定ページ用のテンプレートを用意します。

私はLionBlogをテーマにしているので、下記のパスにpage-test.phpを作りました。

page-test.php

page-test.phpはsingle.phpをコピーして作りました。

テキストエディタで開いて、先頭部分にテンプレート名を追加しました。

テンプレート名を挿入

文字コードはUTF-8でアップロードします。

デバッグ用の固定ページを作成

固定ページで新規追加を押します。

テンプレート

テンプレートのドロップダウンリストに先ほど作成したテンプレートが表示されたら、成功です。

タイトルと本文を適当に入れて、公開を押します。

タイトルと本文を適当に入れる

↑タイトルには「固定ページテスト」と入れました。本文には、「このページは固定ページの新規追加をテストするページです」と入れました。

その後、公開ボタンを押します。

公開したところ

無事固定ページが表示されたら成功です。

あとはこのページをデバッグ用に使っていきます(正確には、このページのテンプレートファイルをデバッグしていきます)。

簡単なSELECT文が動くかどうか実験

まずは、お手本にしたサイトのSELECT文が動くかどうか、実験してみます。

お手本にしたサイトのSELECT文は、下記のとおりです。

SELECT COUNT(*) FROM $wpdb->posts WHERE post_type='asp-products' AND post_status='publish'

$wpdbというのが、PHPの世界からWordPressのデータベースの世界にアクセスするための魔法の言葉のようですね。

データベースでのテーブル名がwp_postsというテーブルにアクセスするのには、$wpdb->postsとすればよいことが分かります。

また、カラム名はそのまま使えそうです。

お手本ではpost_typeというカラムにasp-productsという値が入っていたら抽出するようになっていますが、もちろん私のデータベースにはそんな値は入っていないので、次のように変えます。

テーブル名:posts→postmeta

カラム名:post_type→meta_key

値:asp-products→post_views_count

変更後のSELECT文はこちらです。

SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_key='post_views_count'

PHPも変更しようと思います。

お手本にしたPHPはこちら↓

<?php
    global $wpdb;
    $item_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type='asp-products' AND post_status='publish'" );
    echo "<p>商品数: {$item_count}</p>";
?>

私が変更したPHPはこちら↓

<?php
    global $wpdb;
    $item_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_key='post_views_count'" );
    echo "<p>件数: {$item_count}</p>";
?>

echoで吐き出す商品名を件数に変えただけです(もちろんSQL文も変えています)。

問題はこのPHPをpage-test.phpのどこに埋め込むかですが、お手本では<main>~</main>のどこでもよいとありましたが、私は一応ヘッダが終わって本文に入るところを探して、本文の直後に入れました。

the_content()というのが本文を表示するPHPらしいので、それを目印にしました。

page-test.phpに追加したところ

上書きして保存し、サーバにアップロード(文字コードはUTF-8)し、デバッグ用の固定ページを表示してみると、こんな感じでした。

無事件数が表示されている

これで無事PHPからデータベースにアクセスできることが確認できたので、あとはこれをもとに、本来やりたかったよく読まれている記事TOP10を抽出して表示するよう、PHPをカスタマイズしていきます。

この辺の試行錯誤まで細かく紹介していても退屈になると思うので、結論だけ載せようと思います。

出来上がったもの

試行錯誤の結果できあがったPHPはこちらです↓

	<?php
	global $wpdb;
	$postids = $wpdb->get_col( "
				SELECT a.post_id
				FROM (SELECT post_id,CONVERT(meta_value,int) As cnt
				FROM $wpdb->postmeta
				WHERE meta_key = 'post_views_count'
				ORDER BY cnt DESC LIMIT 0, 10) a, $wpdb->posts b
				WHERE b.ID = a.post_id
				" );
	?>
	<ul>
	<?php
	if ( $postids ) {
		foreach ( $postids as $id )
		{
			$post = get_post( $id );
			setup_postdata( $post );
			?>
			<li>
				<a href="<?php the_permalink() ?>" >
					<?php the_title(); ?>
				</a>
			</li>
			<?php
		} 
	}
	else
	{
		?>
		<h2>Not Found</h2>
		<?php
	}
	?>
	</ul>

↑これをpage-test.phpの適切なところに追加します。

page-test.phpをアップロードして固定ページを表示してみるとこんな感じになりました。

出来上がったもの

お手本にしたサイトでも紹介されていましたが、公式ドキュメントを参考にしました。

公式ドキュメントは最初英語で表示されますが、日本語を選べば日本語表示になります。

公式ドキュメントにあった、$wpdb->get_colの事例を参考にしています。

私はデータベースのwp_postsからURLとTitleを個別にとってこないといけないと思っていたのですが、事例を見ていくと、どうもIDさえゲットすれば、あらかじめPHPで(より正確にはwpdbのクラスで)フルのURLを記述してくれたり(the_permalink()) 、タイトルを記述してくれたり(the_title())するようです。

the_XXXX()というのは基本的にループの中で使うものであり、出力も同時にしてくれるもののようです。

実はPHPはミリしらだったんですが、Javaに似ているので割とすんなりのみこめました。

ウィジェットに表示するには

あとはこれをどうやってウィジェットに追加するか?ですね。

実は人気記事TOP10をウィジェットに追加するプラグインはいくつかあって、私も一応導入してみました(WordPress Popular Posts)。

でもこれは導入したところからカウントアップするのですね・・・・orz

すでに200件以上閲覧されたはずの記事が、WordPress Popular Postsでは9件とか、少ない数字になっていて、なんで?と調べたら、導入前の期間はカウントしない仕様のようでした。

・・・で、ここまで調べたところで、私が使っているテーマ「LION BLOG]には、そもそも[LION]人気記事というウィジェットアイテムが用意されていることを知りましたorz

(›´÷`‹ )げっそり

証拠はこのfunctions.phpです↓

functions.phpの中のウィジェットアイテムの記述部分

上図の中に'[LION]人気記事’という記述が見えると思います。

これを見て気が付きました。

ウィジェットをいろいろいじっていたら、[LION]人気記事というのを見かけましたので。

ウィジェットに追加できるアイテムの一覧。この中に、[LIONBLOG]人気記事がある

という訳で、結局データベースから参照するPHPを手作業で記述しなくても、最初から用意されていたというオチでした。

データベースの情報をPHPで取得するテクニック自体は、なにかの参考になると思うのでこの記事はこのまま残しておきます。

ここまでお読みくださりありがとうございました。