获取用户查询会使站点加载时间太大吗?

时间:2019-06-10 作者:Adham Mohamed

我试图通过最高的帖子浏览量来获得前10名(特定角色)用户,但这段代码使得网站加载时间太长,我不知道为什么!

非常感谢你的帮助。

<?php 

    global $wp_query;
    $topuser = array();

    $args = array(
        \'role__in\'     => array(\'contributor\', \'author\')
     ); 
    $user_query = new WP_User_Query( $args );

    $users = $user_query->get_results();

    foreach ( $users as $userss ) {       

    $counter = 0;

    $args = array(
      \'date_query\' => array( array( \'after\' => \'1 week ago\' ) ),
      \'author\' => $userss->ID,
      \'post_type\' => \'post\',
      \'numberposts\' => -1,
      \'cat\' => \'3\'
    );
    $query = new WP_Query( $args );

    foreach ( $query as $post ){
            $views = absint( get_post_meta( $post->ID, \'post_views_count\', true ));
            $counter += $views;
        }
        $topuser[] = array( 
        \'id\' => $userss->ID, 
        \'viewz\' => $counter
        );
        wp_reset_query();
    }

    function sortViewssz($a, $b) {
        return $b[\'viewz\'] - $a[\'viewz\'];
    }
    usort($topuser, \'sortViewssz\'); // sort the array
    $output = array_slice($topuser, 0, 10); // slice the array by limit 10

    foreach ($output as $user){

        //display users name..etc

    }
?>

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

但是这个代码使得站点加载时间太长,我不知道为什么!

我认为这只是因为你的代码从数据库中得到了很多东西。特别是如果您的代码在每次页面加载时都运行。

以下是我的建议,

Extra parameters to WP_Query to potentially make the query more efficient.

$args = array(
  \'date_query\' => array( array( \'after\' => \'1 week ago\' ) ),
  \'author\' => $userss->ID,
  \'post_type\' => \'post\',
  \'numberposts\' => -1,
  \'cat\' => \'3\',

  \'no_found_rows\' => true, // "useful when pagination is not needed", from https://10up.github.io/Engineering-Best-Practices/php/
  \'fields\' => \'ids\', // no need for all post data if get_post_meta is only what the post data is used for
  \'update_post_term_cache\' => false, // not needed if you\'re not using terms in your loop 
);
$query = new WP_Query( $args );
作为个人经验,我注意到有时候写自己的东西是有意义的sql语句并将其用于$wpdb->prepare/get_results 以更快地从数据库中取出内容。

Remove wp_reset_query(); from foreach loop

这可能只是一个小小的调整,但看看wp_reset_query 法典条目,

在使用wp\\u query或get\\u post后,不需要调用wp\\u reset\\u query,因为它们不会修改主查询对象。而是使用wp\\u reset\\u postdata

我不认为你不需要使用wp_reset_postdata() 要么因为你没有影响全球$post 变量

Use transient cache

如果不经常添加新的贡献者和作者,您可以存储$user_query->get_results(); 进入一个瞬态,有合理的过期时间或在添加新的时刷新,以跳过执行WP_User_Query 每一次。

如果它适合您的设置和情况,也许您可以保存$query = new WP_Query( $args ); 对于每个用户,作为一个瞬态,过期时间为一天。然后每天用cronjob、WP或真实的更新瞬态。

如果视图计数不需要完全实时,那么您可以考虑从$counter += $views; 进入瞬态(可能有一个小时的到期时间?)也

因此,对于每个角色正确的用户,您可以通过三个get_transient 电话。

Minor tweak to user sorting

我不确定这是否对性能有任何实际影响,但我补充说这至少是出于好奇。

// Instead of this
$topuser[] = array( 
  \'id\' => $userss->ID, 
  \'viewz\' => $counter
);

// You could do this
$topuser[$userss->ID] = $counter:

// So you can then use arsort() which
// sorts an associative array in descending order, according to the value:
arsort($topuser);

// Create also a helper array to go along with $topuser
$users_by_id[$userss->ID] = $userss;
// From which you can get user data with ID in your foreach ($output as $user) loop