使用高级自定义字段时最大限度地减少数据库查询

时间:2015-01-28 作者:Mike Source

我正在制作一个页面,列出一家大公司的员工名单,并试图尽量减少我被迫查询数据库的次数,因为数据库变得非常复杂和缓慢。

  • \'person\' 是一种自定义的帖子类型(大约有300人)
  • \'date_accredited\' 是通过高级自定义字段插件添加的日期字段\'date_accredited\'.

    我需要列出\'person\' 但是,由于所有认证员工都排在第一位(因此大约有20名认证员工排在第一位)。

    目前,我正在调用WP\\u Query,如下所示:

    $args = array(
        \'posts_per_page\' => -1, 
        \'post_type\' => \'people\', 
        \'no_found_rows\' => true, 
        \'meta_key\' => \'date_accredited\'
    );
    $people = new WP_Query($args);
    
    之后,我会:

    while($people->have_posts()): $people->the_post();      
        $my_post_meta = get_post_meta($post->ID, \'date_accredited\', true);
        if (!empty($my_post_meta)) {
            array_push($accredited, $post);
        } else {
            array_push($notAccredited, $post);
        }
    endwhile;
    
    给我们留下两个“person”对象数组。我在这里的想法是,我可以做如下事情来获得我想要的列表:

    foreach($accredited as $person):
        personTile($person);
    endforeach;
    
    foreach($notAccredited as $person):
        personTile($person);
    endforeach;
    
    我试图避免重新查询数据库。

    这个personTile(); 函数应该输出各种信息和HTML(the_post_thumbnail() 和各种高级自定义字段),但我现在意识到,我从中获取的post对象中没有包含这些内容WP_Query(), 所以我不得不使用这样的东西:

    • get_the_post_thumbnail($person->ID)
    • get_permalink($person->ID)
    • get_field(\'date_accredited\', $person->ID)

      是否有任何方法可以将永久链接、缩略图和ACF字段包含在原始DB查询中?我是否需要求助于自定义MySQL查询???

      欢迎任何其他建议!

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

所有这些都需要另一个DB查询(每个!),更糟糕的是,由于它们在一个循环中,每一个都会发生300次左右。

不要惊慌!您查询的帖子存储在WordPress\'object cache (这只是内存,除非您有一个定制的缓存系统)。

所有在POST上操作的函数都会通过该缓存路由,因此在您的情况下,即使您不在“循环”中,也不会有额外的数据库命中。

但是,您会希望在查询后立即弹出此行:

// http://wpseek.com/function/update_post_thumbnail_cache/
update_post_thumbnail_cache( $people );
这将运行两个额外的查询(post和post meta),这将在WP_Query 实例到同一缓存。

否则,您将得到大量查询(每个有缩略图的帖子有两个查询)。

N.B: 有几个WP_Query 将更改帖子缓存方式的参数:

  • update_post_meta_cache (几乎总是肯定的)
  • update_post_term_cache (如果您不需要术语,可以在此处保存查询)
  • fields (如果不是all, 没有缓存任何内容,上面的内容将被忽略)
  • cache_results (如果为false,则不会缓存任何内容,并且忽略上面的所有内容)

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post

使用高级自定义字段时最大限度地减少数据库查询 - 小码农CODE - 行之有效找到问题解决它

使用高级自定义字段时最大限度地减少数据库查询

时间:2015-01-28 作者:Mike Source

我正在制作一个页面,列出一家大公司的员工名单,并试图尽量减少我被迫查询数据库的次数,因为数据库变得非常复杂和缓慢。

  • \'person\' 是一种自定义的帖子类型(大约有300人)
  • \'date_accredited\' 是通过高级自定义字段插件添加的日期字段\'date_accredited\'.

    我需要列出\'person\' 但是,由于所有认证员工都排在第一位(因此大约有20名认证员工排在第一位)。

    目前,我正在调用WP\\u Query,如下所示:

    $args = array(
        \'posts_per_page\' => -1, 
        \'post_type\' => \'people\', 
        \'no_found_rows\' => true, 
        \'meta_key\' => \'date_accredited\'
    );
    $people = new WP_Query($args);
    
    之后,我会:

    while($people->have_posts()): $people->the_post();      
        $my_post_meta = get_post_meta($post->ID, \'date_accredited\', true);
        if (!empty($my_post_meta)) {
            array_push($accredited, $post);
        } else {
            array_push($notAccredited, $post);
        }
    endwhile;
    
    给我们留下两个“person”对象数组。我在这里的想法是,我可以做如下事情来获得我想要的列表:

    foreach($accredited as $person):
        personTile($person);
    endforeach;
    
    foreach($notAccredited as $person):
        personTile($person);
    endforeach;
    
    我试图避免重新查询数据库。

    这个personTile(); 函数应该输出各种信息和HTML(the_post_thumbnail() 和各种高级自定义字段),但我现在意识到,我从中获取的post对象中没有包含这些内容WP_Query(), 所以我不得不使用这样的东西:

    • get_the_post_thumbnail($person->ID)
    • get_permalink($person->ID)
    • get_field(\'date_accredited\', $person->ID)

      是否有任何方法可以将永久链接、缩略图和ACF字段包含在原始DB查询中?我是否需要求助于自定义MySQL查询???

      欢迎任何其他建议!

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

所有这些都需要另一个DB查询(每个!),更糟糕的是,由于它们在一个循环中,每一个都会发生300次左右。

不要惊慌!您查询的帖子存储在WordPress\'object cache (这只是内存,除非您有一个定制的缓存系统)。

所有在POST上操作的函数都会通过该缓存路由,因此在您的情况下,即使您不在“循环”中,也不会有额外的数据库命中。

但是,您会希望在查询后立即弹出此行:

// http://wpseek.com/function/update_post_thumbnail_cache/
update_post_thumbnail_cache( $people );
这将运行两个额外的查询(post和post meta),这将在WP_Query 实例到同一缓存。

否则,您将得到大量查询(每个有缩略图的帖子有两个查询)。

N.B: 有几个WP_Query 将更改帖子缓存方式的参数:

  • update_post_meta_cache (几乎总是肯定的)
  • update_post_term_cache (如果您不需要术语,可以在此处保存查询)
  • fields (如果不是all, 没有缓存任何内容,上面的内容将被忽略)
  • cache_results (如果为false,则不会缓存任何内容,并且忽略上面的所有内容)

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post