我正在编辑一个查看计数器插件,以便它记录每个查看帖子的用户的IP。这是为了防止他们刷新页面,从而创建人工视图。
我遇到的问题是在数据库表中添加行,然后删除任何超过一个小时的行。我肯定我做错了什么,但我不知道是什么。Wordpress的文档让我很困惑。
This is my database creation function
### Create Database for IP Logging
function postviews_create_table () {
global $wpdb;
$table_name = $wpdb->prefix . "postviews_ips";
$sql = "CREATE TABLE $table_name (
postid MEDIUMINT NOT NULL,
ip VARCHAR(15) NOT NULL,
time DATETIME DEFAULT \'0000-00-00 00:00:00\' NOT NULL
);";
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
}
And this is the function that\'s supposed to add new rows and delete old ones.
### Add user IP to Database & Delete Entries Older Than 1 Day
function postviews_add_ip () {
global $post;
$id = $post->ID;
$ip = $_SERVER[\'REMOTE_ADDR\'];
$time = date("Y-m-d H:i:s");
$wpdb->insert(
\'wp_postviews_ips\',
array(
\'postid\' => $id,
\'ip\' => $ip,
\'time\' => $time
)
array(
\'%d\',
\'%s\',
\'%d\'
)
);
$sql = "DELETE FROM wp_postviews_ips WHERE time_created < (NOW() - INTERVAL 1 DAY)";
$wpdb->query($sql);
}
最合适的回答,由SO网友:fischi 整理而成
你把一些事情搞混了。
首先,您的查询检查time_created
, 您的表中不存在。
其次,您尝试将日期插入为integer
使用%d
. 您可能必须将其视为字符串。
最后,您必须设置$wpdb
在您的职能范围内
function postviews_add_ip () {
global $post, $wpdb; // Database set to global
$id = $post->ID;
$ip = $_SERVER[\'REMOTE_ADDR\'];
$time = date("Y-m-d H:i:s");
$wpdb->insert(
\'wp_postviews_ips\',
array(
\'postid\' => $id,
\'ip\' => $ip,
\'time\' => $time
), // added a colon
array(
\'%d\',
\'%s\',
\'%s\' // treat it as a string
)
);
$sql = "DELETE FROM wp_postviews_ips WHERE time < (NOW() - INTERVAL 1 DAY)"; //changed rowname
$wpdb->query($sql);
}
我强烈建议划分插入和删除的功能。你可以使用
wp-cron
用于删除,因此您不必一直调用此函数。函数本身应该以这种方式工作-但请确保对其进行优化:)