データの取得自体はどうしても時間がかかる処理なのかなとは思います。
アクセスがあるたびに、データを取得する必要は無いのかなと思いますので、 Transient_API 等を使ってデータをキャッシュしておくのはどうでしょう。
[WordPressのTransients APIを用いて表示の高速化を図る – Simple Colors](https://www.warna.info/archives/1681/)
[Transients API – WordPress Codex 日本語版](http://wpdocs.osdn.jp/Transients_API)
ご連絡ありがとうございます。
キャッシュについては以前にチャレンジしたことがあります。
ショートコードによりグーグルスプレッドシートから読み込むため、グーグルスプレッドシートのデータが変更されても新しいデータを読み込もうとはしません。
なので、表示される速度は速くなるのですが、更新されたデータをすぐ読み込まず、また、仮に読み込むとしても速度は遅いので意味はありませんでした。
質問させていただいた、1.の方法はやはり難しいということなのでしょうか?
まず、そこが知りたい所です。
こんにちは
shortcd 関数の実装はイケてないんじゃないでしょうか・・・多分
SPL の NoRewindIterator がどのような実装になっているのか分かりませんが、名前やメソッドからして前方向へのファイル中の移動を可能にしているクラスだと思います。(後ろ方向は禁止ですが)
SplFileObject も低レベルのファイル操作 API を実装していてファイルを全てメモリにロードせずに、巨大なファイルでも読み取ったりすることを可能にしているのだと思います。
つまり、NoRewindIterator クラスのインスタンスでイテレート(行移動)するたびに Google Drive にアクセスしているので遅いのだと思います。
そのURLでCSVファイルにアクセス可能なのであれば、file_get_contents か curl でファイルをメモリにロードすれば良いと思います。(ファイルが巨大でなければですが)
そののち、ご自身でCSV ファイルを配列にする処理を記述してください。
file_get_contents は便利ですが、サーバーによっては http のプロトコルで始まるファイルは取得できないように設定されているかもしれません。
その場合は curl を使ってください。
※ファイルを全て読む仕様になっていますが、指定された $who を読み込んだら後は不要なので、ループはそこで break することでも処理は速くなります。必要なデータがCSVの上の方にある場合は。
こんにちは
ひとつのセルを表示する度に、ファイルを読んでいるようなので、まとめてみてはどうでしょうか?
function shortcd( $who ) {
(省略)
foreach ( $file as $value ) {
$records[] = $value ;
}
//return $records[$who[0]][$who[1]];
$out = "<p>吉田君の体重は {$records[2][1]} Kgです。</p>";
$out .= "<p>先月より {$records[2][2]} Kg {$records[2][3]} います。</p>";
$out .= "<p>部員全員の中で {$records[2][4]} 番です。</p>";
return $out;
}
add_shortcode( 'sc', 'shortcd' );
キャッシュについては以前にチャレンジしたことがあります。
チャレンジされたのは、@toro_unit さんが書かれている Transient API でしょうか?
下記のようなコードでは、効果ありませんか?
function shortcd( $who ) {
if ( false === ( $records = get_transient( 'sc_shortcode' ) ) ) {
(省略)
foreach ( $file as $value ) {
$records[] = $value ;
}
set_transient( 'sc_shortcode', $records, 5 * MINUTE_IN_SECONDS ); // 5分間有効
}
return $records[$who[0]][$who[1]];
}
add_shortcode( 'sc', 'shortcd' );
ishitakaさま
わざわざスクリプトまで書いていただきましてありがとうございます。
本当に感謝しています。
1つ目に頂いたコードについては、1人分50セル分くらい出力してまして、現在の環境では使用できないのではないかと思ってます。
2つ目に頂いた試してみたいと思っています。
恐れ入ります、「(省略)」の部分は、以下の内容を入れればいいのでしょうか?
$filepath = “https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●/pub?gid=●●●●●●●●&single=true&output=csv”;
$file = new NoRewindIterator(new SplFileObject($filepath));
$file->setFlags(SplFileObject::READ_CSV);
私のような初心者にいつも懇切丁寧に教えてくださり本当にありがとうございます。
以下の内容を入れればいいのでしょうか?
はい、そうです。
なお、 @megumiiuchi19920715 さんのコードが正しいかどうかは検証していませんので、あしからずご了承くださいませ。
munyaguさま
貴重な情報をありがとうございます。
頂いた内容について素晴らしいと思うのですが、私のような初心者には到底実現ができず、また、この内容をいつもお世話になってるフリーランスの方にオブラートに包んで伝えたとしてもレベルが高すぎて傷つけてしまって、今後業務を請け負ってもらえないかもしれない不安があります(いつも安くやっていただいているので)。
それくらいレベルの高いことをお伝えいただいたことは分かるのですが…
全くレベルは高くありません。
SplFileObject や NoRewindIterator を使える方がレベルが高いと思います。
私はこれらのクラスは、ファイルが巨大すぎて処理できない場合など、特別な要件がないかぎり、ややこしそうなので使いたくないくらいです。
恐れ入ります、それで今回質問させていただいてます
1.公開しているGoogleSpreadSheet(CSV)を自分のWordpressサーバにコピー。
の件なのですが、技術的には難しいものでしょうか。
コピーするスクリプトを実行すれば
容易に出来るものだと考えていたのですが。
私の結論は先に記述したように、メモリの読み込む、というものです。
高速化するためにWordPressのサーバーにコピーする必要はない、というものです。
私の提案は同じ環境で試したわけではないので、実際にどうかは試してみないと分かりません。
shortcd 関数を少し書き換えるだけで試せるので、試していただけたらと思います。