如何使用wp-Super缓存缓存JSON

时间:2012-04-26 作者:Starfs

在一个新项目中,我们使用wp super cache(客户端的首选插件)为自定义内容类型创建静态html文件。但我们正试图弄清楚是否所有内容都被正确缓存。

这是一个由两部分组成的问题。

1) 我们创建的主题利用页面模板输出通过ajax调用摄取的json。例如,如果你点击了网页:theurl。com/sample-您将得到纯json。虽然每个页面和帖子都有一个非javascript版本,但Ajax驱动着这个主题的前端。我们已经删除了这些文件中的页眉和页脚,因此它是纯json,我们正试图找出如何确定json是否正在缓存。理论上,数据将被缓存,因为从技术上讲,它是wordpress提供的页面。但是,我们如何确定它是否正在缓存?

2) 我们正在使用json api插件来提供某些post数据。http://wordpress.org/extend/plugins/json-api/对于这个例子,假设我们正在利用插件的默认输出方法并点击这个页面:我的url。com/类别/新闻?json=1-有人知道如何验证是否缓存了此输出吗?如果它没有被缓存,什么方法会发生这种情况?

网上似乎没有太多关于这方面的信息,所以本着创建引人注目和优化的wordpress网站的精神,帮助一个兄弟

4 个回复
SO网友:Starfs

看起来json并没有被wp超级缓存缓存,但我们决定采取不同的方法。通过使用transient api, 我们能够在所有json上进行人工缓存,并大大减少了数据库的负担。然后在ajax方面,我们正在缓存从这个半缓存json创建的html。一切都非常迅速!下面是代码和概念的缩小版本。

    $transient_key = \'my-transient-key\'; 
    $data = get_transient( $transient_key ); 

    if ( $data == \'\' ) { 
      $args = array(

    \'post_type\' => \'brand\', 
    \'posts_per_page\' => 50

  );

  $postsArray = array();  
  // The Query
 query_posts( $args );

  // The Loop
  while ( have_posts() ) : the_post();

    $brand_id = get_the_ID();
    $slug = basename(get_permalink());
    $title = get_the_title();
    $description = get_the_content();

                $posts = array(

                   \'brand_id\' => $brand_id,
                   \'machine_name\' => $slug,
                              \'postTitle\' => $title,
                   \'description\' => $description,

                   );

    array_push($postsArray,$posts);


  endwhile;

   $data = json_encode($postsArray);


 set_transient( $transient_key, $data, 60 * 60 * 24 ); // one day
 }  // now all the brand information is cached as one table call.

echo $data;

SO网友:its_me

WP Super Cache在缓存WordPress站点的页面之前,会检查页面中的一些HTML标记。

您的页面很可能没有</html> 标记(常见问题),在这种情况下,请尝试添加以下内容//</html> -- 这是一个解决方法,然后WP Super Cache应该生成页面的缓存版本。

Why does WP Super Cache do it like that? 看,除了检查所有基本HTML标记是否存在并正确关闭外,没有明显的方法可以检查页面是否只加载了一半。

Donncha(WP Super Cache的开发人员)own words, “这是为了阻止缓存生成的一半页面。”

SO网友:Ian Dunn

SECURITY NOTE: 除非您有办法覆盖该选项,否则不应使用该选项(以及其他解决方案)Content-Type: text/html WP Super Cache使用适当的application/json 价值发送JSON为text/html 将导致浏览器将其呈现为HTML,HTML可能是XSS向量。

看起来这需要在服务器层完成,因为WPSC没有提供必要的挂钩。

我就是这样做的。它与Liang的方法类似,但不需要直接修改插件,并且具有更精确的regex模式。

如果您使用的是REST API的v2,那么应该使用REST_REQUEST 而不是JSON_REQUEST.

订阅就好了22#79 以防WP超级缓存中发生更改。

/**
 * Tell WP Super Cache to cache API endpoints
 *
 * @param string $eof_pattern
 *
 * @return string
 */
function wcorg_json_cache_requests( $eof_pattern ) {
    global $wp_super_cache_comments;

    if ( defined( \'JSON_REQUEST\' ) && JSON_REQUEST ) {
        // Accept a JSON-formatted string as an end-of-file marker, so that the page will be cached
        $json_object_pattern     = \'^[{].*[}]$\';
        $json_collection_pattern = \'^[\\[].*[\\]]$\';

        $eof_pattern = str_replace(
            \'<\\?xml\',
            sprintf( \'<\\?xml|%s|%s\', $json_object_pattern, $json_collection_pattern ),
            $eof_pattern
        );

        // Don\'t append HTML comments to the JSON output, because that would invalidate it
        $wp_super_cache_comments = false;
    }

    return $eof_pattern;
}
add_filter( \'wp_cache_eof_tags\', \'wcorg_json_cache_requests\' );

SO网友:Liang Rongze

我也遇到了这个问题。我写了一些代码作为API。当响应类型为XML时,缓存工作。但当响应类型为json时,它就不起作用了。

我花了几个小时来修复这个bug。

这是我的工作。

enter image description here

只需像我的更改一样更新代码。

现在对我有用了。

结束

相关推荐

ajax not working in plugin

下面的代码在WordPress之外运行得很好,但当我试图在WordPress内部执行它时,什么都没有发生:var js = jQuery.noConflict(); js(document).ready(function(){ js(\'#ClientID\').live(\'change\', function() { js.ajax({ url : \'includes/form.php\',