Ajaxのカウントを取得するためのPHPファイルが404になってしまう(hidekichiさんよかったら教えてください)

Simplicityの特徴 フォーラム 不具合報告 Ajaxのカウントを取得するためのPHPファイルが404になってしまう(hidekichiさんよかったら教えてください)

27件の返信スレッドを表示中
  • 投稿者
    投稿
    • #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になる原因として考えられるものはありますでしょうか?

    • #32991
      わいひらわいひら
      キーマスター
    • #32992
      Hidekichi
      ゲスト

      応答ヘッダがtransfer-encoding:chunkedになってて、content-lengthが入ってないので細切れになって返ってきてるんじゃないでしょうかね?

      chunkedにされている理由がないのであれば無効にしたら良いのではないかと楽観的に思ったりもします。

      htmlではわからない部分なんですが、chunkedにするとレスポンスの所々に変な数字が入ってくるんです。つまりはchunk(かたまり)って感じなんですけど、これによってどれぐらい進捗しているのかがわかるんですが、別にそんなの必要ないっていうのであれば無効にするのが良いと思うんです。

      transfer-encoding:chunkedが必要となると、ajax側でそれに対応するようにするしか無いんですけれども、ここらは僕もあんまり詳しくは知りません。

      XSERVERってapacheの細かな設定できるんでしたっけ?

    • #32993
      keimaspace
      ゲスト

      途中まで追いかけてみました。

      ファイルあるけど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にアップデート作業中なので、アップデートしたらこちらの動作状況も確認してみます。

    • #32994
      Hidekichi
      ゲスト

      もし、transfer-encoding:chunkedが問題なら、問題の出ないxdomainにテストサイトをもって、

      レスポンスを送る例えば、fetch-feedly.phpに
      header('Access-Control-Allow-Origin: http://www.example.com');

      こんなのをつけとけば、ajax部分でxdomainの方に取得に行けば良いだけなんですけどね。
      http://www.example.comはアクセスを許可するドメインです。

    • #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

      なぜ、同じサーバーで、おそらくどちらもデフォルトに近い設定なのに、こんな違いが出るんだろう…。
      プラグインか何かの影響なんでしょうかね。

    • #32996
      わいひらわいひら
      キーマスター

      あ、レスがかぶってしまった。
      上のレスは、#32993への返信です。

    • #32997
      わいひらわいひら
      キーマスター

      #32993
      ありがとうございます。
      この差の原因はなんなんだろう…。

      いまsimplicity1.9.3cにアップデート作業中なので、アップデートしたらこちらの動作状況も確認してみます。

      よろしくお願いします!
      僕もいろいろ探ってみます。

    • #32998
      keimaspace
      ゲスト

      再現しました。ファイルがあっても404になります。
      PHP5.4 + nginx(CentOS7のほぼデフォルト設定)
      WordPress4.3.0
      simplicity1.8.9c

      ブラウザから直にたたいても挙動かわらないので、transfer-encoding:chunkedはたぶん関係なさそうです。

    • #32999
      わいひらわいひら
      キーマスター
    • #33000
      keimaspace
      ゲスト

      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を呼ぶのではないのでしょうね。どうすべきかはちょっとしらないのですが。

    • #33001
      わいひらわいひら
      キーマスター

      ありがとうございます!
      なるほど、そのように修正してみます。
      wp-blog-header.phpを使わないでも実装はできるのですけど、今度はWordpress関数が使えなくなるのでテーマチェッカーで警告が出て20点も減点されてしまいます。
      警告が出ても、動作には全く問題はないのですが、やっぱり100点満点を取りたくて。

    • #33002
      Hidekichi
      ゲスト

      うちのnginxは寝ログのGoogle+のカウントがあるやつは普通にカウント取得してます。

      確かにうちのもtransfer-encoding:chunkedになってますが、gzipになってるのも気になる所。
      http://nabi1080.com/management/blog/37305 さんのところは、gzipになってないですしね。
      keimaspace さんのサーバーはどうですか?
      Content-Encoding はgzipになってますか?

    • #33004
      Hidekichi
      ゲスト

      WPの関数なら、
      require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );
      ではダメなんですかね?

    • #33005
      keimaspace
      ゲスト

      gzipにしています。

      nabi1080.comとwp-simplicity.comの両方がWordPress4.3.1なら、なぜ差が出るかが謎になっちゃいますね……。
      はて、さて。これを追いかけるのは時間がかかりそうなので、回避策でうまくいくならいったん寝てから考え直したほうがよさそうです。

    • #33006
      わいひらわいひら
      キーマスター

      とりあえずは、#33000の方法で、修正しておきました。

      修正版1.8.9eを公開。

      [修正d]カテゴリーh1の見出しにqが入っていたのを除去
      [修正e]環境によっては、Google+、Pocket、feedlyのシェア数が取得できなかった不具合修正(多分)
      http://wp-simplicity.com/simplicity1-8-9/

    • #33007
      わいひらわいひら
      キーマスター

      #33004
      wp-load.phpは、明日調べて試してみます。

    • #33008
      Hidekichi
      ゲスト

      require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );はダメでしたが、
      require_once( ‘../../../../wp-load.php’ );はウチでは動作しました。
      リダイレクト云々となるとそこらはわかりませんけれども。

      ひとまずjQueryアタリには問題ないみたいですな(笑)

    • #33009
      Hidekichi
      ゲスト

      うちのサイトはwordpress関数に依存しない形で、jQueryのajax部分も違うのであれなんですけど、
      Simplicityを少し改造してみた part9-2 SNSボタンのカウント処理大改造の修復(2015年10月版)
      の記事内にGitHubへうちの現在実装してあるカウント取得用phpとjavascript部のリンクが貼ってありますので、必要な方はどうぞ。

      curl版です。file_get_contentsが利用できる人はそれでもいけます。
      まぁ公式として出す場合は、テーマチェッカーも気になりますよね。
      うちなどはそこらは全く無視してるので気楽なもんです(笑)

    • #33010
      keimaspace
      ゲスト

      こちらの感興では修正版1.8.9eで動くこと確認できました。

    • #33011
      keimaspace
      ゲスト

      ×感興
      ○環境

      だめだw おやすみなさい。

    • #33016
      わいひらわいひら
      キーマスター

      今朝見たら、当サイトでカウントが表示されていませんでした。
      どうやら、http_response_code(200);を挿入すると、以前の正常環境で取得がおかしくなるようです。
      とりあえず、以前のものに戻しました。
      夕方ぐらいから対処法を探ってみます。

    • #33017
      わいひらわいひら
      キーマスター

      今ちょっと試してみたら、
      require_once(‘../../../../wp-load.php’);
      で両方環境とも404にはならないようです。
      とりあえずこちらのバージョンに差し替えておきました。
      これで多分大丈夫なはず。多分。

    • #33024
      Hidekichi
      ゲスト

      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');
        })
      }

      これでイケると思います。

    • #33026
      わいひらわいひら
      キーマスター

      現在の書き方だと、どこか不味いところとかありましたでしょうか。
      そちらのほうがスッキリ書けるという意味でよろしいでしょうか。
      僕も簡潔に書けた方が良いので、同様の動作をするなら修正しておきます。

    • #33027
      わいひらわいひら
      キーマスター

      変更してみようと思ったんですけど、getJSONでタイムアウトって設定できますでしょうか?

    • #33029
      Hidekichi
      ゲスト

      #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'); }
          );
      }

      こう書いても同じことです。

    • #33030
      わいひらわいひら
      キーマスター

      なるほど、了解です。
      手元のファイルは.done、.failに変更しておきました。
      教えていただきありがとうございます!

27件の返信スレッドを表示中
  • トピック「Ajaxのカウントを取得するためのPHPファイルが404になってしまう(hidekichiさんよかったら教えてください)」には新しい返信をつけることはできません。
スポンサーリンク
アドセンス(大)
アドセンス(大)