ページを選択

ストブロ

Coffee's Blog.

静的ページに外部のWordPressから記事を読み込む方法 解説

執筆者 | 2017年10月24日 | さくらのレンタルサーバー, ストブロ

php7.1に対応し、mysqli(手続き型)の記述スタイルで
複数のWordpressから記事一覧を取得する為のphpです。

早速部分毎に解説していきます。

1)データベースへの接続
まずPHPの中でデータベースに接続する方法ですが、以下の部分です。
ホスト名などを予め引数に代入しておきます。
$dbhost = 'ホスト名(例:mysql000.db.sakura.ne.jp)';
$dbuser = 'ユーザー名(例:gonbe)';
$dbpass = 'パスワード(例:password)';
$dbname = 'データベース名(例:inst-db)';

今回の重要なポイントでもあるmysqli 手続き型による接続には「mysqli_connect」を使用します。
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

そして文字化け防止の文字コード設定
mysqli_set_charset($conn, "utf8");

最後に念のため接続エラー処理を設定しておきます。
if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}

2)記事の基本情報を取り出す。

どのデータテーブルから何の項目の情報をとるかを指定します。
ここでは「ID」、「投稿日」、「タイトル」、「guid」、「内容」を呼び出しています。
接頭辞の所はWordpressのインストールの際に設定した接頭辞を入れて下さい。(例:WP_)
whereを使い「状態が公開」で「種別が投稿」に限定し、
limitを使い「最新5件」に限定しています。
$sql = '
SELECT ID, post_date, post_title, guid, post_content
FROM 接頭辞posts
WHERE post_status = "publish"
AND post_type = "post"
ORDER BY post_date DESC
LIMIT 5';

先程の命令文を「mysqli_query」に突っ込んで、データベースから情報を得ます。
$result = mysqli_query($conn, $sql);
?>

いったんここで出力するhtmlを。今回はULで全体をくくります。
<ul class="wp-post">

3)取り出したデータを処理する。

取り出したデータを「while」と「mysqli_fetch_assoc」で順番取り出していきます。
<?php while ($item = mysqli_fetch_assoc($result)){

後でHTMLに流し込む為に必要な情報を引数に代入します。
pidは後でカテゴリを取り出す際に使用。
dataは一度取り出してから、時間などを非表示にする為、「substr」で範囲を切り出します。
/* 基本情報(タイトル、URL、コンテンツ) */
$pid = $item["ID"];
$title = $item["post_title"];
$link = $item["guid"];
$content = $item["post_content"];
$date = $item["post_date"];
$datefix = substr( $date, 0, 10 );

4)各記事毎の「カテゴリ」を取得する。
記事1件1件を処理する中で、カテゴリの取り出しをしていきます。
カテゴリに関わるテーブルが3つあるのでとても複雑に見えます。
term_relationships
term_taxonomy
term_id

因みにこの命令文は「3つのテーブルを1つに合わせてobject_idが投稿のidと同じ、そしてタクソノミーがカテゴリであるデータのnameを抽出しなさい」という命令です。

/* カテゴリー情報も取得したい場合 */
$sql_cate = '
SELECT name
FROM 接頭辞term_relationships
INNER JOIN 接頭辞term_taxonomy ON 接頭辞term_relationships.term_taxonomy_id = 接頭辞term_taxonomy.term_taxonomy_id
INNER JOIN 接頭辞terms ON 接頭辞term_taxonomy.term_id = 接頭辞terms.term_id
WHERE 接頭辞term_relationships.object_id = '. $pid . '
AND 接頭辞term_taxonomy.taxonomy = "category"
';

命令文を「mysqli_query」に突っ込んでデータを抽出。
$cate_res = mysqli_query($conn, $sql_cate);

カテゴリデータが複数ある場合を想定して、1)連想配列に格納し、2)1行のデータとして取り出す。
$cate_gories = array();
while ($cate_row = mysqli_fetch_assoc($cate_res)){
$cate_gories[] = $cate_row["name"];
};

連想配列に入ったデータを「implode」を使って、「,」で区切りながら1行にします。
$cate_gories = implode(",", $cate_gories);
?>

5)記事毎に出力するHTMLを整形

先ほど抽出したデータを引数に保管してありましたので、お好きなようにHTMLを書いてください。
今回は全体をULにしてあるのでLIで書いていきます。
<!– HTMLにてPHP変数を表示 –>
<li>
<a class="clearFix" href="<?php echo $link;?>">
<?php echo $title; ?>
<span> – <?php echo $datefix;?></span>
<span> <?php echo $cate_gories;?></span>
</a>
</li>

