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

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

ただいまの
回答率

90.00%

【wordpress】別のDBからSQL文を使って新着情報を表示したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 7,770

financyy

score 16

同列階層に2つWordpressをインストールしており、1つのWordpressをルートで表示しています。
DBは別々です。
-wp ←ルートに表示
-blog

上記の「wp」で表示しているトップページの中に、「blog」の新着記事(投稿)を表示したいです。
いろいろと調べて「wp」のfunction.php内に下記を追記しました。

/*DB設定を行います。*/
$another_db_name = 'dbname';
$another_db_user = 'dbuser';
$another_db_pass = 'dbpass';
$another_db_host = 'another_host';
$another_tb_prefix = 'wp_hoge_';

$anoteher_wpdb = new wpdb($another_db_user, $another_db_pass, $another_db_name, $another_db_host);

//プレフィックスの設定(忘れがち)
$anoteher_wpdb->set_prefix($another_tb_prefix);


参考にしたURL:http://qiita.com/rojiuratech/items/87d5f7dd1a59bc791308

取得したい情報は、「blog」内の投稿最新記事6記事なのですが、取得するSQL文が良くわからず困っています。。
【取得したい情報】
・ページタイトル
・投稿日時
・カテゴリ
・アイキャッチ画像

<dl>
<?php
$results = $anoteher_wpdb->get_results("
    SELECT post_title, guid, ID, post_date
    FROM $anoteher_wpdb->posts
    WHERE post_type = 'post'
    AND post_status = 'publish'
    ORDER BY post_date DESC     
    LIMIT 6          
");
foreach ($results as $value) {
  $date = str_replace('-', '.', mb_substr($value->post_date, 0, 10));
  print('<dt><span class="date">'.$date.'</span></dt><dd><a href="'.$value->guid.'">'.$value->post_title.'</a></dd>');
}
?>
</dl>


上記で、投稿日時とページタイトル・ページURLまで取得出来ました。
アイキャッチ画像とカテゴリの取得方法が分かりません。

よろしくお願いいたします。

回答をいただいたので試した方法を追記します。

<?php
//一覧情報取得
$result = $anoteher_wpdb->get_results("
    SELECT post_title, id, guid, post_date
    FROM $anoteher_wpdb->posts
    WHERE post_type = 'post'
    AND post_status = 'publish'     /* かつ公開済の記事 */
    ORDER BY post_date DESC         /* 新しい順に並び替え */
    LIMIT 6    
");

$the_post_id = 0;// カテゴリとアイキャッチを取得したい投稿のID

$sql_for_categories = "SELECT t.term_id, t.name, t.slug
    FROM {$anoteher_wpdb->term_relationships} AS tr
    INNER JOIN {$anoteher_wpdb->terms} AS t ON t.term_id = tr.term_taxonomy_id
    WHERE tr.object_id = {$the_post_id}";

$categories = $anoteher_wpdb->get_results($sql_for_categories, ARRAY_A);

$sql_for_eyecatch = "SELECT meta_value
    FROM {$anoteher_wpdb->postmeta}
    WHERE post_id = (SELECT meta_value FROM {$anoteher_wpdb->postmeta} WHERE post_id = {$the_post_id} AND meta_key = '_thumbnail_id') AND meta_key = '_wp_attached_file'";

$eyecatch = $anoteher_wpdb->get_var($sql_for_eyecatch);

//表示
foreach ($results as $value) {
  $date = str_replace('-', '.', mb_substr($value->post_date, 0, 10));
  print('<dt><span class="date">'.$date.'</span><span class="cate">'.$categories.'</span></dt><dd><a href="'.$value->guid.'"><img src="'.$value->eyecatch[0].'" />'.$value->post_title.'</a></dd>');
}
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

このように取得することができると思います(テストしていませんが、考え方とコードの参考として)。

$the_post_id = 0;// カテゴリとアイキャッチを取得したい投稿のID

$sql_for_categories = "SELECT t.term_id, t.name, t.slug
    FROM {$anoteher_wpdb->term_relationships} AS tr
    INNER JOIN {$anoteher_wpdb->terms} AS t ON t.term_id = tr.term_taxonomy_id
    WHERE tr.object_id = {$the_post_id}";

$categories = $anoteher_wpdb->get_results($sql_for_categories, ARRAY_A);

$sql_for_eyecatch = "SELECT meta_value
    FROM {$anoteher_wpdb->postmeta}
    WHERE post_id = (SELECT meta_value FROM {$anoteher_wpdb->postmeta} WHERE post_id = {$the_post_id} AND meta_key = '_thumbnail_id') AND meta_key = '_wp_attached_file'";

$eyecatch = $anoteher_wpdb->get_var($sql_for_eyecatch);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/10 12:07

    早速回答いただけて感激です!
    SQLの基本も理解できていないまま質問させていただいているのが問題なのですが、
    回答いただいた記述を追記してみました。

    <?php
    //一覧情報取得
    $result = $anoteher_wpdb->get_results("
    SELECT post_title, id, guid, post_date
    FROM $anoteher_wpdb->posts
    WHERE post_type = 'post'
    AND post_status = 'publish' /* かつ公開済の記事 */
    ORDER BY post_date DESC /* 新しい順に並び替え */
    LIMIT 6
    ");

    $the_post_id = 0;// カテゴリとアイキャッチを取得したい投稿のID

    $sql_for_categories = "SELECT t.term_id, t.name, t.slug
    FROM {$anoteher_wpdb->term_relationships} AS tr
    INNER JOIN {$anoteher_wpdb->terms} AS t ON t.term_id = tr.term_taxonomy_id
    WHERE tr.object_id = {$the_post_id}";

    $categories = $anoteher_wpdb->get_results($sql_for_categories, ARRAY_A);

    $sql_for_eyecatch = "SELECT meta_value
    FROM {$anoteher_wpdb->postmeta}
    WHERE post_id = (SELECT meta_value FROM {$anoteher_wpdb->postmeta} WHERE post_id = {$the_post_id} AND meta_key = '_thumbnail_id') AND meta_key = '_wp_attached_file'";

    $eyecatch = $anoteher_wpdb->get_var($sql_for_eyecatch);

    //表示
    foreach ($results as $value) {
    $date = str_replace('-', '.', mb_substr($value->post_date, 0, 10));
    print('<dt><span class="date">'.$date.'</span><span class="cate">'.$categories.'</span></dt><dd><a href="'.$value->guid.'"><img src="'.$value->eyecatch[0].'" />'.$value->post_title.'</a></dd>');
    }
    ?>

    カテゴリがすべてArray、アイキャッチが表示されませんでした…
    恐らく書き方が違うと思うので調べてみますが、もし間違っている箇所がわかりましたら教えていただけると大変ありがたいです。

    キャンセル

  • 2016/01/10 12:34

    カテゴリとアイキャッチの取得は、foreachブロックの中で行ってください。
    さらに、$the_post_idには取得した6件のIDを代入するようにしてください。
    つまり「$the_post_id = $value->ID;」とします。

    $categoriesにはカテゴリーの情報が出力の通りArrayとして格納されています(未テスト)。
    表示したいのはカテゴリー名ですか?
    カテゴリー名であれば、「$categories[0]["name"]」で取得できると思います。

    $eyecatchにはアイキャッチ画像のファイル名が格納されています(未テスト)。
    アップロードフォルダが「http://example.com/blog/wp-content/uploads/」であれば、画像の出力は「<img src="http://example.com/blog/wp-content/uploads/&#039;.$eyecatch.&#039;" alt="" />」のようになります。

    各変数にどんな値が入っておりどのように出力すべきかは、PHPのvar_dump関数などを利用して考えてみてください。

    キャンセル

  • 2016/01/11 11:54

    通知がなかったため、ご回答いただいていたことに気づくのが遅く失礼いたしました。。
    指摘いただいた内容で試してみたところ、実現したい内容がすべて実現できました!

    こんなに早く、的確にご回答いただけるなんて思っていなかったので
    本当に助かりました。ありがとうございました!!!

    キャンセル

  • 2016/02/04 14:39

    私も同じ問題をもっているのですが、「取得した6件のIDを代入する」というのができないです。

    $the_post_id = $value->ID;

    上記の箇所です。

    キャンセル

-1

誤った回答なので削除しました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/10 11:13 編集

    データベースが異なるため、質問者さんの作成したwpdbを使用して取得しなければなりません。

    キャンセル

  • 2016/01/10 11:27

    そうですね、ご指摘ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる