閲覧数:896 views
あなたが今、読んでいるカテゴリー:
覚書
tablepressプラグインで作成した表の中でショートコードで動的に取得した内容を表示したい場面があった。
で、以下のような問題が発生した。
- 動的に取得した値ではなく、前表示していた値(キャッシュの値)が表示される
- しばらくたったら、更新されている
- ログインユーザー時の場合は更新されている
- ログインユーザーでない場合に更新されていない
条件が複雑すぎて、何が原因かしらべていたら、下記の記事にたどりついた。
これの原因は、ようは、テーブルプレスが、キャッシュを保持しておいて出力するとのこと。で、上記の解決方法として、tablepressの表を再更新する必要があるとのことだった。先人さん、いつも情報ありがとうございます。
ソースコードを解析して、今回、もう少し、スマートに解決する方法を見つけたので、ご紹介。
解決方法
ショートコードのオプションに cache_table_output=false を指定する
使用例は以下
1 2 3 |
[table id=xxxxx /] ← いつもは、こんな感じで設定しているはずだと思う。 [table id=xxxxx cache_table_output=false /] ← こうやって指定する |
これで、キャッシュを使用せずに、常に最新の情報を取得して表示してくれる。
解説
tablepress\controllers\controller-frontend.php内で、以下の処理をおこなっている。
1 2 3 4 5 6 7 8 9 10 11 |
// Check if table output shall and can be loaded from the transient cache, otherwise generate the output. if ( $render_options['cache_table_output'] && ! is_user_logged_in() ) { // Hash the Render Options array to get a unique cache identifier. $table_hash = md5( wp_json_encode( $render_options ) ); $transient_name = 'tablepress_' . $table_hash; // Attention: This string must not be longer than 45 characters! $output = get_transient( $transient_name ); if ( false === $output || '' === $output ) { // Render/generate the table HTML, as it was not found in the cache. $_render->set_input( $table, $render_options ); $output = $_render->get_output(); // Save render output in a transient, set cache timeout to 24 hours. |
cache_table_outputが指定されていて、ログインユーザーでない場合は、24時間経過するまでは、キャッシュを使用するという処理になっている。
で、cache_table_outputは、何かというと、tableをショートコードで作成するときに指定できるオプションなのである。
こいつが、指定していない場合は、デフォルトでtrueになっているのだ。(ここまでの条件をすべてまとめると、最初に列挙した4つの条件にすべて当てはまる)
tablepress\classes\class-render.php内。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/** * Get the default render options, null means: Use option from "Edit" screen. * * @since 1.0.0 * * @return array Default render options. */ public function get_default_render_options() { // Attention: Array keys have to be lowercase, otherwise they won't match the Shortcode attributes, which will be passed in lowercase by WP. return array( 'id' => '', 'column_widths' => '', 'alternating_row_colors' => null, 'row_hover' => null, 'table_head' => null, 'table_foot' => null, 'first_column_th' => false, 'print_name' => null, 'print_name_position' => null, 'print_description' => null, 'print_description_position' => null, 'cache_table_output' => true, 'convert_line_breaks' => true, 'extra_css_classes' => null, 'use_datatables' => null, 'datatables_sort' => null, 'datatables_paginate' => null, 'datatables_paginate_entries' => null, 'datatables_lengthchange' => null, 'datatables_filter' => null, 'datatables_info' => null, 'datatables_scrollx' => null, 'datatables_scrolly' => false, 'datatables_custom_commands' => null, 'datatables_locale' => get_locale(), 'show_rows' => '', 'show_columns' => '', 'hide_rows' => '', 'hide_columns' => '', 'cellspacing' => false, 'cellpadding' => false, 'border' => false, 'shortcode_debug' => false, ); } |
ここで列挙しているオプションは、テーブル作成時に指定できるオプションと捉えてよいと思う。ただ、他のオプションは解析してないので、もし使えそうな名前のオプションがあれば、grepかけてみてください。
ちなみにこのget_default_render_options関数はテーブルを作成する以下で呼ばれます。ソースコードを読むと、$shortcode_attsで指定されているオプションを優先する処理になっていた。
1 2 3 4 5 6 7 8 9 |
/** * Handle Shortcode [table id=<ID> /] in `the_content()`. * * @since 1.0.0 * * @param array $shortcode_atts List of attributes that where included in the Shortcode. * @return string Resulting HTML code for the table with the ID <ID>. */ public function shortcode_table( $shortcode_atts ) { |
まとめ
tablepressのキャッシュ問題は、ショートコードでテーブルを作成する際に、cache_table_output=false を指定で、解決できる!