469 lines
14 KiB
PHP
469 lines
14 KiB
PHP
|
<?php
|
||
|
|
||
|
// Check if emails should be send or not
|
||
|
function cau_check_updates_mail() {
|
||
|
|
||
|
if( cau_get_db_value( 'send' ) == 'on' ) {
|
||
|
cau_list_theme_updates(); // Check for theme updates
|
||
|
cau_list_plugin_updates(); // Check for plugin updates
|
||
|
}
|
||
|
|
||
|
if( cau_get_db_value( 'sendupdate' ) == 'on' && cau_get_db_value( 'plugins' ) == 'on' ) cau_plugin_updated(); // Check for updated plugins
|
||
|
|
||
|
if( cau_get_db_value( 'sendoutdated' ) == 'on' ) cau_list_outdated_software(); // Check for oudated plugins
|
||
|
}
|
||
|
|
||
|
// Ge the emailadresses it should be send to
|
||
|
function cau_set_email() {
|
||
|
|
||
|
$emailArray = array();
|
||
|
|
||
|
if( cau_get_db_value( 'email' ) == '' ) {
|
||
|
array_push( $emailArray, get_option('admin_email') );
|
||
|
} else {
|
||
|
$emailAdresses = cau_get_db_value( 'email' );
|
||
|
$list = explode( ", ", $emailAdresses );
|
||
|
foreach ( $list as $key ) {
|
||
|
array_push( $emailArray, $list );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $emailArray;
|
||
|
|
||
|
}
|
||
|
// Mail format
|
||
|
function cau_is_html() {
|
||
|
|
||
|
// Check if cau_get_db_value() function exists.
|
||
|
if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
|
||
|
|
||
|
// Check if html
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
$html = true;
|
||
|
} else {
|
||
|
$html = false;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Set the content for the emails about pending updates
|
||
|
function cau_outdated_message( $single, $plural, $list ) {
|
||
|
|
||
|
// WP version
|
||
|
$wpversion = get_bloginfo( 'version' );
|
||
|
|
||
|
// Base text
|
||
|
$text = sprintf( esc_html__( "You have %s on your WordPress site at %s that have not been tested with the latest 3 major releases of WordPress.", "companion-auto-update" ), $plural, get_site_url() );
|
||
|
$text .= "\n";
|
||
|
$text .= "\n";
|
||
|
|
||
|
// The list
|
||
|
if( !empty( $list ) ) {
|
||
|
|
||
|
$text .= sprintf( esc_html__( "The following %s have not been tested with WordPress %s:", "companion-auto-update" ), $plural, $wpversion );
|
||
|
$text .= "\n";
|
||
|
$text .= "\n";
|
||
|
|
||
|
foreach ( $list as $plugin => $version ) {
|
||
|
$text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return $text;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Set the content for the emails about pending updates
|
||
|
function cau_pending_message( $single, $plural, $list ) {
|
||
|
|
||
|
// What markup to use
|
||
|
if( cau_is_html() ) $break = '<br />';
|
||
|
else $break = "\n";
|
||
|
|
||
|
// Base text
|
||
|
$text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
|
||
|
$text .= $break;
|
||
|
|
||
|
if( !empty( $list ) ) {
|
||
|
|
||
|
$text .= $break;
|
||
|
$text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
|
||
|
$text .= $break;
|
||
|
|
||
|
if( cau_is_html() ) $text .= "<ol>";
|
||
|
foreach ( $list as $key => $value ) {
|
||
|
if( cau_is_html() ) {
|
||
|
$text .= "<li>$value</li>";
|
||
|
} else {
|
||
|
$text .= "-$value\n";
|
||
|
}
|
||
|
}
|
||
|
if( cau_is_html() ) $text .= "</ol>";
|
||
|
|
||
|
$text .= $break;
|
||
|
}
|
||
|
|
||
|
$text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
|
||
|
$text .= $break;
|
||
|
|
||
|
// End
|
||
|
$text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' );
|
||
|
|
||
|
return $text;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Set the content for the emails about recent updates
|
||
|
function cau_updated_message( $type, $updatedList ) {
|
||
|
|
||
|
// What markup to use
|
||
|
if( cau_is_html() ) $break = '<br />';
|
||
|
else $break = "\n";
|
||
|
|
||
|
// The message
|
||
|
$text = sprintf( esc_html__(
|
||
|
'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part.
|
||
|
For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
|
||
|
), $type, get_site_url() );
|
||
|
|
||
|
$text .= $break;
|
||
|
$text .= $break;
|
||
|
$text .= sprintf( esc_html__(
|
||
|
'The following %1$s have been updated:', 'companion-auto-update'
|
||
|
), $type );
|
||
|
|
||
|
$text .= $break;
|
||
|
$text .= $updatedList;
|
||
|
|
||
|
$text .= $break;
|
||
|
$text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update" );
|
||
|
|
||
|
return $text;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Checks if plugins are out of date
|
||
|
function cau_list_outdated_software() {
|
||
|
|
||
|
// Check if cau_get_db_value() function exists.
|
||
|
if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
|
||
|
|
||
|
// Set up mail
|
||
|
$subject = '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
|
||
|
$type = __( 'plugin', 'companion-auto-update' );
|
||
|
$type_plural = __( 'plugins', 'companion-auto-update' );
|
||
|
$message = cau_outdated_message( $type, $type_plural, cau_list_outdated() );
|
||
|
|
||
|
// Send to all addresses
|
||
|
foreach ( cau_set_email() as $key => $value ) {
|
||
|
foreach ( $value as $k => $v ) {
|
||
|
wp_mail( $v, $subject, $message );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Checks if theme updates are available
|
||
|
function cau_list_theme_updates() {
|
||
|
|
||
|
global $wpdb;
|
||
|
$table_name = $wpdb->prefix . "auto_updates";
|
||
|
|
||
|
$configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
|
||
|
foreach ( $configs as $config ) {
|
||
|
|
||
|
if( $config->onoroff != 'on' ) {
|
||
|
|
||
|
require_once ABSPATH . '/wp-admin/includes/update.php';
|
||
|
$themes = get_theme_updates();
|
||
|
$list = array();
|
||
|
|
||
|
if ( !empty( $themes ) ) {
|
||
|
|
||
|
foreach ( $themes as $stylesheet => $theme ) {
|
||
|
array_push( $list, $theme->get( 'Name' ) );
|
||
|
}
|
||
|
|
||
|
$subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
|
||
|
$type = __('theme', 'companion-auto-update');
|
||
|
$type_plural = __('themes', 'companion-auto-update');
|
||
|
$message = cau_pending_message( $type, $type_plural, $list );
|
||
|
|
||
|
foreach ( cau_set_email() as $key => $value) {
|
||
|
foreach ($value as $k => $v) {
|
||
|
wp_mail( $v, $subject, $message );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Checks if plugin updates are available
|
||
|
function cau_list_plugin_updates() {
|
||
|
|
||
|
global $wpdb;
|
||
|
$table_name = $wpdb->prefix . "auto_updates";
|
||
|
|
||
|
$configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
|
||
|
foreach ( $configs as $config ) {
|
||
|
|
||
|
if( $config->onoroff != 'on' ) {
|
||
|
|
||
|
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 ) {
|
||
|
$plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
|
||
|
$name = $plugin_data->Name;
|
||
|
array_push( $list, $name );
|
||
|
}
|
||
|
|
||
|
$subject = '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
|
||
|
$type = __( 'plugin', 'companion-auto-update' );
|
||
|
$type_plural = __( 'plugins', 'companion-auto-update' );
|
||
|
$message = cau_pending_message( $type, $type_plural, $list );
|
||
|
|
||
|
foreach ( cau_set_email() as $key => $value) {
|
||
|
foreach ($value as $k => $v) {
|
||
|
wp_mail( $v, $subject, $message );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Alerts when plugin has been updated
|
||
|
function cau_plugin_updated() {
|
||
|
|
||
|
// Check if cau_get_db_value() function exists.
|
||
|
if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
|
||
|
|
||
|
// Set the correct timezone for emails
|
||
|
date_default_timezone_set( cau_get_proper_timezone() );
|
||
|
|
||
|
// Create arrays
|
||
|
$pluginNames = array();
|
||
|
$pluginDates = array();
|
||
|
$pluginVersion = array();
|
||
|
$pluginSlug = array();
|
||
|
$pluginTimes = array();
|
||
|
$themeNames = array();
|
||
|
$themeDates = array();
|
||
|
$themeTimes = array();
|
||
|
|
||
|
// Where to look for plugins
|
||
|
$plugdir = plugin_dir_path( __DIR__ );
|
||
|
if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // Check if get_plugins() function exists.
|
||
|
$allPlugins = get_plugins();
|
||
|
|
||
|
// Where to look for themes
|
||
|
$themedir = get_theme_root();
|
||
|
$allThemes = wp_get_themes();
|
||
|
|
||
|
// Mail schedule
|
||
|
$schedule_mail = wp_get_schedule( 'cau_set_schedule_mail' );
|
||
|
|
||
|
// 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 );
|
||
|
|
||
|
// Get the slug
|
||
|
$explosion = explode( '/', $key );
|
||
|
$actualSlug = array_shift( $explosion );
|
||
|
|
||
|
// Get last update date
|
||
|
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
|
||
|
|
||
|
switch ( $schedule_mail ) {
|
||
|
case 'hourly':
|
||
|
$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
|
||
|
break;
|
||
|
case 'twicedaily':
|
||
|
$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
|
||
|
break;
|
||
|
default:
|
||
|
$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$dateFormat = get_option( 'date_format' );
|
||
|
$timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
|
||
|
$timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
|
||
|
|
||
|
if( $fileDate >= $lastday ) {
|
||
|
|
||
|
// Get plugin name
|
||
|
foreach ( $pluginData as $dataKey => $dataValue ) {
|
||
|
if( $dataKey == 'Name') {
|
||
|
array_push( $pluginNames , $dataValue );
|
||
|
}
|
||
|
if( $dataKey == 'Version') {
|
||
|
array_push( $pluginVersion , $dataValue );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
array_push( $pluginDates, $fileDate );
|
||
|
array_push( $pluginSlug, $actualSlug );
|
||
|
array_push( $pluginTimes, $timestamp );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Loop trough all themes
|
||
|
foreach ( $allThemes as $key => $value ) {
|
||
|
|
||
|
// Get theme data
|
||
|
$fullPath = $themedir.'/'.$key;
|
||
|
$getFile = $path_parts = pathinfo( $fullPath );
|
||
|
|
||
|
// Get last update date
|
||
|
$dateFormat = get_option( 'date_format' );
|
||
|
$fileDate = date ( 'YmdHi', filemtime( $fullPath ) );
|
||
|
|
||
|
if( $schedule_mail == 'hourly' ) {
|
||
|
$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
|
||
|
} elseif( $schedule_mail == 'twicedaily' ) {
|
||
|
$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
|
||
|
} elseif( $schedule_mail == 'daily' ) {
|
||
|
$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
|
||
|
}
|
||
|
|
||
|
$dateFormat = get_option( 'date_format' );
|
||
|
$timestamp = date_i18n( $dateFormat, filemtime( $fullPath ) );
|
||
|
$timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
|
||
|
|
||
|
if( $fileDate >= $lastday ) {
|
||
|
array_push( $themeNames, $path_parts['filename'] );
|
||
|
array_push( $themeDates, $fileDate );
|
||
|
array_push( $themeTimes, $timestamp );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
$totalNumP = 0;
|
||
|
$totalNumT = 0;
|
||
|
$updatedListP = '';
|
||
|
$updatedListT = '';
|
||
|
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
$updatedListP .= '<ol>';
|
||
|
$updatedListT .= '<ol>';
|
||
|
}
|
||
|
|
||
|
foreach ( $pluginDates as $key => $value ) {
|
||
|
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
|
||
|
$more_info = '';
|
||
|
if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "<br /><span style='opacity: 0.5;'>".__( "Time of update", "companion-auto-update" ).": ".$pluginTimes[$key]."</span>";
|
||
|
|
||
|
$updatedListP .= "<li>
|
||
|
<strong>".$pluginNames[$key]." </strong><br />
|
||
|
".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]." <a href='https://wordpress.org/plugins/".$pluginSlug[$key]."/#developers'>".__( "Release notes", "companion-auto-update" )."</a>
|
||
|
".$more_info."
|
||
|
</li>";
|
||
|
|
||
|
} else {
|
||
|
|
||
|
$updatedListP .= "- ".$pluginNames[$key]." ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]."\n";
|
||
|
$updatedListP .= " ".__( "Release notes", "companion-auto-update" ).": https://wordpress.org/plugins/".$pluginSlug[$key]."/#developers\n";
|
||
|
|
||
|
}
|
||
|
|
||
|
$totalNumP++;
|
||
|
}
|
||
|
|
||
|
foreach ( $themeNames as $key => $value ) {
|
||
|
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
|
||
|
$more_info = '';
|
||
|
if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "<br /><span style='opacity: 0.5;'>".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key]."</span>";
|
||
|
$updatedListT .= "<li><strong>".$themeNames[$key]."</strong>".$more_info."</li>";
|
||
|
|
||
|
} else {
|
||
|
$updatedListT .= "- ".$themeNames[$key]."\n";
|
||
|
}
|
||
|
|
||
|
$totalNumT++;
|
||
|
}
|
||
|
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
$updatedListP .= '</ol>';
|
||
|
$updatedListT .= '</ol>';
|
||
|
}
|
||
|
|
||
|
// Set the email content type
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
|
||
|
function cau_mail_content_type() {
|
||
|
return 'text/html';
|
||
|
}
|
||
|
add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
|
||
|
}
|
||
|
|
||
|
// If plugins have been updated, send email
|
||
|
if( $totalNumP > 0 ) {
|
||
|
|
||
|
// E-mail content
|
||
|
$subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
|
||
|
$type = __('plugins', 'companion-auto-update');
|
||
|
$message = cau_updated_message( $type, $updatedListP );
|
||
|
|
||
|
// Send to all addresses
|
||
|
foreach ( cau_set_email() as $key => $value) {
|
||
|
foreach ($value as $k => $v) {
|
||
|
wp_mail( $v, $subject, $message );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// If themes have been updated, send email
|
||
|
if( $totalNumT > 0 ) {
|
||
|
|
||
|
// E-mail content
|
||
|
$subject = '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
|
||
|
$type = __('themes', 'companion-auto-update');
|
||
|
$message = cau_updated_message( $type, $updatedListT );
|
||
|
|
||
|
// Send to all addresses
|
||
|
foreach ( cau_set_email() as $key => $value) {
|
||
|
foreach ($value as $k => $v) {
|
||
|
wp_mail( $v, $subject, $message );
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
|
||
|
|
||
|
// Prevent duplicate emails by setting the event again
|
||
|
if( $totalNumT > 0 OR $totalNumP > 0 ) {
|
||
|
if( $schedule_mail == 'hourly' ) {
|
||
|
wp_clear_scheduled_hook('cau_set_schedule_mail');
|
||
|
wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|