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

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

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

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

PHP

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

Q&A

解決済

2回答

362閲覧

WordPressのsingle.phpに、特定のカスタムフィールド値を持つ別の記事を呼び出したい。

cattail

総合スコア11

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/07/11 14:50

編集2019/07/11 15:08

WordPressのsingle.phpに、特定のカスタムフィールド値を持つ別の記事を呼び出したいのです。

概要は次の通りです。

  • 「メンバー」というカスタム投稿タイプ中に、各人の情報が記事として保存されています。
  • 各記事には「管理ID」というカスタムフィールドがあります。WPの記事IDとは別です。
  • single.phpの中で、別のメンバーを表す管理IDの配列があります(これは現在表示しているメンバーの情報から生成)。
  • 管理IDの配列のうち冒頭5人だけの記事内容(例えば氏名など)を、現在のページに呼び出したいのです。

下記のコードを作成しました。
これでも、いちおう目当ての表示にはなるのですが、猛烈に遅いのです。
もっとスマートな書き方があるのかもしれませんが、カスタムフィールド値で該当を探し出す、という方法は、これしか見つけられませんでした。

「showposts」を1にしながら一回ごとにquery_postsをやってるあたりが無駄なのかなあ…という気はするのですが、他に方法が思い当たりません。
ちなみに、管理IDは該当者(記事)がない場合もありうるので、管理IDの配列をあらかじめ短くしておくことはできません。【←追記】
無駄のない書き方、高速に動作する書き方があればご教示をお願いしたく、質問申し上げます。

何卒よろしくお願い申し上げます。

PHP

1// 管理IDの配列 2$adminIdArr = array('A-1234','B-5678','A-9101','A-1121','B-3141','A-5161','B-7181','B-9202','A-1222'); 3 4$count = 0; 5foreach ($adminIdArr as $adminId) { 6 $args = array( 7 'post_type' => array('member'), // カスタム投稿タイプの「メンバー」から 8 'showposts' => 1, // ループにつき一人 9 'meta_query' => array( 10 array( 11 'key' => '管理ID', // カスタムフィールドの管理IDの一致する人で 12 'value' => $adminId, // 管理ID配列要素のIDに一致する人の 13 'compare'=>'=' 14 ) 15 ) 16 ); 17 query_posts($args); 18 19 if(have_posts()){ 20 the_post(); 21 echo esc_html(post_custom('氏名')); // 氏名を表示 22 $count++; 23 } 24 if($count > 4){ // 5人表示したらおしまい 25 break; 26 } 27}

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

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

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

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

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

guest

回答2

0

効率良いとは言えませんが、SQLの発行回数を抑えるということであれば、1回のSQLでデータを取ってくる方法もあります。『各1人あたり最新記事を1つ』という条件を踏まえると、サブクエリを使う形になると思います。
コードはテストしていませんので動く保証はありませんが、ロジックを参照して頂ければと思います。

php

1<?php 2$adminIds = ['A-1234','B-5678','A-9101','A-1121','B-3141','A-5161','B-7181','B-9202','A-1222']; 3 4$adminIdsStr = implode(',', array_map(function ($v) { 5 return "'" . $v . "'"; 6}, $adminIds)); 7 8$posts = $wpdb->get_results($wpdb->prepare(" 9 SELECT * FROM ( 10 SELECT p.*, m.meta_value AS admin FROM $wpdb->posts AS p 11 INNER JOIN $wpdb->postmeta AS m ON p.ID = m.post_id AND m.meta_key = '管理ID' 12 WHERE m.meta_value IN (%s) 13 ORDER BY p.post_date DESC 14 ) AS posts 15 GROUP BY admin LIMIT 5 16", $adminIdsStr)); 17 18print_r($posts);

投稿2019/07/12 09:28

dany

総合スコア73

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

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

cattail

2019/07/13 09:37

ご回答ありがとうございます。 $wpdbを使うやり方は経験がなかったので、諸々調べつつ、ご回答を1行ずつ拝読しながら試しております。 まだ動作には至っていないのですが、理解に努めたいと存じます。
guest

0

ベストアンサー

メタクエリーでINが使えるので、それを使ってください。
https://elearn.jp/wpman/column/c20110915_01.html
ただ、メタクエリーって遅いんですよね。なぜ投稿IDをそのまま使わないんですか?

投稿2019/07/11 21:51

yukikp

総合スコア797

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

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

yukikp

2019/07/11 21:58

あ、配列の順番で5人取得するまで でしたか。 後で書き直します。
cattail

2019/07/13 09:34

ご回答ありがとうございます。 お示しのURLのページ内記述を参考にINを使うことで改善できました。 サーバ側でのページの準備時間が1秒ほど伸びてしまっているので、まだまだ要改善ですが、当初のやり方よりは劇的に改善しました。 投稿IDを使いたいのはやまやまなのですが、社内的に人の管理は管理IDで一本化することになっており、WP内でだけは投稿IDを使うとなると変換テーブルが必要になるとか、その変換テーブルの正しさはどうやって担保するんだ(WPで同じ人を一度削除して再投稿する可能性がないわけではない)とかいった、別の課題が出てきてしまうので、極力WP内でも管理IDで通したい、という次第です。 これはこれで本質問とは別途の課題として取り組みたいと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問