<?php if (have_posts()) :
while (have_posts()) :
the_post();
<article>
<h2>single_post_title();</h2>
endwhile; // 繰り返し処理終了
else : ?>
こう記述されています。while()文は投稿した全ての記事分、繰り返し処理を行いますので、何万PVもあるサイトは何万回も繰り返し処理をしているハメになり、記事が多ければ多いほどガチガチに重くなります。よってWEBページごとにこういった動的プログラミングが記載されたサイトはカチ重です。PHPだけならまだしも、その繰り返しの中にある関数はデータベースにアクセスして取得しています。
それだけならまだしも、まだまだ重い理由は続きます。そもそもWEBサイトというのは.htmlで作られたテキストファイルをサーバのフォルダにポツンと置くだけで、表示されます。
このindex.htmlというファイル一つにアクセスすればそのままindex.htmlが表示されます、これが理想の形ですが、WordPressの場合はこうなっています。
このindex.php
にアクセスすればワードプレスで作成されたウェブサイトが表示されますが、その裏では色々なファイルにアクセスしています。
index.phpを覗くと、
ではその、wp-blog-header.phpを覗くと今度は
require_once( dirname(__FILE__) . "/wp-load.php" );
require_once( ABSPATH . WPINC . "/template-loader.php" );
とまた別のPHPファイルを呼び出しています。
wp-load.php
はエラーなどの対策処理で、template-loader.php
は各テンプレートファイルにアクセスさせるための分岐処理を行っています。
と、このように何十個ものPHPファイルにアクセスしてようやく辿り着くのが、デザイン変更できるthemes/style/index.phpです。たった1回サイトにアクセスしただけで、この一連の流れを全て行いますので、ワードプレスは重いんです。
形式にもよりますが、ブログシステムは簡単なものでトップページに10~30個ほどの新着記事を降順で表示すればいいだけです。データベースには記事タイトル,記事URL,記事本文,カテゴリ,投稿日時などと列に一つの各行でまとめられているので、それを投稿日時順に取得すれば良いだけです。問題はセキュリティ対策の難しい管理画面です。なのでワードプレスの管理画面はそのまま流用して、html生成だけMySQLからPDOで独自に取得します。
$st = $pdo->prepare("
SELECT * FROM wp_posts
WHERE post_type='post'
AND post_status='publish'
ORDER BY post_date DESC
");
これで$st
にはワードプレスの投稿記事全てが配列で入っています。これをHTML形式に修飾します。
$html = '';
foreach($st as $key=>$val) {
$html[] = "<article>"
<h2>{$val['post_title']}</h2>
"</article>"
}
これで$html[]
には配列ごとに<article>タグが全記事分ぶち込まれました。当然このままではトップページが長くなってしまうので、表示する記事数分に分割します。この際とっても便利なPHP関数array_chunk
を使用します。
$html_page = array_chunk($html, 30);
array_chunk
の引数1番目に配列、2番めに何個に分割するかの数値を入れます。仮に$html配列に300個分のHTMLタグがある場合、それを30個に分割するので$html_pageには$html_page[9][29]となっています。よって
// ページ分だけ繰り返す
foreach($html_page as $page=>$htmls) {
// 予め用意したテンプレートファイルを文字列で読み込む
$temp = file_get_contents('template.html');
// テンプレートファイルの記事ループ箇所に<$ARTICLE$>と入れておく
// よってその独自タグにimplode(配列を全て文字列に結合)したタグをぶち込む
$temp = str_replace('<$ARTICLE$>', implode('', $htmls), $temp);
// 現時点で$tempには1ページ分のHTMLタグが入っており、
// それを文字列でファイルに書き込む
file_put_contents("page-{$page}.html", $temp);
}
これでpage-0.html
からpage-29.html
までのHTMLが生成されました。記事を更新するごとに、上記で作ったPHPファイルを実行するだけで一気にすべて作成されます。こうしておくことで、いちいちデータベースにアクセスしなくても、静的ファイルを読み込み快適なWEBサーフィンができるようになります。
当然上記のようなトップページをページ別に分けるだけでなく、それをカテゴリやタグ、月別などもたくさん作っていかなければなりません。
日付 | 2016-04-16T13:57:00 |
分類 | WEBマスター |
画像 | 5枚 |
訪問数 |