Simplicityの特徴 › フォーラム › 不具合報告 › Ajaxのカウントを取得するためのPHPファイルが404になってしまう(hidekichiさんよかったら教えてください)
-
投稿者投稿
-
-
2015年9月30日 10:17 PM #32989わいひらキーマスター
JavaScriptに詳しいhidekichiさんに質問よろしいでしょうか。
前回のアップデートで「同一ドメインに置いたPHP」で取得したfeedlyのカウント数をAjaxでテキスト取得するようにしました。
けれど僕のサイトでは正常動作しているのですけど以下のサイトではPHPファイルが404になっているようです。
http://nabi1080.com/management/blog/37305ブラウザのコンソールでみてみると、添付画像のような感じでPHPで取得するものが全て404になっています。
けれど、feedlyのカウント数を取得する「同一ドメイン内のPHPファイル」はちゃんと存在していて動作しているようです。
http://nabi1080.com/wp-content/themes/simplicity/lib/fetch-feedly.php?url=http://nabi1080.com/feedサーバーも僕と同じエックスサーバーのようですし、何か「同一ドメイン内のPHPファイル」が404になる原因として考えられるものはありますでしょうか?
Attachments:
-
2015年9月30日 10:23 PM #32991わいひらキーマスター
こちらも同様の症状です。
Feedlyのカウンタが0になっちゃったんですけど、ぼくだけ? -
2015年9月30日 11:00 PM #32992Hidekichiゲスト
応答ヘッダがtransfer-encoding:chunkedになってて、content-lengthが入ってないので細切れになって返ってきてるんじゃないでしょうかね?
chunkedにされている理由がないのであれば無効にしたら良いのではないかと楽観的に思ったりもします。
htmlではわからない部分なんですが、chunkedにするとレスポンスの所々に変な数字が入ってくるんです。つまりはchunk(かたまり)って感じなんですけど、これによってどれぐらい進捗しているのかがわかるんですが、別にそんなの必要ないっていうのであれば無効にするのが良いと思うんです。
transfer-encoding:chunkedが必要となると、ajax側でそれに対応するようにするしか無いんですけれども、ここらは僕もあんまり詳しくは知りません。
XSERVERってapacheの細かな設定できるんでしたっけ?
-
2015年9月30日 11:05 PM #32993keimaspaceゲスト
途中まで追いかけてみました。
ファイルあるけど404 → http://nabi1080.com/wp-content/themes/simplicity/lib/fetch-feedly.php
ファイルあって200 → http://nabi1080.com/wp-content/themes/simplicity/lib/sns.php
ファイルなくてリダイレクト → http://nabi1080.com/wp-content/themes/simplicity/lib/dummy.php以上から想像するに、WordPress本体でヘッダに404をセットしているように見えます。
WordPress本体のバージョンや手の入れ具合によりそうです。いまsimplicity1.9.3cにアップデート作業中なので、アップデートしたらこちらの動作状況も確認してみます。
-
2015年9月30日 11:16 PM #32994Hidekichiゲスト
もし、transfer-encoding:chunkedが問題なら、問題の出ないxdomainにテストサイトをもって、
レスポンスを送る例えば、fetch-feedly.phpに
header('Access-Control-Allow-Origin: http://www.example.com');
こんなのをつけとけば、ajax部分でxdomainの方に取得に行けば良いだけなんですけどね。
http://www.example.comはアクセスを許可するドメインです。 -
2015年9月30日 11:17 PM #32995わいひらキーマスター
ありがとうございます。
エックスサーバーのサーバーパネルには、Apacheの細かな設定をする項目はなかったと思います。transfer-encoding:chunkedなんですけど、ヘッダーを調べてみたら、僕のサイトも「transfer-encoding:chunked」になっているようです。
http://seocheki.net/http-header.php?url=http://wp-simplicity.com/simplicity1-8-9/
http://seocheki.net/http-header.php?url=http://nabi1080.com/management/blog/37305なぜ、同じサーバーで、おそらくどちらもデフォルトに近い設定なのに、こんな違いが出るんだろう…。
プラグインか何かの影響なんでしょうかね。 -
2015年9月30日 11:19 PM #32996
-
2015年9月30日 11:25 PM #32997
-
2015年9月30日 11:27 PM #32998keimaspaceゲスト
再現しました。ファイルがあっても404になります。
PHP5.4 + nginx(CentOS7のほぼデフォルト設定)
WordPress4.3.0
simplicity1.8.9cブラウザから直にたたいても挙動かわらないので、transfer-encoding:chunkedはたぶん関係なさそうです。
-
2015年9月30日 11:32 PM #32999わいひらキーマスター
僕の環境は、Wordpress4.3.1です。
んー、なんでこうなるんだろう…。nabi1080.com
http://seocheki.net/http-header.php?url=http%3A%2F%2Fnabi1080.com%2Fwp-content%2Fthemes%2Fsimplicity%2Flib%2Ffetch-feedly.php%3Furl%3Dhttp%3A%2F%2Fnabi1080.com%2Ffeed (404)
http://seocheki.net/http-header.php?url=http%3A%2F%2Fnabi1080.com%2Fwp-content%2Fthemes%2Fsimplicity%2Flib%2Fsns.php (200)
http://seocheki.net/http-header.php?url=http%3A%2F%2Fnabi1080.com%2Fwp-content%2Fthemes%2Fsimplicity%2Flib%2Fdummy.php (301)wp-simplicity.com
http://seocheki.net/http-header.php?url=http%3A%2F%2Fwp-simplicity.com%2Fwp-content%2Fthemes%2Fsimplicity%2Flib%2Ffetch-feedly.php%3Furl%3Dhttp%3A%2F%2Fwp-simplicity.com%2Ffeed%2F (200) -
2015年9月30日 11:45 PM #33000keimaspaceゲスト
require_once(‘../../../../wp-blog-header.php’);
をした時点で404がヘッダにsetされているので、本体側で404に設定していますね。どの部分、かはすぐにはわかりませんでした。で、非常にお行儀が悪いのですが、
//URLパラメーターの取得 $url = $_GET['url']; http_response_code(200); echo fetch_google_plus_count($url);
と、「http_response_code(200);」で回避はできるようです……。
本筋から言えば、themeからwp-blog-header.phpを呼ぶのではないのでしょうね。どうすべきかはちょっとしらないのですが。
-
2015年9月30日 11:51 PM #33001
-
2015年9月30日 11:52 PM #33002Hidekichiゲスト
うちのnginxは寝ログのGoogle+のカウントがあるやつは普通にカウント取得してます。
確かにうちのもtransfer-encoding:chunkedになってますが、gzipになってるのも気になる所。
http://nabi1080.com/management/blog/37305 さんのところは、gzipになってないですしね。
keimaspace さんのサーバーはどうですか?
Content-Encoding はgzipになってますか? -
2015年10月1日 12:05 AM #33004Hidekichiゲスト
WPの関数なら、
require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );
ではダメなんですかね? -
2015年10月1日 12:05 AM #33005keimaspaceゲスト
gzipにしています。
nabi1080.comとwp-simplicity.comの両方がWordPress4.3.1なら、なぜ差が出るかが謎になっちゃいますね……。
はて、さて。これを追いかけるのは時間がかかりそうなので、回避策でうまくいくならいったん寝てから考え直したほうがよさそうです。 -
2015年10月1日 12:07 AM #33006わいひらキーマスター
とりあえずは、#33000の方法で、修正しておきました。
修正版1.8.9eを公開。
[修正d]カテゴリーh1の見出しにqが入っていたのを除去
[修正e]環境によっては、Google+、Pocket、feedlyのシェア数が取得できなかった不具合修正(多分)
http://wp-simplicity.com/simplicity1-8-9/ -
2015年10月1日 12:08 AM #33007
-
2015年10月1日 12:17 AM #33008Hidekichiゲスト
require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );はダメでしたが、
require_once( ‘../../../../wp-load.php’ );はウチでは動作しました。
リダイレクト云々となるとそこらはわかりませんけれども。ひとまずjQueryアタリには問題ないみたいですな(笑)
-
2015年10月1日 12:26 AM #33009Hidekichiゲスト
うちのサイトはwordpress関数に依存しない形で、jQueryのajax部分も違うのであれなんですけど、
Simplicityを少し改造してみた part9-2 SNSボタンのカウント処理大改造の修復(2015年10月版)
の記事内にGitHubへうちの現在実装してあるカウント取得用phpとjavascript部のリンクが貼ってありますので、必要な方はどうぞ。curl版です。file_get_contentsが利用できる人はそれでもいけます。
まぁ公式として出す場合は、テーマチェッカーも気になりますよね。
うちなどはそこらは全く無視してるので気楽なもんです(笑) -
2015年10月1日 12:58 AM #33010keimaspaceゲスト
こちらの感興では修正版1.8.9eで動くこと確認できました。
-
2015年10月1日 12:59 AM #33011keimaspaceゲスト
×感興
○環境だめだw おやすみなさい。
-
2015年10月1日 8:46 AM #33016わいひらキーマスター
今朝見たら、当サイトでカウントが表示されていませんでした。
どうやら、http_response_code(200);を挿入すると、以前の正常環境で取得がおかしくなるようです。
とりあえず、以前のものに戻しました。
夕方ぐらいから対処法を探ってみます。 -
2015年10月1日 8:53 AM #33017わいひらキーマスター
今ちょっと試してみたら、
require_once(‘../../../../wp-load.php’);
で両方環境とも404にはならないようです。
とりあえずこちらのバージョンに差し替えておきました。
これで多分大丈夫なはず。多分。 -
2015年10月1日 6:52 PM #33024Hidekichiゲスト
jQueryのajax部分見てたんですけど、
はてブ、facebookの所は、//はてブ function fetch_hatebu_count(url, selecter) { jQuery.getJSON("http://api.b.st-hatena.com/entry.count?callback=?",{ url: url },function(res){ jQuery( selecter ).text( res || 0 ); },function(){ jQuery( selecter ).text('0'); }) } //Facebookのシェア数を取得 function fetch_facebook_count(url, selecter) { jQuery.getJSON("https://graph.facebook.com/?callback=?",{ id: url },function(res){ jQuery( selecter ).text( res.shares || 0 ); },function(){ jQuery( selecter ).text('0'); }) }
これでイケると思います。
-
2015年10月1日 8:42 PM #33026わいひらキーマスター
現在の書き方だと、どこか不味いところとかありましたでしょうか。
そちらのほうがスッキリ書けるという意味でよろしいでしょうか。
僕も簡潔に書けた方が良いので、同様の動作をするなら修正しておきます。 -
2015年10月1日 8:52 PM #33027わいひらキーマスター
変更してみようと思ったんですけど、getJSONでタイムアウトって設定できますでしょうか?
-
2015年10月1日 10:30 PM #33029Hidekichiゲスト
#33024 は、想像いただいたように、さっくり書けると言う意味合いです。timeoutが必要な場合は、最初のfunctionに何かしら仕込んでおいて、そこがtrueならsetTimeoutでと余計に面倒な話になるので$.ajaxの方が良いかと思います。
$ajaxの方は、基本そのままで問題ないですが、success,errorはあまりベターではありません。jQuery1.8より非推奨の書き方です。現在でも使えますけどね(笑)
1.8以降は、.done、.failを使います。違いとしてはoptionでやるかメソッドでやるかです。メソッドっていうのは、オブジェクトを操作する命令です。つまりは、オブジェクトとしてのデータをいじくれるようにすると言う感じですね。
メソッドチェーンと言う方法が言われたりしますが、オブジェクトは使いまわす方が高速に動作します。
参考:http://www.jquerystudy.info/tutorial/applied/chain.htmlなのでajaxで書く場合は、
function fetch_facebook_count(url, selecter) { jQuery.ajax({ url:'https://graph.facebook.com/', dataType:'jsonp', timeout: 10000, //10sec data:{ id:url } }).done(function(res){ jQuery( selecter ).text( res.shares || 0 ); }).fail(function(){ jQuery( selecter ).text('0'); }); }
こんなふうに書けます。failがいわゆるerrorの部分ですが、ここに、
.fail(function(jqXHR, textStatus, errorThrown){ jQuery( selecter ).text('0'); console.log("status:[%s] %s | %s",errorThrown,textStatus,jqXHR); });
このようにしておけば、例えば status:[timeout] Not Found [object]などのように原因をconsoleに出すことができるので便利です。
.done、.failの後の処理が比較的簡素なので、.done,.fail部を
function fetch_facebook_count(url, selecter) { jQuery.ajax({ url:'https://graph.facebook.com/', dataType:'jsonp', timeout: 10000, //10sec data:{ id:url } }).then( function(res){ jQuery( selecter ).text( res.shares || 0 ); }, function(){ jQuery( selecter ).text('0'); } ); }
こう書いても同じことです。
-
2015年10月1日 11:04 PM #33030わいひらキーマスター
なるほど、了解です。
手元のファイルは.done、.failに変更しておきました。
教えていただきありがとうございます!
-
-
投稿者投稿
- トピック「Ajaxのカウントを取得するためのPHPファイルが404になってしまう(hidekichiさんよかったら教えてください)」には新しい返信をつけることはできません。