言語(PHP他)PHPWordPress
更新日 : 2022年5月13日
投稿日 : 2017年3月10日

一括取得で明快に!WordPressカスタムフィールドの値が複数あるときの対処法

一括取得で明快に!WordPressカスタムフィールドの値が複数あるときの対処法の画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして8年~の経験があります。

WordPressのプラグインでカスタム投稿、カスタムフィールド機能を使っている人は多いと思います。

私はよく「 SmartCustomFields 」を使っています。

登録された値を取得するときに、「何回もDBにアクセスして、表示速度に影響が出ている」ケースを見てきました。

そもそもプログラムを実行するにあたり、不要なアクセスや処理はしたくないもの。

複数発生する場合は、上手にまとめて一回で取得してしまいましょう!

カスタムフィールドの表示方法(SCFの場合)

カスタムフィールドのデータを取得するときによく書かれているやり方はこちらです。

$customData = SCF::get('test-custom');
echo $customData;

SCF::get(’test-custom’)でデータベースにアクセスし、指定の値を取得してきます。

でもこれがいくつもある場合だったらどうなりますか?

使った分だけデータベースへのアクセス回数が増えて、表示速度に影響が出ることがあります。サーバーのリソースも多く使ってしまうことになります。

そんなにたくさんないならひとつひとつ書けばいいですよ。

ページの表示があまりにも重いと見ている側もストレスで、見てくれないかもしれませんし、機会損失につながってしまうかも。

解決策

$customData = get_post_meta($post->ID);
foreach($customData as $data) {
	// データを取り出す処理
}

やっていることは単純です。

postmetaに入っている記事IDの情報を取得して、そこからforeachで取り出しているだけです。

これだとデータベースにアクセスするのはこの一回だけで済みます。取得したあとは、こっちで自由にごにょごにょすればいいのです。

業務でやった某サイトではこうすることでページ表示のパフォーマンスは上がったし、ついでにソースの可読性も上がったっていう実績があります(それだけカスタムフィールドの項目数が多かったと言うことでもありますが)。

データは一度に取ってきてからごにょごにょしましょう。その方が分かりやすいと思います。好みもあるかな?

因みにこの方法でとってくるとデータは連想配列で返ってきます。

繰り返し項目の場合も配列からデータを取り出す、うまいことしたら割と簡単にできます。

リッチテキストエディタ仕様、「WYSWING」に注意

WordPressのSmart Custom Fieldsを使って投稿場所を増やし、その投稿の項目をWYSWIGにすると、通常の投稿エリアのような多機能エディタが使えるようになります。

ですが、これを使っているものがあった場合、前述の方法でやるとテーブルと本文の間に無駄な改行がたくさん入ってしまいます。

崩れる原因は「<table>を使っているか」

<table>タグがあると、WordPressの自動整形機能で崩れてしまいます。

WYSWIGのビジュアルモードで編集しているときにテーブルタグを入れると、仕様で<p>&nbsp;</p>が入ってしまうようで、見た目改行たくさんになってしまうんです。

ぐぐるとたくさんそれのお悩みが出てきます…!

改行がたくさん発生した場合の対処法

WYSWIGの項目だけは別途取得する必要があります。

$data = SCF::get(カスタムフィールド名);

これで取得した情報はWordpressの自動整形機能に阻まれることはなくなります(今のところ問題は出ていません)。

まとめ

  • カスタムフィールドを使って複数の項目を1ページで出したいとき、データベースに一度だけアクセスして取得してくるとパフォーマンスがよくなる
  • 但しWYSWIGを使っているカスタムフィールドは<table>タグとWordPress自動成型機能で表示が崩れる場合があるので注意

WordPressは手軽に扱えるCMSとして、とても優秀だと思います。

カスタマイズしてより使いやすくする仕組みを作るときは、ただ表示できればいいというだけでなく、表示速度やサーバーリソースのことも考えて作れるようになるとより良いですね!

PR

※本サイトはアフィリエイトプログラムを利用して商品を紹介しています。