Skip to content

Instantly share code, notes, and snippets.

@akira28
Forked from TJNevis/cloudSettings
Last active August 13, 2018 12:21
Show Gist options
  • Save akira28/d0a2a072d73081828dfaf2377bc206bd to your computer and use it in GitHub Desktop.
Save akira28/d0a2a072d73081828dfaf2377bc206bd to your computer and use it in GitHub Desktop.
PSR-1 coding style
<?php
/* ======================================================
This script is NOT FULLY TESTED (not tested on Windows Server either)
USE AT YOUR OWN RISK - development environment Ubuntu Linux 14.04.3 LTS
The purpose of this script is for small websites and blogs
to have their existing media to work through Amazon S3
There's a great plugin, WP Offload S3, that we'll be tapping
into...it works great for new media, but this is a quick
fix for EXISTING media - media added before you start
using WP Offload S3.
This script is not fully tested, but should be useful for
most situations. It does create a backup of your database,
though it's not tested to work 100% in all hosting scenarios.
Put this file in your WordPress root directory, where wp-config.php is.
You must also already have these 2 plugins installed and configured:
- https://wordpress.org/plugins/amazon-web-services/
- https://wordpress.org/plugins/amazon-s3-and-cloudfront/
TURN OFF CACHING if you have it on your site. Re-enable it after
everything is done.
======================================================
STEPS
1) Manually upload all of your existing /wp-content/uploads/ files to the
Amazon S3 bucket (the bucket you configured WP Offload S3 to use for new images)
2) Add and configure plugins (the 2 listed above)
3) Run this script from the root directory of your WordPress site
======================================================
Developer: TJ Nevis
Website: http://blog.TJNevis.com, http://NevisTechnology.com
More Info: http://blog.tjnevis.com/wordpress-and-amazon-s3-quick-fix-for-existing-media-to-be-served-on-amazon-s3/
Last Updated: 04/19/2016
====================================================== */
require_once 'wp-config.php';
require_once 'wp-content/plugins/amazon-s3-and-cloudfront/wordpress-s3.php';
global $table_prefix;
echo '<h1>Move Existing Media to Amazon S3</h1>';
echo '<h3>By TJ Nevis [<a href="http://NevisTechnology.com?ref=S3Script" target="_blank">NevisTechnology.com</a>] Detailed blog post <a href="http://blog.tjnevis.com/wp-offload-s3-quick-fix-for-existing-media/" target="_blank">here</a></h3>';
/* ======================================================
First step, we're going to back up the database and
save it in the the root directory of your site (where this file is)
====================================================== */
$dbHost = $wpdb->dbhost;
$dbName = $wpdb->dbname;
$dbPassword = $wpdb->dbpassword;
$dbSaveFileLocation = dirname(__FILE__) . '/backup-' . date('Y-m-d-h:i:s', time()) . '.sql';
$dbUser = $wpdb->dbuser;
exec("mysqldump --user=$dbUser --password=$dbPassword --host=$dbHost $dbName > $dbSaveFileLocation");
/* ======================================================
Let's get set up with by grabbing WP Offload S3 values
====================================================== */
amazon_web_services_require_files(); // Thanks k0nG
$aws = new Amazon_Web_Services(__FILE__); // Thanks k0nG
$awsS3 = new Amazon_S3_And_CloudFront(__FILE__, $aws); // Thanks k0nG
$bucket = $awsS3->get_setting('bucket');
$region = $awsS3->get_setting('region'); // Thanks k0nG
$folderPrefix = $awsS3->get_setting('object-prefix');
/* ======================================================
Check if the user is requesting to remove the existing media updates
====================================================== */
if (isset($_GET['remove']) && $_GET['remove']) { // ?removeS3Update=true
if (mysqli_connect($dbHost, $dbUser, $dbPassword)) {
$removeAmazonS3Info = "DELETE FROM " . $table_prefix . "postmeta WHERE meta_key = 'amazonS3_info';";
$reversePostContentHref = updatePostContent(
'href',
$table_prefix . 'posts',
get_site_url($wpdb->blogid) . '/' . $folderPrefix,
"http://$bucket.s3.amazonaws.com/$folderPrefix",
true
);
$reversePostContentSrc = updatePostContent(
'src',
$table_prefix . 'posts',
get_site_url($wpdb->blogid) . '/' . $folderPrefix,
"http://$bucket.s3.amazonaws.com/$folderPrefix",
true
);
echo 'RUNNING COMMAND: ' . $removeAmazonS3Info . ' - ';
if (mysqli_query($removeAmazonS3Info)) {
echo ' <strong>TRUE, ' . mysqli_affected_rows() . ' rows affected</strong><br />';
}
echo 'RUNNING COMMAND: ' . $reversePostContentHref . ' - ';
if (mysqli_query($reversePostContentHref)) {
echo ' <strong>TRUE, ' . mysqli_affected_rows() . ' rows affected</strong><br />';
}
echo 'RUNNING COMMAND: ' . $reversePostContentSrc . ' - ';
if (mysqli_query($reversePostContentSrc)) {
echo ' <strong>TRUE, ' . mysqli_affected_rows() . ' rows affected</strong><br />';
}
}
exit(); // Don't do the rest of the script
}
/* ======================================================
Start fresh, delete data thatis from WP Offload S3
====================================================== */
$wpdb->delete($table_prefix . 'postmeta',
array(
'meta_key' => 'amazonS3_info'
)
);
/* ======================================================
Grab the attachments from the database, we'll need
the meta_value (image name), and the post ID it's related to
====================================================== */
$picturesToUpdate = $wpdb->get_results("SELECT * FROM " . $table_prefix . "postmeta WHERE meta_key = '_wp_attached_file'");
foreach ($picturesToUpdate as $picture) {
$pictureMetaData = serialize(array(
'bucket' => $bucket,
'key' => $folderPrefix . $picture->meta_value,
'region' => $region // Thanks k0nG
));
/* ======================================================
Now let's insert the record that WP Offload S3 looks for
to change the image URL to your S3 URL
====================================================== */
$wpdb->insert($table_prefix . 'postmeta',
array(
'post_id' => $picture->post_id,
'meta_key' => 'amazonS3_info',
'meta_value' => $pictureMetaData
)
);
}
echo '<h3>DONE with adding records for WP Offload S3 to recognize the image on S3</h3>';
if ($link = mysqli_connect($dbHost, $dbUser, $dbPassword)) {
$hrefMySQLUpdate = updatePostContent(
'href',
$table_prefix . 'posts',
get_site_url($wpdb->blogid) . '/' . $folderPrefix,
"http://$bucket.s3.amazonaws.com/$folderPrefix"
);
$srcMySQLUpdate = updatePostContent(
'src',
$table_prefix . 'posts',
get_site_url($wpdb->blogid) . '/' . $folderPrefix,
"http://$bucket.s3.amazonaws.com/$folderPrefix"
);
echo 'RUNNING COMMAND: ' . $hrefMySQLUpdate . ' - ';
if (mysqli_query($link, $hrefMySQLUpdate)) {
echo ' <strong>TRUE, ' . mysqli_affected_rows() . ' rows affected</strong><br />';
}
echo 'RUNNING COMMAND: ' . $srcMySQLUpdate . ' - ';
if (mysqli_query($link, $srcMySQLUpdate)) {
echo ' <strong>TRUE, ' . mysqli_affected_rows() . ' rows affected</strong><br />';
}
}
function updatePostContent($type, $table, $blog, $s3bucket, $reverse = FALSE)
{
// $reverse is to remove the post_content updates and put them back to serving locally
$from = (!$reverse) ? $blog : $s3bucket;
$to = (!$reverse) ? $s3bucket : $blog;
return "UPDATE $table SET post_content = replace(post_content, '$type=\"$from', '$type=\"$to');";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment