【WordPress】なぜ「wp-blog-header.php」を使ったページのコンテンツをfile_get_contentsで取得できないの?
タイトルの通りで「wp-blog-header.php」を使って出力したページのコンテンツをfile_get_contents関数で取得しようとしたのですが、何度試してもできませんでした。
ここではその謎に怒りをぶつけたいと思います(未解決)。
事の顛末
システム外でWordPressの機能を使う方法にあるように、 WordPress外にファイルを作成し、そこに「wp-blog-header.php」を記述すればWordPressの独自関数が使えるようになります。
そこでこの機能を使ってWordPressの外部ファイルにランダム記事を3件表示させる次のようなページを作成しました。
<?php require('./wp-blog-header.php'); ?> //「wp-blog-header.php」を読み込む(WordPress外でもWordPress独自の関数を使えるようにする) <?php query_posts('showposts=3&orderby=rand'); ?> //ランダム記事を3件取得する <?php if(have_posts()):while(have_posts()):the_post(); ?> //記事を取得できればループで処理 <h2><a href="<?php the_permalink();>"><?php the_title();></a></h2> //タイトルリンクの出力 <?php the_content();> //コンテンツ出力 <?php endwhile; endif; ?> //処理終了
そしてこのページをfile_get_contents関数で取得しようとしたのですが、
Warning: file_get_contents(http://ysklog.net/random-post.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/***/www/***/***.php on line 11
というように404エラーが返ってきました。
コンテンツは表示されているのに404エラー
「は?コンテンツは表示されているのに何で404エラーになるの?」と疑問になり、いろいろなことを試しました。
- 外部ファイル(PHPファイル)の文字コードが原因?
→PHPファイル自体の文字コードをBOMなしのUTF-8にしたがダメだった - PHPのプログラムでUTF-8を指定しなきゃいけないのかも
→コードの先頭に「mb_internal_encoding("UTF-8");」を記述したけどダメだった - もしや「allow_url_fopen」がOFFになってるのか?
→phpinfoで調べたら「allow_url_fopen = On」となっていた
同じように困ってる人を発見
まずはあれこれ対処してみたのですが、全然問題をクリアできなかったので、「file_get_contents wp-blog-header.php」で検索したところ、こちらに同じように困ってる人がいました。
英語が苦手なのでなんとか訳して読んだのですが、結局解決せずに流れていました。
そして私は諦めた
他にしなければならないことがあるので今回は諦めたのですが、「wp-blog-header.php」を使ったページのコンテンツってfile_get_contents関数で取得できないのでしょうか?
そんなはずはないと思いますが、もしどなたか原因をご存知でしたら教えてください。
私も時間ができたら解決策をもうちょっと模索してみたいと思います。
あわせて読んでほしい!
コメント
2:管理人:2015/03/30 19:55:28
masaさんコメントありがとうございます。
masaさんのおっしゃるように読み込みファイルを「wp-load.php」に変更したところ404エラーが返されることなくコンテンツの取得が可能になりました。ありがとうございます!
しかしなぜwp-blog-header.phpではうまくいかないんでしょうか?
HTTPレスポンスヘッダで404エラーを返す原因は何か、そもそもレスポンスヘッダを返してすらいないのか?ととても不思議な現象です。
おそらく「wp-blog-header.php」「wp-load.php」のリファレンスを確認すればわかりそうですが、勉強不足です。
何はともあれ解決案を教えてくださりありがとうございました!
1:masa:2015/03/29 20:05:12
wp-loadを使ってみてはどうでしょうか?
wp-blog-header.phpをwp-load.phpに置き換えてrandom-post.phpを作成してみてください。