【问题标题】:How to get the average post-time (hour) of day in Wordpress?如何在 Wordpress 中获取一天中的平均发布时间(小时)?
【发布时间】:2015-02-14 03:47:51
【问题描述】:

我正在尝试构建一个页面(模板)来显示我的博客的“写作行为”。为了显示我在一天中发布最多的时间,我需要计算“一天中的平均发布时间(小时)”,这样我就可以知道“嗯,我通常在早上发布博客......”

我想到的第一个想法是将所有“时间(小时)”加在一起,然后将它们除以“帖子总数”,然后转换为 24 小时格式显示,但似乎我的代码不起作用。

我写的核心代码是这样的:

<?php
$alltimes=$wpdb->get_var($wpdb->prepare("SELECT sum(post_date) FROM $wpdb->posts WHERE post_type = 'post'", $alltimes));
echo '<p>Total post count '.$published_posts.'</p>';
$count_posts = wp_count_posts(); $published_posts = $count_posts->publish;
$averagetime= $alltimes / $published_posts;
echo '<p>Average Time count is '.$averagetime.'</p>';
echo'<p>Average time is '.date('Y-m-d h:i:s',$averagetime).'</p>';
?>

我的错误是年、月、日、时、秒..全部加起来为“$alltimes”,所以当我划分时它会变成一场灾难。

如果我能得到“post_date”中的“小时”但不是整个“post_date”就可以完成这项工作,但怎么做?

感谢您的宝贵时间。

【问题讨论】:

  • 如果要让它工作,代码的另一个问题是它返回的数字不是您正在寻找的数字。尽管您得到的是平均值,但最终得到的是当您要查找的数字是模式时的平均值(如@Cyclone 的答案所示)。

标签: php mysql wordpress date


【解决方案1】:

我认为您正在寻找这样的查询。我正在使用HOUR()DATE() 从日期时间值中提取日期和小时部分:

SELECT HOUR(post_date) hour, COUNT(*) posts FROM wp_posts 
WHERE post_type = 'post' && DATE(post_date) = DATE(NOW()) 
GROUP BY hour
ORDER BY posts DESC;

这将显示在一天中的不同时间发布了多少帖子,注意这只会返回 post_date 与当前日期匹配的行。如果您想根据所有帖子获得最多小时,您只需删除DATE(post_date) = DATE(NOW()) 条件:

+------+-------+
| hour | posts |
+------+-------+
|   18 |    15 |
|   19 |    12 |
|   21 |     2 |
+------+-------+

如果您只想获得包含帖子数量最多的小时的单行,则可以这样做:

SELECT hour, MAX(posts) posts FROM ( 
  SELECT HOUR(post_date) hour, COUNT(*) posts FROM wp_posts 
  WHERE post_type ='post' && DATE(post_date) = DATE(NOW()) 
  GROUP BY hour ORDER BY posts DESC 
) v;

或者像这样:

SELECT HOUR(post_date) hour, COUNT(*) posts FROM wp_posts 
WHERE post_type = 'post' && DATE(post_date) = DATE(NOW()) 
GROUP BY hour
ORDER BY posts DESC
LIMIT 1

参考
Mysql - Date and Time Functions

【讨论】:

  • 谢谢 Cyclone,我对你的代码做了一点修改,添加到 php 中,结果页面变成空白:
     <?php $rushour = $ wpdb->get_var("SELECT HOUR(post_date) hour, COUNT(*) posts FROM $wpdb-&gt;posts WHERE post_type = 'post' &amp;&amp; DATE(post_date) = DATE(NOW()) GROUP BY hour ORDER BY posts DESC LIMIT 1", $rushour);回声 $rushour; ?&gt; 
    有什么线索吗?
  • 嗨 Cyclone,我在 phpMyadmin 上尝试了你的最后 2 个查询,但它确实返回空。我删除了“ && DATE(post_date) = DATE(NOW())”,一切正常,结果如你所说。无论如何,谢谢你的帮助,我回头看我之前的代码,我太傻了:P
  • @freeduke - 很高兴你解决了它。奇怪的是 NOW() 不适合你。你的服务器版本是多少?
  • @freeduke - 我想我现在看到了问题所在。 WHERE 子句DATE(post_date) = DATE(NOW()) 中的第二个条件将只返回与当前日期在同一天发布的行(我认为这是您想要的)。如果今天没有发布任何内容,那么您将得到一个空结果。如果您想获得包含整个最高小时的行,您当然应该删除此条件。
  • 非常感谢您对 Cyclone 的帮助,我是 Wordpress 和 php MySQL 的初学者...必须自己学习这些东西来构建我的博客。向你学习了很多,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多