put_the_contentsでハマった話

1 min読了の目安(約1200字TECH技術記事

某日、WordPressサイトSEO対策にて、「サイトマップとは別に読み込ませたいテキストファイルがある。」と依頼がきました。

なんでも、記事が数百あり、それをクロールさせたい。
でもsitemap.xmlに出せないから、動的にurl生成しテキストファイルを生成して、それを読み込ませていきたい、とのこと。

// 以下の様なurlが数百とあった
https://example.com/manual/post?id=....

フックさせたのはいいものの。。

さて、どうしようか、と一呼吸おき、考えたのはフックの利用です。

WordPressにはフック機能があり、例えば記事をアップした時、更新した時、といったタイミングで任意の関数を実行できる便利な機能です。

こんな感じで実装してみました。

functions.php
<?php
add_action( 'save_post', 'save_post_urls' );
function save_post_urls($post_ID) {
    $post_type = get_post_type( $post_ID );
    if ($post_type === "manual_page") {
        // foreachやらなんやらしてpost記事を取得
        ...
        // ここに整ったurlたちの文字列が入っている
        $post_urls = ...;
        $file_path = ...;
        file_put_contents($file_path, $post_urls, LOCK_EX);
}

よし、できた!も束の間、見事にできていませんでした。

何がまちがっていた?

そもそもパス、合ってんの?

$file_pathはサーバールートからのフルパスになります。
サイトのドメインからみていませんか?

サーバーパスが不明な場合は以下の構文を試したいファイルに記述してみるといいです。

<?php echo __FILE__; ?>

そうしたら、画面にパス情報が出力されます。

許可、されてる?

これは結構盲点ではないでしょうか。いわゆるパーミッションっていうやつです。
「ファイル書き込み、読み込み、実行をしていーよー」っていう許可です。

file_put_contents関数がfileがあったら上書きしたり、なかったら新しく生成するような関数なんですが、それにもサーバー側の許可が必要です。

この許可がないと、見事に反映されないので要注意です。

結果

しっかり生成、書き足し等できる状態に出来上がりました。

関数は便利ですが、そうしたセキュリティー面であったりも気を配らなければ、とより一層気を引き締める1日でした。