但是这个代码使得站点加载时间太长,我不知道为什么!
我认为这只是因为你的代码从数据库中得到了很多东西。特别是如果您的代码在每次页面加载时都运行。
以下是我的建议,
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