Skip to content

Instantly share code, notes, and snippets.

@marcissimus
Last active November 2, 2020 21:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marcissimus/a8b0eaae48ce103ff950c5f4949b9ab4 to your computer and use it in GitHub Desktop.
Save marcissimus/a8b0eaae48ce103ff950c5f4949b9ab4 to your computer and use it in GitHub Desktop.
Emergency Update for WP Plug-in Companion-auto-update (fixes 3.7.1)
<?php
// Fixes 3.7.1
// What user rights can edit plugin settings?
function cau_allowed_user_rights() {
// Current user
$user = wp_get_current_user();
// Allow roles
$allowed_roles = array( 'administrator' );
if( cau_get_db_value( 'allow_editor' ) == 'on' ) array_push( $allowed_roles, 'editor' );
if( cau_get_db_value( 'allow_author' ) == 'on' ) array_push( $allowed_roles, 'author' );
// Check
if ( array_intersect( $allowed_roles, $user->roles ) ) {
return true;
} else {
return false;
}
}
// Get database value
function cau_get_db_value( $name, $table = 'auto_updates' ) {
global $wpdb;
$table_name = $wpdb->prefix.$table;
$cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE name = '%s'", $name ) );
foreach ( $cau_configs as $config ) return $config->onoroff;
}
// Get database value
function cau_get_plugininfo( $check, $field ) {
global $wpdb;
$table_name = $wpdb->prefix.'update_log';
$cau_configs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE slug = '%s'", $check ) );
foreach ( $cau_configs as $config ) return $config->$field;
}
// Get the set timezone
function cau_get_proper_timezone() {
// WP 5.3 adds the wp_timezone_string function
if ( !function_exists( 'wp_timezone_string' ) ) {
$timezone = get_option( 'timezone_string' );
} else {
$timezone = wp_timezone_string();
}
// Should fix an reported issue
if( $timezone == '+00:00' ) {
$timezone = 'UTC';
}
return $timezone;
}
// Copy of the wp_timezone_string for < 5.3 compat
if ( !function_exists( 'wp_timezone_string' ) ) {
function wp_timezone_string() {
$timezone_string = get_option( 'timezone_string' );
if ( $timezone_string ) {
return $timezone_string;
}
$offset = (float) get_option( 'gmt_offset' );
$hours = (int) $offset;
$minutes = ( $offset - $hours );
$sign = ( $offset < 0 ) ? '-' : '+';
$abs_hour = abs( $hours );
$abs_mins = abs( $minutes * 60 );
$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
return $tz_offset;
}
}
// List of incompatible plugins
function cau_incompatiblePluginlist() {
// Pluginlist, write as Plugin path => Issue
$pluginList = array(
'better-wp-security/better-wp-security.php' => "<span class='cau_disabled'><span class='dashicons dashicons-no'></span></span> May block auto-updating for everything.",
'updraftplus/updraftplus.php' => "<span class='cau_warning'><span class='dashicons dashicons-warning'></span></span> By default this plugin will not be auto-updated. You'll have to do this manually or enable auto-updating in the settings. <u>Causes no issues with other plugins.</u>"
);
return $pluginList;
}
function cau_incompatiblePlugins() {
$return = false;
foreach ( cau_incompatiblePluginlist() as $key => $value ) {
if( is_plugin_active( $key ) ) {
$return = true;
}
}
return $return;
}
// Check if has issues
function cau_pluginHasIssues() {
$return = false;
if( get_option( 'blog_public' ) == 0 && cau_get_db_value( 'ignore_seo' ) != 'yes' ) {
$return = true;
}
if( checkAutomaticUpdaterDisabled() ) {
$return = true;
}
if( checkCronjobsDisabled() && cau_get_db_value( 'ignore_cron' ) != 'yes' ) {
$return = true;
}
if( cau_incorrectDatabaseVersion() ) {
$return = true;
}
return $return;
}
function cau_pluginIssueLevels() {
if( checkAutomaticUpdaterDisabled() ) {
$level = 'high';
} else {
$level = 'low';
}
return $level;
}
function cau_pluginIssueCount() {
$count = 0;
if( get_option( 'blog_public' ) == 0 ) {
$count++;
}
if( checkAutomaticUpdaterDisabled() ) {
$count++;
}
if( checkCronjobsDisabled() ) {
$count++;
}
if( cau_incompatiblePlugins() ) {
foreach ( cau_incompatiblePluginlist() as $key => $value ) {
if( is_plugin_active( $key ) ) {
$count++;
}
}
}
return $count;
}
function cau_incorrectDatabaseVersion() {
if( get_option( "cau_db_version" ) != cau_db_version() ) {
return true;
} else {
return false;
}
}
// Run custom hooks on plugin update
function cau_run_custom_hooks_p() {
// Create array
$allDates = array();
// Where to look for plugins
$dirr = plugin_dir_path( __DIR__ );
$listOfAll = get_plugins();
// Number of updates
$numOfUpdates = 0;
// Loop trough all plugins
foreach ( $listOfAll as $key => $value ) {
// Get data
$fullPath = $dirr.'/'.$key;
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
$fileTime = date ( 'Hi', filemtime( $fullPath ) );
$updateSched = wp_get_schedule( 'wp_update_plugins' );
// Check when the last update was
if( $updateSched == 'hourly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
} elseif( $updateSched == 'twicedaily' ) {
$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
} elseif( $updateSched == 'daily' ) {
$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
} elseif( $updateSched == 'weekly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
} elseif( $updateSched == 'monthly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
} else {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
}
$update_time = wp_next_scheduled( 'wp_update_plugins' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
if( $fileDate >= $lastday ) {
// Push to array
array_push( $allDates, $fileDate );
// Update info
if( $fileTime > $range_start && $fileTime < $range_end ) {
$status = __( 'Automatic', 'companion-auto-update' );
} else {
$status = __( 'Manual', 'companion-auto-update' );
}
$numOfUpdates++;
cau_updatePluginInformation( $key, $status );
}
}
// If there have been plugin updates run hook
if( $numOfUpdates >= 1 ) {
do_action( 'cau_after_plugin_update' );
}
}
// Run custom hooks on theme update
function cau_run_custom_hooks_t() {
// Create array
$allDates = array();
// Where to look for plugins
$dirr = get_theme_root();
$listOfAll = wp_get_themes();
// Loop trough all plugins
foreach ( $listOfAll as $key => $value) {
// Get data
$fullPath = $dirr.'/'.$key;
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
$fileTime = date ( 'Hi', filemtime( $fullPath ) );
$updateSched = wp_get_schedule( 'wp_update_themes' );
// Check when the last update was
if( $updateSched == 'hourly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
} elseif( $updateSched == 'twicedaily' ) {
$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
} elseif( $updateSched == 'daily' ) {
$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
} elseif( $updateSched == 'weekly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
} elseif( $updateSched == 'monthly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
} else {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
}
$update_time = wp_next_scheduled( 'wp_update_themes' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
if( $fileDate >= $lastday ) {
// Push to array
array_push( $allDates, $fileDate );
// Update info
if( $fileTime > $range_start && $fileTime < $range_end ) {
$status = __( 'Automatic', 'companion-auto-update' );
} else {
$status = __( 'Manual', 'companion-auto-update' );
}
cau_updatePluginInformation( $key, $status );
}
}
$totalNum = 0;
// Count number of updated plugins
foreach ( $allDates as $key => $value ) $totalNum++;
// If there have been plugin updates run hook
if( $totalNum > 0 ) {
do_action( 'cau_after_theme_update' );
}
}
// Run custom hooks on core update
function cau_run_custom_hooks_c() {
// Create array
$totalNum = 0;
// Get data
$fullPath = ABSPATH.'wp-includes/version.php';
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
$updateSched = wp_get_schedule( 'wp_version_check' );
// Check when the last update was
if( $updateSched == 'hourly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
} elseif( $updateSched == 'twicedaily' ) {
$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
} elseif( $updateSched == 'daily' ) {
$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
} elseif( $updateSched == 'weekly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 week', time() ) );
} elseif( $updateSched == 'monthly' ) {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
} else {
$lastday = date( 'YmdHi', strtotime( '-1 month', time() ) );
}
// Check manual or automatic
$update_time = wp_next_scheduled( 'wp_version_check' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
if( $fileDate >= $lastday ) {
// Update info
if( $fileDate > $range_start && $fileDate < $range_end ) {
$status = __( 'Automatic', 'companion-auto-update' );
} else {
$status = __( 'Manual', 'companion-auto-update' );
}
cau_updatePluginInformation( 'core', $status );
$totalNum++;
}
// If there have been plugin updates run hook
if( $totalNum > 0 ) {
do_action( 'cau_after_core_update' );
}
}
// Check if automatic updating is disabled globally
function checkAutomaticUpdaterDisabled() {
// I mean, I know this can be done waaaay better but I's quite late and I need to push a fix so take it or leave it untill I decide to fix this :)
if ( defined( 'automatic_updater_disabled' ) ) {
if( doing_filter( 'automatic_updater_disabled' ) ) {
return true;
} elseif( constant( 'automatic_updater_disabled' ) == 'true' ) {
return true;
} elseif( constant( 'automatic_updater_disabled' ) == 'minor' ) {
return true;
} else {
return false;
}
} else if ( defined( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
if( doing_filter( 'AUTOMATIC_UPDATER_DISABLED' ) ) {
return true;
} elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'true' ) {
return true;
} elseif( constant( 'AUTOMATIC_UPDATER_DISABLED' ) == 'minor' ) {
return true;
} else {
return false;
}
} else {
return false;
}
}
// Check if cronjobs are disabled
function checkCronjobsDisabled() {
if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) {
return true;
} else {
return false;
}
}
// Menu location
function cau_menloc( $after = '' ) {
return 'tools.php'.$after;
}
function cau_url( $tab = '' ) {
return admin_url( cau_menloc( '?page=cau-settings&tab='.$tab ) );
}
// Get the active tab
function active_tab( $page, $identifier = 'tab' ) {
echo _active_tab( $page, $identifier );
}
function _active_tab( $page, $identifier = 'tab' ) {
if( !isset( $_GET[ $identifier ] ) ) {
$cur_page = '';
} else {
$cur_page = $_GET[ $identifier ];
}
if( $page == $cur_page ) {
return 'nav-tab-active';
}
}
// Get the active subtab
function active_subtab( $page, $identifier = 'tab' ) {
if( !isset( $_GET[ $identifier ] ) ) {
$cur_page = '';
} else {
$cur_page = $_GET[ $identifier ];
}
if( $page == $cur_page ) {
echo 'current';
}
}
// List of plugins that should not be updated
function donotupdatelist( $filter = 'plugins' ) {
// Select correct database row
switch ( $filter ) {
case 'themes':
$db_table = 'notUpdateListTh';
break;
case 'plugins':
$db_table = 'notUpdateList';
break;
default:
$db_table = 'notUpdateList';
break;
}
// Create list
global $wpdb;
$table_name = $wpdb->prefix."auto_updates";
$config = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE name = '{$db_table}'");
$list = $config[0]->onoroff;
$list = explode( ", ", $list );
$returnList = array();
foreach ( $list as $key ) array_push( $returnList, $key );
return $returnList;
}
function plugins_donotupdatelist() {
// Base array
$array = array();
// Filtered plugins
$filteredplugins = donotupdatelist( 'plugins' );
foreach ( $filteredplugins as $filteredplugin ) array_push( $array, $filteredplugin );
// Plugin added to the delay list
$delayedplugins = cau_delayed_updates__formated();
foreach ( $delayedplugins as $delayedplugin ) array_push( $array, $delayedplugin );
// Return array
return $array;
}
function themes_donotupdatelist() {
return donotupdatelist( 'themes' );
}
// Show the update log
function cau_fetch_log( $limit, $format = 'simple' ) {
// Database
global $wpdb;
$updateLog = "update_log";
$updateLogDB = $wpdb->prefix.$updateLog;
// Filter log
if( isset( $_GET['filter'] ) ) {
$filter = $_GET['filter'];
} else {
$filter = 'all';
}
switch( $filter ) {
case 'plugins':
$plugins = true;
$themes = false;
$core = false;
$translations = false;
break;
case 'themes':
$plugins = false;
$themes = true;
$core = false;
$translations = false;
break;
case 'translations':
$plugins = false;
$themes = false;
$core = false;
$translations = true;
break;
default:
$plugins = true;
$themes = true;
$core = true;
$translations = false;
break;
}
// Create arrays
$pluginNames = array();
$pluginVersion = array();
$pluginDates = array();
$pluginDatesF = array();
$plugslug = array();
$type = array();
$method = array();
// Date format
$dateFormat = get_option( 'date_format' );
// PLUGINS
if( $plugins ) {
// Where to look for plugins
$plugdir = plugin_dir_path( __DIR__ );
$allPlugins = get_plugins();
// Loop trough all plugins
foreach ( $allPlugins as $key => $value) {
// Get plugin data
$fullPath = $plugdir.'/'.$key;
$getFile = $path_parts = pathinfo( $fullPath );
$pluginData = get_plugin_data( $fullPath );
$pluginSlug = explode( "/", plugin_basename( $key ) );
$pluginSlug = $pluginSlug[0];
array_push( $plugslug , $pluginSlug );
// Automatic or Manual (non-db-version)
$date_tod = date ( 'ydm' );
$fileDay = date ( 'ydm', filemtime( $fullPath ) );
$fileTime = date ( 'Hi', filemtime( $fullPath ) );
$updateSched = wp_next_scheduled( 'wp_update_plugins' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
if( $date_tod == $fileDay ) {
if( $fileTime > $range_start && $fileTime < $range_end ) {
$status = __( 'Automatic', 'companion-auto-update' );
} else {
$status = __( 'Manual', 'companion-auto-update' );
}
array_push( $method , $status );
} else {
// Get info from database
if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
array_push( $method , cau_get_plugininfo( $key, 'method' ) );
} else {
array_push( $method , '-' );
}
}
// Get plugin name
foreach ( $pluginData as $dataKey => $dataValue ) {
if( $dataKey == 'Name') {
array_push( $pluginNames , $dataValue );
}
if( $dataKey == 'Version') {
array_push( $pluginVersion , $dataValue );
}
}
// Get last update date
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
if( $format == 'table' ) {
$fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
$fileDateF .= ' &dash; '.date( 'H:i', filemtime( $fullPath ) );
} else {
$fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
}
array_push( $pluginDates, $fileDate );
array_push( $pluginDatesF, $fileDateF );
array_push( $type, 'Plugin' );
}
}
// THEMES
if( $themes ) {
// Where to look for themes
$themedir = get_theme_root();
$allThemes = wp_get_themes();
// Loop trough all themes
foreach ( $allThemes as $key => $value) {
// Get theme data
$fullPath = $themedir.'/'.$key;
$getFile = $path_parts = pathinfo( $fullPath );
// Get theme name
$theme_data = wp_get_theme( $path_parts['filename'] );
$themeName = $theme_data->get( 'Name' );
$themeVersion = $theme_data->get( 'Version' );
array_push( $pluginNames , $themeName );
array_push( $pluginVersion , $themeVersion );
// Automatic or Manual (non-db-version)
$date_tod = date ( 'ydm' );
$fileDay = date ( 'ydm', filemtime( $fullPath ) );
$fileTime = date ( 'Hi', filemtime( $fullPath ) );
$updateSched = wp_next_scheduled( 'wp_update_themes' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $updateSched ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $updateSched ) );
if( $date_tod == $fileDay ) {
if( $fileTime > $range_start && $fileTime < $range_end ) {
$status = __( 'Automatic', 'companion-auto-update' );
} else {
$status = __( 'Manual', 'companion-auto-update' );
}
array_push( $method , $status );
} else {
// Get info from database
if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
array_push( $method , cau_get_plugininfo( $key, 'method' ) );
} else {
array_push( $method , '-' );
}
}
// Get last update date
$fileDate = date( 'YmdHi', filemtime( $fullPath ) );
if( $format == 'table' ) {
$fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
$fileDateF .= ' &dash; '.date ( 'H:i', filemtime( $fullPath ) );
} else {
$fileDateF = date_i18n( $dateFormat, filemtime( $fullPath ) );
}
array_push( $pluginDates, $fileDate );
array_push( $pluginDatesF, $fileDateF );
array_push( $type, 'Theme' );
array_push( $plugslug , '' );
}
}
// TRANSLATIONS
if( $translations ) {
// There is no way (at this time) to check if someone changed this link, so therefore it won't work when it's changed, sorry
$transFolder = get_home_path().'wp-content/languages';
if( file_exists( $transFolder ) ) {
$allThemTranslations = array();
$allThemTypes = array();
$pt = __( 'Plugin translations', 'companion-auto-update' );
$tt = __( 'Theme translations', 'companion-auto-update' );
$ct = __( 'Core translations', 'companion-auto-update' );
// Plugin translations
$files = glob( $transFolder.'/plugins/*.{mo}', GLOB_BRACE );
foreach( $files as $file ) {
array_push( $allThemTranslations, $file );
array_push( $allThemTypes, $pt );
}
// Theme translations
$files = glob( $transFolder.'/themes/*.{mo}', GLOB_BRACE );
foreach( $files as $file ) {
array_push( $allThemTranslations, $file );
array_push( $allThemTypes, $tt );
}
// Core translations
$files = glob( $transFolder.'/*.{mo}', GLOB_BRACE );
foreach( $files as $file ) {
array_push( $allThemTranslations, $file );
array_push( $allThemTypes, $ct );
}
foreach( $allThemTranslations as $key => $trans_file ) {
$transDate = date( 'YmdHi', filemtime( $trans_file ) );
if( $format == 'table' ) {
$transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
$transDateF .= ' &dash; '.date ( 'H:i', filemtime( $trans_file ) );
} else {
$transDateF = date_i18n( $dateFormat, filemtime( $trans_file ) );
}
$trans_name = basename( $trans_file );
$trans_name = str_replace( "-", " ", $trans_name );
$trans_name = str_replace( ".mo", "", $trans_name );
$trans_name = str_replace( ".json", "", $trans_name );
$trans_lang = substr( $trans_name, strrpos( $trans_name, " " ) + 1 );
$trans_name = str_replace( $trans_lang, "", $trans_name );
$trans_lang = substr( $trans_lang, strrpos( $trans_lang, "_" ) + 1 );
// Push
array_push( $pluginNames, ucfirst( $trans_name ).': '.$trans_lang );
array_push( $type, $allThemTypes[$key] );
array_push( $pluginVersion, '-' );
array_push( $pluginDates, $transDate );
array_push( $pluginDatesF, $transDateF );
array_push( $plugslug , '' );
array_push( $method , '-' );
}
} else {
$transDate = date('YmdHi');
$transDateF = 'Could not read translations date.';
array_push( $pluginNames, 'Translations' );
array_push( $type, $trans_type.' translations' );
array_push( $pluginVersion, '-' );
array_push( $pluginDates, $transDate );
array_push( $pluginDatesF, $transDateF );
array_push( $plugslug , '' );
// Get info from database
array_push( $method , '-' );
}
}
// CORE
if( $core ) {
$coreFile = ABSPATH.'wp-includes/version.php';
$updateSched = wp_next_scheduled( 'wp_version_check' );
if( file_exists( $coreFile ) ) {
$coreDate = date( 'YmdHi', filemtime( $coreFile ) );
if( $format == 'table' ) {
$coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
$coreDateF .= ' &dash; '.date ( 'H:i', filemtime( $coreFile ) );
} else {
$coreDateF = date_i18n( $dateFormat, filemtime( $coreFile ) );
}
// Automatic or Manual (non-db-version)
$date_tod = date ( 'ydm' );
$fileDay = date ( 'ydm', filemtime( $coreFile ) );
$fileTime = date ( 'Hi', filemtime( $coreFile ) );
$update_time = wp_next_scheduled( 'wp_version_check' );
$range_start = date( 'Hi', strtotime( '-30 minutes', $update_time ) );
$range_end = date( 'Hi', strtotime( '+30 minutes', $update_time ) );
if( $date_tod == $fileDay ) {
if( $fileTime > $range_start && $fileTime < $range_end ) {
$methodVal = __( 'Automatic', 'companion-auto-update' );
} else {
$methodVal = __( 'Manual', 'companion-auto-update' );
}
} else {
// Get info from database
if( cau_check_if_exists( $key, 'slug', $updateLog ) ) {
$methodVal = cau_get_plugininfo( 'core', 'method' );
} else {
$methodVal = '';
}
}
} else {
$coreDate = date('YmdHi');
$coreDateF = 'Could not read core date.';
}
array_push( $pluginNames, 'WordPress' );
array_push( $type, 'WordPress' );
array_push( $pluginVersion, get_bloginfo( 'version' ) );
array_push( $pluginDates, $coreDate );
array_push( $pluginDatesF, $coreDateF );
array_push( $plugslug , '' );
// Get info from database
array_push( $method , $methodVal );
}
// Sort array by date
arsort( $pluginDates );
if( $limit == 'all' ) {
$limit = 999;
}
$listClasses = 'wp-list-table widefat autoupdate autoupdatelog';
if( $format == 'table' ) {
$listClasses .= ' autoupdatelog striped';
} else {
$listClasses .= ' autoupdatewidget';
}
echo '<table class="'.$listClasses.'">';
// Show the last updated plugins
if( $format == 'table' ) {
echo '<thead>
<tr>
<th><strong>'.__( 'Name', 'companion-auto-update' ).'</strong></th>';
if( !$translations ) echo '<th><strong>'.__( 'To version', 'companion-auto-update' ).'</strong></th>';
echo '<th><strong>'.__( 'Type', 'companion-auto-update' ).'</strong></th>
<th><strong>'.__( 'Last updated on', 'companion-auto-update' ).'</strong></th>
<th><strong>'.__( 'Update method', 'companion-auto-update' ).'</strong></th>
</tr>
</thead>';
}
echo '<tbody id="the-list">';
$loopings = 0;
foreach ( $pluginDates as $key => $value ) {
if( $loopings < $limit ) {
echo '<tr>';
if( $format == 'table' ) {
$pluginName = $pluginNames[$key];
} else {
$pluginName = substr( $pluginNames[$key], 0, 25);
if( strlen( $pluginNames[$key] ) > 25 ) {
$pluginName .= '...';
}
}
echo '<td class="column-updatetitle"><p><strong title="'. $pluginNames[$key] .'">'.cau_getChangelogUrl( $type[$key], $pluginNames[$key], $plugslug[$key] ).'</strong></p></td>';
if( $format == 'table' ) {
if( $type[$key] == 'Plugin' ) {
$thisType = __( 'Plugin', 'companion-auto-update' );
} else if( $type[$key] == 'Theme' ) {
$thisType = __( 'Theme', 'companion-auto-update' );
} else {
$thisType = $type[$key];
}
if( !$translations ) echo '<td class="cau_hide_on_mobile column-version" style="min-width: 100px;"><p>'. $pluginVersion[$key] .'</p></td>';
echo '<td class="cau_hide_on_mobile column-description"><p>'. $thisType .'</p></td>';
}
echo '<td class="column-date" style="min-width: 100px;"><p>'. $pluginDatesF[$key] .'</p></td>';
if( $format == 'table' ) {
echo '<td class="column-method"><p>'. $method[$key] .'</p></td>';
}
echo '</tr>';
$loopings++;
}
}
echo "</tbody></table>";
}
// Get the proper changelog URL
function cau_getChangelogUrl( $type, $name, $plugslug ) {
switch( $type ) {
case 'WordPress':
$url = '';
break;
case 'Plugin':
$url = admin_url( 'plugin-install.php?tab=plugin-information&plugin='.$plugslug.'&section=changelog&TB_iframe=true&width=772&height=772' );
break;
case 'Theme':
$url = '';
break;
}
if( !empty( $url ) ) {
return '<a href="'.$url.'" class="thickbox open-plugin-details-modal" aria-label="More information about '.$name.'" data-title="'.$name.'">'.$name.'</a>';
} else {
return $name;
}
}
// Only update plugins which are enabled
function cau_dontUpdatePlugins( $update, $item ) {
$plugins = plugins_donotupdatelist();
if ( in_array( $item->slug, $plugins ) ) {
return false; // Don't update these plugins
} else {
return true; // Always update these plugins
}
}
function cau_dontUpdateThemes( $update, $item ) {
$themes = themes_donotupdatelist();
if ( in_array( $item->slug, $themes ) ) {
return false; // Don't update these themes
} else {
return true; // Always update these themes
}
}
// Get plugin information of repository
function cau_plugin_info( $slug, $what ) {
$slug = sanitize_title( $slug );
$cau_transient_name = 'cau' . $slug;
$cau_info = get_transient( $cau_transient_name );
if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
$cau_info = plugins_api( 'plugin_information', array( 'slug' => $slug ) );
if ( ! $cau_info or is_wp_error( $cau_info ) ) {
return false;
}
set_transient( $cau_transient_name, $cau_info, 3600 );
switch ( $what ) {
case 'versions':
return $cau_info->versions;
break;
case 'version':
return $cau_info->version;
break;
case 'name':
return $cau_info->name;
break;
case 'slug':
return $cau_info->slug;
break;
}
}
// Get list of outdated plugins
function cau_list_outdated() {
$outdatedList = array();
foreach ( get_plugins() as $key => $value) {
$slug = $key;
$explosion = explode( '/', $slug );
$actualSlug = array_shift( $explosion );
// Get plugin name
foreach ( $value as $k => $v ) if( $k == "Name" ) $name = $v;
// Get plugins tested up to version
if( !function_exists( 'plugins_api' ) ) require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
$api = plugins_api( 'plugin_information', array( 'slug' => wp_unslash( $actualSlug ) ) );
// Version compare
$tested_version = substr( $api->tested, 0, 3 ); // Format version number
$current_version = substr( get_bloginfo( 'version' ), 0, 3 ); // Format version number
$version_difference = ($current_version - $tested_version); // Get the difference
// $tested_wp = ( empty( $api->tested ) || cau_version_compare( get_bloginfo( 'version' ), $api->tested, '<' ) );
if( $version_difference >= '0.3' ) {
$outdatedList[$name] = substr( $api->tested, 0, 3 );
}
}
return $outdatedList;
}
// Better version compare
function cau_version_compare( $ver1, $ver2, $operator = null ) {
$p = '#(\.0+)+($|-)#';
$ver1 = preg_replace( $p, '', $ver1 );
$ver2 = preg_replace( $p, '', $ver2 );
return isset( $operator ) ? version_compare( $ver1, $ver2, $operator ) : version_compare( $ver1, $ver2 );
}
// Get plugin information of currently installed plugins
function cau_active_plugin_info( $slug, $what ) {
$allPlugins = get_plugins();
foreach ($allPlugins as $key => $value) {
$thisSlug = explode('/', $key);
$thisSlugE = $thisSlug[0];
if( $thisSlug == $slug ) {
if( $what == 'version' ) return $value['Version'];
}
}
}
// Remove update nag when major updates are disabled
function cau_hideUpdateNag() {
if( cau_get_db_value( 'major' ) != 'on' ) {
remove_action( 'admin_notices', 'update_nag', 3 );
remove_action( 'network_admin_notices', 'maintenance_nag', 10 );
}
}
add_action( 'admin_head', 'cau_hideUpdateNag', 100 );
// Add more intervals to event schedules
function cau_addMoreIntervals( $schedules ) {
// Add a weekly interval.
$schedules['weekly'] = array(
'interval' => 604800,
'display' => __( 'Once Weekly', 'companion-auto-update' ),
);
// Add a twice montly interval.
$schedules['twice_monthly'] = array(
'interval' => 1317600,
'display' => __( 'Twice a month', 'companion-auto-update' ),
);
// Add a montly interval.
$schedules['once_monthly'] = array(
'interval' => 2635200,
'display' => __( 'Once a month', 'companion-auto-update' ),
);
return $schedules;
}
add_filter( 'cron_schedules', 'cau_addMoreIntervals' );
// Get only unique schedules
function cau_wp_get_schedules() {
// Start variables
$availableIntervals = wp_get_schedules();
$array_unique = array();
$intervalTimes = array();
$intervalNames = array();
$intervalUniques = array();
$counter = 0;
// Get all intervals
foreach ( $availableIntervals as $key => $value ) {
// Do a bunch of checks to format them the right way
foreach ( $value as $display => $interval ) {
if( $display == 'display' ) {
$intervalNames[$counter] = $interval; // Add the display name (i.e. "Once a month" or "Once Daily")
$counter++; // Make sure the next interval gets a new "key" value
} else {
if( $interval == '86400' ) $key = 'daily'; // Force the daily interval to be called daily, requires by a bunch of handles of this plugin
$intervalTimes[$counter] = $key; // Add the backend name (i.e. "once_monthly" or "daily")
$intervalUniques[$counter] = $interval; // Add the unix timestamp of this interval, used to identify unique items
}
}
}
// Prevent duplicates
foreach ( array_unique( $intervalUniques ) as $key => $value ) {
// $value is the timestamp
// $intervalTimes[$key] is the backend name
// $intervalNames[$key] is the display name
$array_unique[$intervalTimes[$key]] = $intervalNames[$key];
}
// Return the array
return $array_unique;
}
// Check if the update log db is empty
function cau_updateLogDBisEmpty() {
global $wpdb;
$updateDB = "update_log";
$updateLog = $wpdb->prefix.$updateDB;
$row_count = $wpdb->get_var( "SELECT COUNT(*) FROM $updateLog" );
if( $row_count > 0 ) {
return false;
} else {
return true;
}
}
// Plugin information to DB
function cau_savePluginInformation( $method = 'New' ) {
global $wpdb;
$updateDB = "update_log";
$updateLog = $wpdb->prefix.$updateDB;
$allPlugins = get_plugins();
$allThemes = wp_get_themes();
// Loop trough all themes
foreach ( $allThemes as $key => $value ) {
if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
}
// Loop trough all plugins
foreach ( $allPlugins as $key => $value ) {
if( !cau_check_if_exists( $key, 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => $key, 'oldVersion' => '-', 'method' => $method ) );
}
// Core
if( !cau_check_if_exists( 'core', 'slug', $updateDB ) ) $wpdb->insert( $updateLog, array( 'slug' => 'core', 'oldVersion' => '-', 'method' => $method ) );
}
function cau_updatePluginInformation( $slug, $method = '-', $newVersion = '-' ) {
global $wpdb;
$updateDB = "update_log";
$updateLog = $wpdb->prefix.$updateDB;
$wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET newVersion = '%s', method = %s WHERE slug = '%s'", $newVersion, $method, $slug ) );
}
function cau_siteHealthSignature() {
return '<p style="font-size: 12px; color: #707070;">'.__( 'This was reported by the Companion Auto Update plugin', 'companion-auto-update' ).'</p>';
}
function cau_add_siteHealthTest( $tests ) {
$tests['direct']['cau_disabled'] = array( 'label' => __( 'Companion Auto Update', 'companion-auto-update' ), 'test' => 'cau_disabled_test' );
return $tests;
}
add_filter( 'site_status_tests', 'cau_add_siteHealthTest' );
function cau_disabled_test() {
$result = array(
'label' => __( 'Auto updating is enabled', 'companion-auto-update' ),
'status' => 'good',
'badge' => array(
'label' => __( 'Security' ),
'color' => 'blue',
),
'description' => sprintf( '<p>%s</p>', __( "Automatic updating isn't disabled on this site.", 'companion-auto-update' ) ),
'actions' => '',
'test' => 'cau_disabled',
);
if ( checkAutomaticUpdaterDisabled() OR !has_filter( 'wp_version_check', 'wp_version_check' ) ) {
$result['status'] = 'critical';
$result['label'] = __( 'Auto updating is disabled', 'companion-auto-update' );
$result['description'] = __( 'Automatic updating is disabled on this site by either WordPress, another plugin or your webhost.', 'companion-auto-update' );
$result['description'] .= ' '.__( 'For more information about this error check the status page.', 'companion-auto-update' );
$result['actions'] .= sprintf( '<p><a href="%s">%s</a>', esc_url( cau_url( 'status' ) ), __( 'Check the status page', 'companion-auto-update' ) );
}
$result['actions'] .= cau_siteHealthSignature();
return $result;
}
// Check for version control
function cau_test_is_vcs_checkout( $context ) {
$context_dirs = array( ABSPATH );
$vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
$check_dirs = array();
$result = array();
foreach ( $context_dirs as $context_dir ) {
// Walk up from $context_dir to the root.
do {
$check_dirs[] = $context_dir;
// Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
if ( $context_dir == dirname( $context_dir ) )
break;
// Continue one level at a time.
} while ( $context_dir = dirname( $context_dir ) );
}
$check_dirs = array_unique( $check_dirs );
// Search all directories we've found for evidence of version control.
foreach ( $vcs_dirs as $vcs_dir ) {
foreach ( $check_dirs as $check_dir ) {
if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
break 2;
}
}
}
if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, $context ) ) {
$result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s), but the %s filter is allowing updates' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>automatic_updates_is_vcs_checkout</code>" );
$result['icon'] = 'warning';
$result['status'] = 'info';
} else if ( $checkout ) {
$result['description'] = sprintf( __( 'The folder %s was detected as being under version control (%s)' , 'companion-auto-update' ), "<code>$check_dir</code>", "<code>$vcs_dir</code>" );
$result['icon'] = 'no';
$result['status'] = 'disabled';
} else {
$result['description'] = __( 'No issues detected' , 'companion-auto-update' );
$result['icon'] = 'yes-alt';
$result['status'] = 'enabled';
}
return $result;
}
// Check if plugins need to be delayed
function cau_check_delayed() {
if( cau_get_db_value( 'update_delay' ) == 'on' ) {
cau_hold_updates();
cau_unhold_updates();
} else {
cau_unhold_all_updates();
}
}
// List of all delayed plugins
function cau_delayed_updates() {
global $wpdb;
$plugin_list = array();
$updateLog = $wpdb->prefix."update_log";
$put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
foreach ( $put_on_hold as $plugin ) {
array_push( $plugin_list, $plugin->slug );
}
return $plugin_list;
}
// List of all delayed plugins for the update function
function cau_delayed_updates__formated() {
$plugin_list = array();
foreach ( cau_delayed_updates() as $plugin ) {
$explosion = explode( '/', $plugin );
$short_slug = array_shift( $explosion );
array_push( $plugin_list, $short_slug );
}
return $plugin_list;
}
// Add "put on hold" timestamp to the database if it hasn't been set yet
function cau_hold_updates() {
require_once( ABSPATH.'wp-admin/includes/plugin-install.php' );
$plugins = get_plugin_updates();
if ( !empty( $plugins ) ) {
$list = array();
foreach ( (array)$plugins as $plugin_file => $plugin_data ) {
if( !in_array( $plugin_file, cau_delayed_updates() ) ) {
global $wpdb;
$updateDB = "update_log";
$updateLog = $wpdb->prefix.$updateDB;
$wpdb->query( $wpdb->prepare( "UPDATE $updateLog SET put_on_hold = '%s' WHERE slug = '%s'", strtotime( "now" ), $plugin_file ) );
}
}
}
}
// Remove plugins from "put on hold" after x days
function cau_unhold_updates() {
if( cau_get_db_value( 'update_delay_days' ) != '' ) {
$after_x_days = cau_get_db_value( 'update_delay_days' );
} else {
$after_x_days = '2';
}
global $wpdb;
$today = strtotime( "now" );
$updateLog = $wpdb->prefix."update_log";
$put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
foreach ( $put_on_hold as $plugin ) {
$plugin_file = $plugin->slug;
$put_on_hold_date = $plugin->put_on_hold;
$remove_after = strtotime( '+'.$after_x_days.' days', $put_on_hold_date );
if( $remove_after <= $today ) {
$wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
}
}
}
// Remove all plugins from "put on hold" if option is disabled
function cau_unhold_all_updates() {
global $wpdb;
$updateLog = $wpdb->prefix."update_log";
$put_on_hold = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$updateLog} WHERE put_on_hold <> '%s'", '0' ) );
foreach ( $put_on_hold as $plugin ) {
$plugin_file = $plugin->slug;
$wpdb->query( $wpdb->prepare( "UPDATE {$updateLog} SET put_on_hold = '%s' WHERE slug = '%s'", '0', $plugin_file ) );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment