如何使用wp-super缓存来缓存json


15

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

这是一个两部分的问题。

1)我们创建的主题利用页面模板来输出通过ajax调用吸收的json。即。如果您访问以下页面:theurl.com/sample-您将获得纯json。尽管每个页面和帖子都有一个非JavaScript版本,但Ajax驱动了该主题的前端。我们已经删除了这些文件中的页眉和页脚,以便它是纯json,并且我们正在尝试找出如何确定json是否正在缓存。从理论上讲,数据将被缓存,因为从技术上讲它是由wordpress提供的页面。但是,我们如何确定它是否正在缓存?

2)我们也使用json api插件来提供某些帖子数据。 http://wordpress.org/extend/plugins/json-api/ 对于此示例,假设我们正在使用插件的默认输出方法并访问此页面:my url.com/category/news?json=1-是否有谁知道我们如何验证此输出是否已缓存?如果不进行缓存,哪种方法可以实现?

网上似乎没有太多相关信息,因此本着创建引人入胜且经过优化的wordpress网站的精神,帮助兄弟们

Answers:


9

似乎确实没有通过wp-super-cache缓存json,但是我们决定采用其他方法。通过使用瞬态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;

很好,竖起大拇指!!!
Dipesh KC 2012年

6

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

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

为什么WP Super Cache会那样做?瞧,没有比检查所有基本HTML标记是否存在并正确关闭的方法更明显的方法了。

用Donncha(WP Super Cache的开发人员)的话来说,“这是为了阻止一半已生成的页面被缓存。”


我希望他们可以选择专门缓存json或其他数据类型。如此众多的选择,但不是该项目所需的选择。但是,这是一个很不错的解决方法。我会尝试的。
Starfs 2012年

3

安全说明:除非您有办法Content-Type: text/html用适当的application/json值覆盖WP Super Cache发送的标头,否则不应使用此(和其他解决方案)。发送JSON text/html将导致浏览器将其呈现为HTML,这可能是XSS向量。

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


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

如果您使用的是REST API的v2,则应使用REST_REQUEST而不是JSON_REQUEST

最好订阅22#79,以防WP Super Cache发生更改。

/**
 * 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' );

你好 我使用wp_cache_eof_tags过滤器,但现在(并且仅在启用缓存时),我遇到一个错误:XMLHttpRequest cannot load http://api.mywebsite.com/wp-json/wp/v2/posts. Origin http://mywebsite.com is not allowed by Access-Control-Allow-Origin.如何解决?
卢卡斯Florczak

由于您在单独的域上拥有REST API,因此您的主站点可能正在导出Access-Control-Allow-Origin标头以允许跨域请求。我猜缓存的页面没有输出该标头。
伊恩·邓恩

0

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

我花了几个小时才能解决此错误。

这对我来说是工作。

在此处输入图片说明

就像我所做的更改一样更新您的代码。

现在对我有用。


5
请发布真实代码,而不是代码的图片。
Pieter Goosen

1
您应该使用wp_cache_eof_tags过滤器,而不是直接修改插件。
伊恩·邓恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.