WordPress version update reminder

So I have some Linux, Ubuntu, servers that are used for shared hosting. Many of the customers use WordPress and I think that it’s an awesome solution that so many can get a great website up and running in almost no time. The flaw with WordPress is that it has a lot of security holes if they don’t upgrade to the latest version. WordPress has a great update feature, but since my customers do not log in on their sites they don’t see that, so what to do. I decided that sending them an email would maybe encourage them a little, specifically the site admin.

I couldn’t find any good script that solved my problem so I decided to copy paste something that would do the trick.

Updated and locate are a good start for finding version.php.

I’ve put my files under /root/scripts/wp-version

run-wp.version-finder.sh looks like this:

updatedb
locate wp-includes/version.php | xargs grep "wp_version = " > /root/scripts/wp-version/tmp-version.txt
php /root/scripts/wp-version/wp-version.php

The wp-version.php script looks like this:

 /root/scripts/wp-version/tmp-version.txt

// curl_init and mysql is needed for this to work.
// apt-get install php5-intl

// Adminiadress, sends short summary.
$AdminAdress = "[email protected]";        // Change e-mail adress
$ServerName = "SERVER_NAME";
$Sender = "[email protected]";

$myFile = "/root/scripts/wp-version/tmp-version.txt";
$summary = "";

//check for latest WordPress version
$apiUrl = 'http://api.wordpress.org/core/version-check/1.6/';
$apiFile = 'cache/api.json';

// Verify that cache folder exist
if (!file_exists('cache')) {
    mkdir('cache', 0777, true);
}

if((is_file($apiFile) and filemtime($apiFile)< time()-3600) OR !is_file($apiFile)) {
    $apiContent = getData($apiUrl);
    if($apiContent!=''){
        file_put_contents($apiFile, $apiContent);
    }
}

$apiContent = file_get_contents($apiFile);
$apiReturn = unserialize($apiContent);
$current_version = $apiReturn['offers'][0]['current'];

$lines = file($myFile);

foreach ($lines as $line_num => $line) {
    $adminEmail = array();
    $siteAdminEmail = array();
    $wpversionArr = explode( "'", $line);
    $wpversion = $wpversionArr[1];

    // Verify against wordpress.org if the version is the latest.
    if (version_compare($wpversion, $current_version, '<')) {

        // Verify that the file wp-config.php is place.
        // There is a need to check if the file is found i one of the parent folders, future fix
        $filename = explode( "wp-includes/", $line);
        $filename = $filename[0] . "wp-config.php";

        if (file_exists($filename)) {
            $configlines = file($filename);
            $DB_USER = "";
            $DB_PASSWORD = "";
            $DB_HOST = "";
            $DB_NAME = "";
            $tbl_prefix = "";
            $siteurl = "";
            // get all the variables that is needed for mysql connection.
            foreach ($configlines as $line_num => $configline) {
                if (strpos($configline,"'DB_USER'") > 0 ) {
                    $DB_USER = (explode( "'", $configline));
                    $DB_USER = $DB_USER[3];
                }

                if (strpos($configline,"'DB_USER'") > 0 ) {
                    $DB_USER = (explode( "'", $configline));
                    $DB_USER = $DB_USER[3];
                }

                if (strpos($configline,"'DB_PASSWORD'") > 0 ) {
                    $DB_PASSWORD = (explode( "'", $configline));
                    $DB_PASSWORD = $DB_PASSWORD[3];
                }

                if (strpos($configline,"'DB_HOST'") > 0 ) {
                    $DB_HOST = (explode( "'", $configline));
                    $DB_HOST = $DB_HOST[3];
                }

                if (strpos($configline,"'DB_NAME'") > 0 ) {
                    $DB_NAME = (explode( "'", $configline));
                    $DB_NAME = $DB_NAME[3];
                }

                if (strpos($configline,"table_prefix") > 0 ) {
                    $tbl_prefix = (explode( "'", $configline));
                    $tbl_prefix = $tbl_prefix[1];
                }
            }
            // Connect to the wordpress database
            $con=mysqli_connect($DB_HOST,$DB_USER,$DB_PASSWORD,$DB_NAME) or die;

            // Check connection
            if (mysqli_connect_errno($con)) {
                echo "Failed to connect to MySQL: " . mysqli_connect_error();
            }

            // Retreve Site URL
            $sqlquery = "select option_value from " . $tbl_prefix . "options where option_name like 'siteurl'";
            $result = mysqli_query($con,$sqlquery);
            if (!$result) {
                echo "MySQL ERROR DIED! Retreve Site URL" . PHP_EOL;
                die('Invalid query: ' . mysql_error());
            }
            
            while($row = mysqli_fetch_array($result)) {
                $siteurl = $row['option_value'];
                $siteurl = (explode( "//", $siteurl));
                $siteurl = $siteurl[1];
            }
            // Write version of wordpress installation
            //echo "WP-Version is: " . $wpversion . PHP_EOL;

            // Retreve all Admins email address
            $sqlquery = "SELECT * FROM " . $tbl_prefix . "users JOIN " . $tbl_prefix . "usermeta ON ( " . $tbl_prefix . "users.id = " . $tbl_prefix . "usermeta.user_id ) WHERE " . $tbl_prefix . "usermeta.meta_key LIKE    'wp_user_level' AND " . $tbl_prefix . "usermeta.meta_value =    '10'";
            $result = mysqli_query($con,$sqlquery);
            if (!$result) {
                echo "MySQL ERROR DIED! Retreve all Admins email" . PHP_EOL;
                die('Invalid query: ' . mysql_error());
            }

            while($row = mysqli_fetch_array($result)) {
// Uncomment to send e-mail to all Admins.
//                send_email( $row['option_value'], $siteurl, $wpversion, $current_version);
                $tmp = $row['user_email'];
                array_push($adminEmail, $tmp);
            }

            // Retrive the Site Admin email address and spam them until they upgrade wordpress.
            $sqlquery = "select option_value from " . $tbl_prefix . "options where option_name like 'admin_email'";
            $result = mysqli_query($con,$sqlquery);
            
            if (!$result) {
                die('Invalid query: ' . mysql_error());
            }

            while($row = mysqli_fetch_array($result)) {
// Uncomment to send e-mail to all Site-Admins.        
//                send_email( $row['option_value'], $siteurl, $wpversion, $current_version);
                $tmp =  $row['option_value'];
                array_push($siteAdminEmail, $tmp);
            }
    
            mysqli_close($con);
        } else {
            echo "NO file found" . PHP_EOL;
        }
        $siteurlUTF8 = idn_to_utf8($siteurl);
        $adminEmailComma = join(", ", $adminEmail);
        $siteAdminEmailComma = join(", ", $siteAdminEmail);

        $summary .= $siteurlUTF8 . "
 ";
        $summary .= "version: " . $wpversion . "
 ";
        $summary .= "Admin Emails: " . $adminEmailComma . "
 ";
        $summary .= "SiteAdmin Emails: " . $siteAdminEmailComma . "

 " . "\r\n";
    }
}

