Добавьте строку в пользовательскую базу данных и удалите все строки старше 1 дня

Я редактирую плагин счетчика просмотра так, чтобы он регистрировал IP-адрес каждого пользователя, просмотревшего сообщение. Это делается для предотвращения обновления страницы и создания искусственных представлений.

В той части, с которой я столкнулся, добавляются строки в таблицу базы данных, а затем удаляются любые строки, которые старше часа. Я уверен, что я делаю что-то неправильно, но я не могу понять, что. Документация WordPress по этому поводу очень сбивает меня с толку.

Это моя функция создания базы данных

### 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 ); } 

И это функция, которая должна добавить новые строки и удалить старые.

 ### 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("Ymd 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); } 

Solutions Collecting From Web of "Добавьте строку в пользовательскую базу данных и удалите все строки старше 1 дня"

У вас несколько вещей перепутаны.

Во-первых, ваш запрос проверяет time_created , которого нет в вашей таблице.

Во-вторых, вы пытаетесь вставить дату в виде integer используя %d . Возможно, вам придется рассматривать его как строку.

Наконец, вы должны установить $wpdb в global в своей функции

 function postviews_add_ip () { global $post, $wpdb; // Database set to global $id = $post->ID; $ip = $_SERVER['REMOTE_ADDR']; $time = date("Ymd 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 для удаления, поэтому вам не нужно постоянно вызывать эту функцию. Сама функция должна работать так, но, пожалуйста, обязательно ее оптимизируйте 🙂