Lazy load + WordPress + 静的ページの組み合わせ

静的ページでWordPressの情報を取り込む

前提

サーバーがhtmlもphpとして扱ってくれるように設定してあることが必要。
.htaccessファイルに

AddType application/x-httpd-php .html

を書き込むことで機能することが多い。php.iniの編集を必要とする場合もある(XAMPPなどローカルサーバーの場合)

ディレクトリ構造

index.html
-/blog/wordpress
-/other/index.html
といった構成で、
index.htmlでは、<!DOCTYPE html>の前に

<?php require(dirname(__FILE__).'/blog/wp-load.php'); ?>

を、
/other/index.htmlでは、

<?php require(dirname(__FILE__).'/../blog/wp-load.php'); ?>

を書き込む。(後者は検証してない。兄弟フォルダのphpファイルを出力させるときは include(dirname(__FILE__).'/../include/[ファイル名].php'); でうまくいったのので大丈夫だと思うけど…)

静的ページでLazy loadを読み込ませる

<head>内

jQueryを読み込ませる。
jQueryのダウンロードはjQueryから。

<script type="text/javascript" src="../js/jquery.min.js"></script>
<script type="text/javascript" src="../js/migratemute.js"></script>
ページ末端

</body>タグの前に

<script type="text/javascript" src="/js/jquery.lazyload.min.js"></script>
<script>
    $('.lazy').lazyload({
        effect : 'fadeIn',
        effect_speed: 2000
    });
</script>

てな感じでjsファイルを読み込ませる。上記は/js/フォルダ内にlazyload.min.jsファイルを入れている場合の書き方。
Lazy loadは、GitHub - tuupola/lazyload: Vanilla JavaScript plugin for lazyloading imagesからダウンロードする。
ダウンロードしたファイルのうち、使うのはlazyload.min.jsファイルと、imgフォルダ内の置換前のダミー画像。

遅延読み込みを実行する画像の指定

ここが嵌ったポイントで、公式サイトの通りにやってもダメ。解説のほうは全くメンテナンスしてないっぽい。
使い方はこんな感じで

<img src="/img/white.gif" data-original="/img/kv.jpg" width="1020" height="516" class="lazy">

ポイントは、

  • imgのsrcはダミー画像を指定する。
  • data-original= で遅延読み込みする画像のuriを指定する。
  • CSSで幅高さを指定するか、width="" height="" を明記する。
  • class名にlazyを入れる。

以上4点。どれが欠けてもうまくいかない。

WordPressとの組み合わせ

で、ブログの新着記事(ニュースカテゴリ)を静的ページであるトップページにサムネイル付きで、それも遅延読み込みで使いたい、という面倒くさい条件だとこうなる。
なお、以下の例で読み込ませるカテゴリのスラッグはnewsである。

<?php $news = new WP_Query( array(
                                  'category_name' => 'news',
                                  'posts_per_page'=> 6,
                            	)); ?>

<?php if ($news -> have_posts()): ?>
  <?php while ( $news -> have_posts() ) : $news -> the_post(); ?>
    <?php if(has_post_thumbnail()):
        $img_id = get_post_thumbnail_id();
        $img_url = wp_get_attachment_image_src($img_id, 'medium') ?>

     <a href="<?php the_permalink();?>"><img src="/img/white.gif" data-original="<?php echo $img_url[0];?>" class="lazy"></a>

    <?php else: ?>
    <?php endif; ?>

  <?php endwhile; ?>
<?php endif; wp_reset_postdata(); ?>

この記事について

WordPressで構築したサイトであれば、素直にプラグインを使えばよいのだけど、静的サイトにWordPressのデータを持ってきて表示させる、という条件になるとWordPressプラグインがそのまま使えるわけでもなく。
WordPressのヘッダーを読み込ませるなら話は別になるだろうが、それがままならない案件があったので、次に似たようなことが起きた時に参考にするためのメモとしてこの記事を書きました。