how to use transient method?

时间:2019-11-10 作者:Alt C

建议使用临时方法删除重复的查询Duplicate Queries

为什么这不起作用?是不是用错了

 private function get_acf_list()
  {
      if(!class_exists(\'acf\')){
        return array();
      }
      global $wpdb;
      if ( false === ( $pgggo_qry = get_transient( \'pgggo_acf_query_results\' ) ) ) {
        // It wasn\'t there, so regenerate the data and save the transient
        $pgggo_qry = "SELECT post_excerpt as \'field_name\', post_title as \'field_label\' FROM {$wpdb->prefix}posts where post_type = \'acf-field\'";
        set_transient( \'pgggo_acf_query_results\', $pgggo_qry, 12 * 7200 );
      }

      $pgggo_list_results = $wpdb->get_results($pgggo_qry, ARRAY_A);
      $acf_field_array    = array();
      if (!empty($pgggo_list_results)) {
          foreach ($pgggo_list_results as $value) {
              $acf_field_array[$value[\'field_name\']] = $value[\'field_label\'];
          }
      }
      return $acf_field_array;
  }

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

首先,您不需要原始SQL查询,使用它可以放弃WP的所有优化。

例如,如果您运行两次查询,它将运行两次。如果你用过WP_Query 不过,要获取这些帖子,可以在第一时间保存它们,以避免进行额外的查询。这些帖子甚至可能是其他查询的结果。

除此之外,缓存插件处理查询的选项有限,您必须自己进行所有验证/清理。

所以请这样做:

$q = new WP_Query(  [
    \'post_type\' => \'acf-field\',
    \'posts_per_page\' => 50,
] );
if ( $q->have_posts() ) {
    while ( $q->have_posts() )  {
        $q->the_post();
        // ...
    }
    wp_reset_postdata();
}
其次,您不需要费劲地重命名列和获取单个字段。您正在进行额外的繁重工作,使得从已经获取的数据中提取数据变得困难,并避免使用WP API。

自从你field_name 只是这篇文章的摘录field_label 是帖子标题,只需使用get_the_excerpt()get_the_title() 在回路内部。

最终结果自然会避免重复查询,因为WP将存储它所获取的内容WP_Cache 第二次使用它。如果使用Redis/MemcacheD/etc安装对象缓存插件,它将完全避免查询。

WP中的一条一般经验法则是,如果需要执行原始SQL查询来从自定义表以外的任何对象中提取数据,要么是出现了严重错误,要么是进行了非常昂贵的查询,需要在CLI命令或cron作业中执行。

相关推荐

清理Get_Query_var()URL参数

我目前正在一个网站上工作,并测试其安全性。其中一个页面具有排序功能,我在其中传递一个url参数,说明我希望如何对内容进行排序。例如:www.example.com/page/?sort=alpha 这很好,但我也尝试发送恶意代码:www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E 在internet explorer中,当我输入此url时,我的页面会显示出来,并弹出一个javascr