| Server IP : 207.135.97.11 / Your IP : 172.19.0.1 Web Server : LiteSpeed System : Linux 6d372a2d2e33 5.14.0-611.24.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jan 23 11:42:43 UTC 2026 x86_64 User : nobody ( 65534) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/html/ed.net.au/wp-content/plugins/post-views-counter/includes/ |
Upload File : |
<?php
// exit if accessed directly
if ( ! defined( 'ABSPATH' ) )
exit;
/**
* Post_Views_Counter_Update class.
*
* @class Post_Views_Counter_Update
*/
class Post_Views_Counter_Update {
/**
* Class constructor.
*
* @return void
*/
public function __construct() {
// actions
add_action( 'admin_init', [ $this, 'check_update' ] );
}
/**
* Check whether update is required.
*
* @return void
*/
public function check_update() {
if ( ! current_user_can( 'manage_options' ) )
return;
// get main instance
$pvc = Post_Views_Counter();
// get current database version
$current_db_version = get_option( 'post_views_counter_version', '1.0.0' );
// update 1.2.4+
if ( version_compare( $current_db_version, '1.2.4', '<=' ) ) {
// get general options
$general = $pvc->options['general'];
if ( $general['reset_counts']['number'] > 0 ) {
// unsupported data reset in minutes/hours
if ( in_array( $general['reset_counts']['type'], [ 'minutes', 'hours' ], true ) ) {
// set type to date
$general['reset_counts']['type'] = 'days';
// new number of days
if ( $general['reset_counts']['type'] === 'minutes' )
$general['reset_counts']['number'] = $general['reset_counts']['number'] * MINUTE_IN_SECONDS;
else
$general['reset_counts']['number'] = $general['reset_counts']['number'] * HOUR_IN_SECONDS;
// how many days?
$general['reset_counts']['number'] = (int) round( ceil( $general['reset_counts']['number'] / DAY_IN_SECONDS ) );
// force cron to update
$general['cron_run'] = true;
$general['cron_update'] = true;
// update settings
update_option( 'post_views_counter_settings_general', $general );
// update general options
$pvc->options['general'] = $general;
}
// update cron job for all users
$pvc->cron->check_cron();
}
}
// update 1.3.13+
if ( version_compare( $current_db_version, '1.3.13', '<=' ) ) {
// get general options
$general = $pvc->options['general'];
// disable strict counts
$general['strict_counts'] = false;
// get default other options
$other_options = $pvc->defaults['other'];
// set current options
$other_options['deactivation_delete'] = isset( $general['deactivation_delete'] ) ? (bool) $general['deactivation_delete'] : false;
// add other options
add_option( 'post_views_counter_settings_other', $other_options, null, false );
// update other options
$pvc->options['other'] = $other_options;
// remove old setting
unset( $general['deactivation_delete'] );
// flush cache enabled?
if ( $general['flush_interval']['number'] > 0 ) {
if ( $pvc->counter->using_object_cache( true ) ) {
// flush data from cache
$pvc->counter->flush_cache_to_db();
}
// unschedule cron event
wp_clear_scheduled_hook( 'pvc_flush_cached_counts' );
// disable cache
$general['flush_interval'] = [
'number' => 0,
'type' => 'minutes'
];
}
// update general options
$pvc->options['general'] = $general;
// update general options
update_option( 'post_views_counter_settings_general', $general );
}
// update 1.5.2+
if ( version_compare( $current_db_version, '1.5.2', '<=' ) ) {
// get options
$general = $pvc->options['general'];
$display = $pvc->options['display'];
// copy values
$display['post_views_column'] = $general['post_views_column'];
$display['restrict_edit_views'] = $general['restrict_edit_views'];
// remove old values
unset( $general['post_views_column'] );
unset( $general['restrict_edit_views'] );
// update settings
update_option( 'post_views_counter_settings_general', $general );
update_option( 'post_views_counter_settings_display', $display );
// update options
$pvc->options['general'] = $general;
$pvc->options['display'] = $display;
}
// update 1.6.0+ - migrate import settings to provider format
if ( version_compare( $current_db_version, '1.6.0', '<' ) ) {
// get other options
$other = $pvc->options['other'];
// check if migration is needed
if ( ! isset( $other['import_provider_settings'] ) && isset( $other['import_meta_key'] ) ) {
$old_meta_key = $other['import_meta_key'];
// create new provider settings structure
$other['import_provider_settings'] = [
'provider' => 'custom_meta_key',
'strategy' => 'merge',
'custom_meta_key' => [
'meta_key' => $old_meta_key
]
];
// update settings
update_option( 'post_views_counter_settings_other', $other );
// update options
$pvc->options['other'] = $other;
}
}
// update 1.7.10+ - normalize legacy count interval values to canonical hours
if ( version_compare( $current_db_version, '1.7.10', '<' ) ) {
$general = get_option( 'post_views_counter_settings_general', [] );
if ( ! is_array( $general ) )
$general = [];
$normalized_time_between_counts = $pvc->normalize_time_between_counts( isset( $general['time_between_counts'] ) ? $general['time_between_counts'] : null, $pvc->defaults['general']['time_between_counts'] );
if ( ! isset( $general['time_between_counts'] ) || $general['time_between_counts'] !== $normalized_time_between_counts ) {
$general['time_between_counts'] = $normalized_time_between_counts;
update_option( 'post_views_counter_settings_general', $general );
}
$pvc->options['general']['time_between_counts'] = $normalized_time_between_counts;
}
// move menu position setting to display tab
$this->migrate_menu_position_option();
$this->ensure_email_settings_option( $pvc );
$this->sync_email_summary_schedule( $pvc );
if ( isset( $_POST['post_view_counter_update'], $_POST['post_view_counter_number'] ) ) {
if ( $_POST['post_view_counter_number'] === 'update_1' ) {
$this->update_1();
// update plugin version
update_option( 'post_views_counter_version', $pvc->defaults['version'], false );
}
}
// get current database version
$current_db_version = get_option( 'post_views_counter_version', '1.0.0' );
// new version?
if ( version_compare( $current_db_version, $pvc->defaults['version'], '<' ) ) {
// is update 1 required?
if ( version_compare( $current_db_version, '1.2.4', '<=' ) ) {
$update_1_html = '
<form action="" method="post">
<input type="hidden" name="post_view_counter_number" value="update_1"/>
<p>' . __( '<strong>Post Views Counter</strong> - this version requires a database update. Make sure to back up your database first.', 'post-views-counter' ) . '</p>
<p><input type="submit" class="button button-primary" name="post_view_counter_update" value="' . __( 'Run the Update', 'post-views-counter' ) . '"/></p>
</form>';
$pvc->add_notice( $update_1_html, 'notice notice-info', false );
} else
// update plugin version
update_option( 'post_views_counter_version', $pvc->defaults['version'], false );
}
// ensure integrations option exists
if ( ! get_option( 'post_views_counter_settings_integrations' ) ) {
add_option( 'post_views_counter_settings_integrations', $pvc->defaults['integrations'], null, false );
}
}
/**
* Ensure email settings option exists and includes current defaults.
*
* @param Post_Views_Counter $pvc
* @return array
*/
private function ensure_email_settings_option( $pvc ) {
$defaults = $pvc->get_default_emails_settings();
$settings = get_option( 'post_views_counter_settings_emails', false );
if ( false === $settings ) {
add_option( 'post_views_counter_settings_emails', $defaults, null, false );
return $defaults;
}
if ( ! is_array( $settings ) )
$settings = [];
$normalized = array_merge( $defaults, $settings );
$normalized['latest_status'] = array_merge(
isset( $defaults['latest_status'] ) && is_array( $defaults['latest_status'] ) ? $defaults['latest_status'] : [],
isset( $settings['latest_status'] ) && is_array( $settings['latest_status'] ) ? $settings['latest_status'] : []
);
if ( $normalized !== $settings )
update_option( 'post_views_counter_settings_emails', $normalized );
return $normalized;
}
/**
* Sync the weekly email summary schedule during plugin upgrades.
*
* @param Post_Views_Counter $pvc
* @return void
*/
private function sync_email_summary_schedule( $pvc ) {
if ( ! isset( $pvc->emails_scheduler ) || ! $pvc->emails_scheduler instanceof Post_Views_Counter_Emails_Scheduler )
return;
$settings = get_option( 'post_views_counter_settings_emails', [] );
if ( ! is_array( $settings ) )
$settings = [];
$settings = array_merge( $pvc->get_default_emails_settings(), $settings );
$pvc->emails_scheduler->maybe_schedule( $settings );
}
/**
* Database update for 1.2.4 and below.
*
* @global object $wpdb
*
* @return void
*/
public function update_1() {
global $wpdb;
// get index
$old_index = $wpdb->query( "SHOW INDEX FROM `" . $wpdb->prefix . "post_views` WHERE Key_name = 'id_period'" );
// check whether index already exists
if ( $old_index > 0 ) {
// drop unwanted index which prevented saving views with identical weeks and months
$wpdb->query( "ALTER TABLE `" . $wpdb->prefix . "post_views` DROP INDEX id_period" );
}
// get index
$new_index = $wpdb->query( "SHOW INDEX FROM `" . $wpdb->prefix . "post_views` WHERE Key_name = 'id_type_period_count'" );
// check whether index already exists
if ( $new_index === 0 ) {
// create new index for better performance of sql queries
$wpdb->query( 'ALTER TABLE `' . $wpdb->prefix . 'post_views` ADD UNIQUE INDEX `id_type_period_count` (`id`, `type`, `period`, `count`) USING BTREE' );
}
Post_Views_Counter()->add_notice( __( 'Thank you! Datebase was successfully updated.', 'post-views-counter' ), 'updated', true );
}
/**
* Move menu position setting from "Other" to "Display" settings.
*
* @return void
*/
private function migrate_menu_position_option() {
$pvc = Post_Views_Counter();
// prefer legacy value if present, otherwise fall back to current display option
$menu_position = isset( $pvc->options['other']['menu_position'] ) && in_array( $pvc->options['other']['menu_position'], [ 'top', 'sub' ], true )
? $pvc->options['other']['menu_position']
: ( isset( $pvc->options['display']['menu_position'] ) && in_array( $pvc->options['display']['menu_position'], [ 'top', 'sub' ], true )
? $pvc->options['display']['menu_position']
: 'top' );
$display_options = get_option( 'post_views_counter_settings_display', [] );
if ( ! isset( $display_options['menu_position'] ) || ! in_array( $display_options['menu_position'], [ 'top', 'sub' ], true ) ) {
$display_options['menu_position'] = $menu_position;
update_option( 'post_views_counter_settings_display', $display_options );
}
$other_options = get_option( 'post_views_counter_settings_other', [] );
if ( ! is_array( $other_options ) )
$other_options = [];
if ( ! isset( $other_options['menu_position'] ) || ! in_array( $other_options['menu_position'], [ 'top', 'sub' ], true ) ) {
$other_options['menu_position'] = $display_options['menu_position'];
update_option( 'post_views_counter_settings_other', $other_options );
}
$pvc->options['other']['menu_position'] = $other_options['menu_position'];
$pvc->options['display']['menu_position'] = $display_options['menu_position'];
}
}