PHP
WordPress
ネタ

【ネタ】超手抜きで作る:WordPressの任意の場所へ任意のURLの中身を取り込んで表示

【ネタ】超手抜きで作る:WordPressの任意の場所へ任意のURLの中身を取り込んで表示

WordPressでWebサイトを構築すると、「ページ内の任意の場所に別のURLの内容を表示させたい」という事があるのではないかと思います(実際はよく知らない)。そういうプラグインがありそうな気がしますが、それを探すのは面倒だったので…

  • 標準関数だけを使う
  • 超短時間で作る
  • とにかく手間をかけない

…という条件で実装してみます。目標は10分以内。半分ネタ。


WordPressの仕様を少しだけ調べてみる

事前に以下の事は調べておいた。

  • 「ショートコード」というものを使えば良さそう。
  • 「ショートコード」の定義は function.php に書くらしい。
  • function.php に定義するのはかなりイケてないと思うので、プラグインで何か良いのが無いか探してみた。
  • Code Snippets」というものを見つけた。さすがWordPress何でもあるよね。

コード

function myFetchUrl($pAry)
{
    //-- 取得するURL
    $url = $pAry['url'];
    if (stripos($url, 'http://') !== 0 && stripos($url, 'https://') !== 0) { return $url; }

    //-- キャッシュの有効時間
    $lifetime = (empty($pAry['lifetime'])) ? 0 : (int) $pAry['lifetime'];

    //-- キャッシュの保存ディレクトリ(どこに保存するのが適切なのかは知らない)
    $md5Url = md5($url);
    $cacheDir = "./_cache/fetch_url/{$md5Url[0]}/{$md5Url[1]}/{$md5Url[2]}";
    if ($lifetime && !is_dir($cacheDir)) { mkdir($cacheDir, 0777, true); }

    //-- キャッシュのパス
    $cachePath = "{$cacheDir}/{$md5Url}.cache";

    //-- キャッシュが有効ならそちらを読む / 無効なら取得
    if (!is_file($cachePath) || ($lifetime && $_SERVER['REQUEST_TIME'] - filemtime($cachePath) > $lifetime)) {
        $data = file_get_contents($url);
        file_put_contents($cachePath, $data, LOCK_EX);
    } else {
        $data = file_get_contents($cachePath);
    }

    return $data;
}

//-- ショートコードとして登録
add_shortcode('fetch_url', 'myFetchUrl');

使い方

<!-- 常にリアルタイムで取得する -->
[fetch_url url="https://qiita.com/fallout"]

<!-- 24時間キャッシュを有効にする -->
[fetch_url url="https://qiita.com/fallout" lifetime="86400"]

Q&A

  • Q.◯◯というプラグインがあるよ
    • A.WordPressって便利ですね。

  • Q.<iframe src="url">とかで良いのでは?
    • A.それで良いならそうなんでしょう。

  • Q.これの使い道って他所のコンテンツをパクるのが目的?
    • A.それが目的なら、もっと賢いやり方があるでしょうね。

  • Q.キャッシュファイルのパスをハードコーディングしちゃダメでしょ。
    • A.そうですね。WordPressの仕様的にどこに保存するのが相応しいのかは知らないです。

  • Q.file_get_contents()でURLを取得するのは止めた方が良いよ?タイムアウト処理すらできてない。
    • A.WordPressにはHTTP APIというのがあるらしいので、そちらを使った方が良いですよ。HTTPの応答ヘッダも理解して無駄なリクエストが発生しないようにするべきですね。頑張ってください。

  • Q.キャッシュファイルがどんどん溜まるよね?
    • A.適当にtmpwatchとかで消せば良いんじゃないでしょうか。

  • Q.md5()はもう使わない方が良いのでは?
    • A.この用途なら別に良いでしょ。たった3文字の関数名って…素敵やん。

  • Q.10分で実装できた?
    • A.これを「実装した」と呼べるのなら、コードにコメントを付けてQiitaの記事にするのにかけた時間は、コードを書く時間の10倍以上。

  • Q.これだからPHPerは…
    • A.言語やそれを使う人へダメ出しをしたら君の価値が上がるの?もっと他にやるべき事があるんじゃないかな。(ミサワ風)

  • Q.ひょっとしてWordPressを舐めてる?
    • A.滅相もない。PHPといえばWordPressが有名なので無理やりネタを捻り出しただけです。

  • Q.Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」だよ?
    • A.いつもお世話になってます。

  • Q.反省してる?
    • A.見ての通りです。

結論

Qiita向けの記事を真面目に書くのは大変。