// Comment next line to not send e-mail to server admin.sendAdminSummary($AdminAdress, $summary);


function send_email($address, $siteurl, $wpversion, $current_version){
    global $Sender;
    
    $to    = $address;
    $subject = "Detfinns en ny version av wordpress forsajten: " . idn_to_utf8($siteurl) ;
    $message = '' . $subject . '


Hej

Du får detta meddelande gäller sajten: ' . idn_to_utf8($siteurl) . '. 
Det har kommit en ny version ' . $current_version . ' av wordpress och eftersom du fortfarande använder version ' . $wpversion . ' så bör den upgraderas. 

Scandinavian Hosting


';

    $headers = 'MIME-Version: 1.0' . "\n";
    $headers .= 'Content-type: text/html; charset=utf-8' . "\n";
    $headers .= 'From: ' . $Sender . "\n";
    $headers .= 'Reply-To: ' . $Sender . "\n";

    mail($to, $subject, $message, $headers);
}


functionsendAdminSummary($address, $summary){
    global $current_version;
    global $ServerName;
    global $Sender;
    
    $to    = $address;
    $subject = "Sammanställning avWordpresssajter sombehöveruppdateras";
    $message = '' . $subject . '


Hej

Här kommer en sammanställning av sajter som behöver uppdateras på ' . $ServerName  . ' 
Senaste versionen av WordPress är ' . $current_version . '

 ' . $summary . '

Med Vänlig Hälsning
Scandinavian Hosting


';

    $headers = 'MIME-Version: 1.0' . "\n";
    $headers .= 'Content-type: text/html; charset=utf-8' . "\n";
    $headers .= 'From: ' . $Sender . "\n";
    $headers .= 'Reply-To: ' . $Sender . "\n";

    mail($to, $subject, $message, $headers);
}

// http://yalamber.com/2012/12/get-the-latest-version-number-of-wordpress-using-api/
function getData($url) {
    if(is_callable('curl_init')){
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }else{
        return file_get_contents($url);
    }
}

?>

 

The get it all to work I run the main script once a month, first monday at 8:00

cronetab-e

Add a line that looks like this:

0 8 * * 1 /root/scripts/wp-version/run-wp-version.sh

That is all
As always, post a comment if you find it useful.