ここで記事事の「while」を閉じますので、後は抽出された記事の件数によりループします。
<?php
};
?>
</ul>
<?php

最後に念のためデータベースから切断して終了です。
/* PHPでデータベースから切断 */
mysqli_close($conn);
?>

この内容で例えば「getfromwp.php」みたいなファイルを作ります。

そして読み出したい側の、例えば「index.php」内で呼び出します。
因みに、私は「wwwフォルダの一つ上」にgetfromwp.phpを置いています(安全の為)その場合、以下の通りです。
<?php include_once( dirname( __FILE__ ) . '/../getfromwp.php' ); ?>
として呼び出すと、その場にULで囲まれたhtmlが出力されます。

あとはgetfromwp2.php getfromwp3.phpと増やしていけば、いくつでも別々の条件や別々のWPからデータを抽出できます。

良かったら参考にしてみてください。
使用は自己責任でお願いします。
安全対策には十分にご注意ください。

ご質問があればわかる範囲でお答えします!

久しぶりに出勤

おはようございます。 皆様ご機嫌如何ですか? 桂 コヒ蔵です。 被災地のみなさんには心よりお見舞い申し上げます。 一日でも早く暖かく安心できる春が来る事をお祈りしております。 震災後、会社が休業となりその後初出勤です。...

震災後初めて迎える月曜日。

おはようございます。 今日は震災後初めて迎える月曜日です。 各方面、かなりの混乱が発生する可能性があります。 みなさん、どうかいつも以上に気をつけて行動してください。 被災地のみなさん、安否確認や連絡がとれないみなさん。...

こそっ

|`・ω・´)? | ) ミ  さっ

あ、間に合ったw

昨日からの雪で交通状態は最悪。 ってことで、会社に来る時間もぎりぎりになりました。...

iPhone4用スタンド&Dockケーブル

いまさらですが、 昨日iPhone4用のスタンドとDockケーブルを購入しました。 ポイントなのは「バンパー」との併用です! バンパーが大好きって訳ではないのですが、私にとっては現状最も使いやすいケースなのです。 ただ、問題なのがスリムコネクター。...

ひき始めの攻防

日曜日の朝からなんとなく喉が痛いと思っていたのですが、 どうやら風邪のひき始めの様子。 ここで風邪をひいてはなるまいと、早めの葛根湯攻撃! 「風邪VS私」 で激しい攻防戦が続いております(`・ω・´) 2年に一度位3月に大きな風邪を引きまして、...

一年前は?:電器屋新CM

一年前は何をしていたか? とブログを振り返ると、2010年の3月は既にほぼ毎日更新をスタートしていました。 2010年3月7日は日曜日、なので本来ストブロはお休みでしたが、 この日は書き込みがありましたね。...

たった一言でも・・・

たった一言でも、 ストブロを更新し続ける為に、 自分のペースを守る為に、 自分のルールを守る為に、 たった一言でも、 ブログへ投稿するべきなのだろうか? 「おはよ」だけでも、 かきこむべきなのだろうか? それは読んでくれている人を裏切る行為なのか?...

冬が戻ってきました(>_

今朝は冷え込みましたね! こちらでは、また雪が降っちゃいました。 もう三月だけど、春は遠いなぁって感じです。 出勤に時間が掛かってしまった為・・・ 本日はこれにて!ww...

ミニチュアの日

3月2日は「ミニチュア」の日なんだそうです。 3(み) 2(に) の語呂合わせでしょうね。 ・・・ん? だとすると、ミニが付くものなら何でも来いかな? ミニスカートの日 ミニ肉まんの日 ミニミニピザの日 ミニダンボーの日 ミニーマウスの日 ミニ四駆の日...

終わっちゃいますよ!

2月が終わっちゃいますよ!? あっという間に! え、今日28日? 2月最終日じゃないですかΣ( ̄。 ̄ノ)ノ 早かったですねぇ。 もう、今日は2月の余韻に浸って一杯飲みたいと思いますw...

久しぶりの雨

みなさん、雨はお好きですか? 私はINST内では無双の雨好きなのですが、「雨が好き!」っていうと だいたい理解してくれませんw 今朝は私の町では久しぶりのまとまった雨が降っています。 今日は午後まで降り続く予報です。...

0コメント


電器屋Walkerの過去配信のBGMで利用させて頂いております。

ポッドキャスト品質向上、整音テクニック 解説Live

開催のお知らせ

詳細はこちら

国際ポッドキャストの日

International Podcast Day Event

ツキイチ - 隣のポッドキャスト

まとめファンサイト