web/wp-content/plugins/social/upgrades/2.0.php
changeset 196 5e8dcbe22c24
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/upgrades/2.0.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,329 @@
+<?php if (!defined('SOCIAL_UPGRADE')) { die('Direct script access not allowed.'); }
+/**
+ * Upgrades Social to 2.0.
+ */
+
+// Force the lock
+$semaphore = Social_Semaphore::factory();
+$semaphore->lock();
+
+// Find old social_notify and update to _social_notify.
+$meta_keys = array(
+	'social_aggregated_replies',
+	'social_broadcast_error',
+	'social_broadcast_accounts',
+	'social_broadcasted_ids',
+	'social_aggregation_log',
+	'social_twitter_content',
+	'social_notify_twitter',
+	'social_facebook_content',
+	'social_notify_facebook',
+	'social_notify',
+	'social_broadcasted'
+);
+if (count($meta_keys)) {
+	foreach ($meta_keys as $key) {
+		$new = '_'.$key;
+		if ($key == 'social_aggregated_replies') {
+			$new = '_social_aggregated_ids';
+		}
+		$wpdb->query("
+			UPDATE $wpdb->postmeta
+			   SET meta_key = '$new'
+			 WHERE meta_key = '$key'
+		");
+	}
+}
+
+// Delete old useless meta
+$meta_keys = array(
+	'_social_broadcasted'
+);
+if (count($meta_keys)) {
+	foreach ($meta_keys as $key) {
+		$wpdb->query("
+			DELETE
+			  FROM $wpdb->postmeta
+			 WHERE meta_key = '$key'
+		");
+	}
+}
+
+// De-auth Facebook accounts for new permissions.
+if (version_compare(Social::option('installed_version'), '2.0', '<')) {
+	// Fix aggregated IDs
+	$results = $wpdb->get_results("
+		SELECT post_id, meta_value
+		  FROM $wpdb->postmeta
+		 WHERE meta_key = '_social_aggregated_ids'
+	");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$result->meta_value = maybe_unserialize($result->meta_value);
+			if (is_array($result->meta_value)) {
+				$meta_value = array();
+				foreach ($result->meta_value as $id) {
+					if (is_string($id)) {
+						if (strpos($id, '_') !== false) {
+							if (!isset($meta_value['facebook'])) {
+								$meta_value['facebook'] = array();
+							}
+
+							$meta_value['facebook'][] = $id;
+						}
+						else {
+							if (!isset($meta_value['twitter'])) {
+								$meta_value['twitter'] = array();
+							}
+
+							$meta_value['twitter'][] = $id;
+						}
+					}
+				}
+
+				if (!empty($meta_value)) {
+					update_post_meta($result->post_id, '_social_aggregated_ids', $meta_value);
+				}
+				else {
+					delete_post_meta($result->post_id, '_social_aggregated_ids');
+			    }
+			}
+		}
+	}
+
+	// Global accounts
+	$set_meta = false;
+	$accounts = get_option('social_accounts', array());
+	if (count($accounts)) {
+		if (isset($accounts['facebook'])) {
+			$set_meta = true;
+			$accounts['facebook'] = array();
+		}
+
+		if (isset($accounts['twitter'])) {
+			foreach ($accounts['twitter'] as $account_id => $account) {
+				if (!isset($account->universal)) {
+					$accounts['twitter'][$account_id]->universal = true;
+				}
+			}
+		}
+
+		update_option('social_accounts', $accounts);
+	}
+
+	$results = $wpdb->get_results("
+		SELECT user_id, meta_value
+		  FROM $wpdb->usermeta
+		 WHERE meta_key = 'social_accounts'
+	");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$accounts = maybe_unserialize($result->meta_value);
+			if (is_array($accounts)) {
+				if (isset($accounts['facebook'])) {
+					$set_meta = true;
+					$accounts['facebook'] = array();
+				}
+
+				if (isset($accounts['twitter'])) {
+					foreach ($accounts['twitter'] as $account_id => $account) {
+						if (!isset($account->personal)) {
+						    $accounts['twitter'][$account_id]->personal = true;
+						}
+					}
+				}
+
+				update_user_meta($result->user_id, 'social_accounts', $accounts);
+			}
+		}
+	}
+
+	if ($set_meta) {
+		$results = $wpdb->get_results("
+			SELECT ID
+			  FROM $wpdb->users
+		");
+		if (is_array($results)) {
+			foreach ($results as $result) {
+				update_user_meta($result->ID, 'social_2.0_upgrade', true);
+			}
+		}
+	}
+
+	// Upgrade system_cron to fetch_comments
+	$fetch = $wpdb->get_var("
+		SELECT option_value
+		  FROM $wpdb->options
+		 WHERE option_name = 'social_system_crons'
+	");
+
+	if (empty($fetch)) {
+		$fetch = '1';
+	}
+
+	$wpdb->query("
+		INSERT
+		  INTO $wpdb->options (option_name, option_value)
+		VALUES('social_fetch_comments', '$fetch')
+		    ON DUPLICATE KEY UPDATE option_id = option_id
+    ");
+
+	// Update all comment types
+	$keys = array();
+	foreach (Social::instance()->services() as $service) {
+		$keys[] = $service->key();
+		if ($service->key() == 'facebook') {
+			$keys[] = 'facebook-like';
+		}
+	}
+
+	foreach ($keys as $key) {
+		$query = $wpdb->query("
+			UPDATE $wpdb->comments
+			   SET comment_type = 'social-$key'
+			 WHERE comment_type = '$key'
+		");
+	}
+
+	// Make sure all commenter accounts have the commenter flag
+	$results = $wpdb->get_results("
+		SELECT m.user_id
+		  FROM $wpdb->users AS u
+		  JOIN $wpdb->usermeta AS m
+		    ON m.user_id = u.ID
+		 WHERE m.meta_key = 'social_accounts'
+		   AND u.user_email LIKE '%@example.com'
+    ");
+	if (count($results)) {
+		foreach ($results as $result) {
+			update_user_meta($result->user_id, 'social_commenter', 'true');
+		}
+	}
+
+	// Rename the XMLRPC option
+	$wpdb->query("
+		UPDATE $wpdb->options
+		   SET option_name = 'social_default_accounts'
+		 WHERE option_name = 'social_xmlrpc_accounts'
+    ");
+
+	// Fix the broadcasted IDs format
+	$results = $wpdb->get_results("
+		SELECT pm.meta_value, pm.post_id, p.post_content
+		  FROM $wpdb->postmeta AS pm
+		  JOIN $wpdb->posts AS p
+		    ON pm.post_id = p.ID
+		 WHERE meta_key = '_social_broadcasted_ids'
+    ");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$meta_value = maybe_unserialize($result->meta_value);
+			if (is_array($meta_value)) {
+				Social::log('Old meta value for post #:post_id: :meta_value', array(
+					'post_id' => $result->post_id,
+					'meta_value' => print_r($meta_value, true)
+				));
+				$_meta_value = array();
+				foreach ($meta_value as $service_key => $accounts) {
+					if (!isset($_meta_value[$service_key])) {
+						$_meta_value[$service_key] = array();
+					}
+
+					foreach ($accounts as $account_id => $broadcasted) {
+						Social::log('Checking account #:account_id (:service).', array(
+							'account_id' => $account_id,
+							'service' => $service_key
+						));
+						if (!isset($_meta_value[$service_key][$account_id])) {
+							$_meta_value[$service_key][$account_id] = array();
+						}
+
+						if (is_array($broadcasted)) {
+							foreach ($broadcasted as $id => $data) {
+								Social::log('Current Meta Value: :meta_value', array(
+									'meta_value' => print_r($_meta_value, true)
+								));
+
+								if (is_scalar($data)) {
+									$_meta_value[$service_key][$account_id][$data] = array(
+										'message' => ''
+									);
+								}
+								else {
+									$_meta_value[$service_key][$account_id][$id] = $data;
+								}
+							}
+						}
+						else {
+							$_meta_value[$service_key][$account_id][$broadcasted] = array(
+								'message' => ''
+							);
+						}
+					}
+				}
+
+				if (!empty($_meta_value)) {
+					update_post_meta($result->post_id, '_social_broadcasted_ids', $_meta_value);
+				}
+
+				Social::log('New meta value for post #:post_id: :meta_value', array(
+					'post_id' => $result->post_id,
+					'meta_value' => print_r($_meta_value, true)
+				));
+			}
+		}
+	}
+
+	// Add broadcast by default
+	Social::option('broadcast_by_default', '0');
+
+	// Reschedule posts for aggregation
+	$results = $wpdb->get_results("
+		SELECT post_id
+		FROM $wpdb->postmeta
+		WHERE meta_key = '_social_broadcasted_ids'
+		ORDER BY post_id DESC
+		LIMIT 50
+	");
+	if ($results !== null) {
+		$queue = Social_Aggregation_Queue::factory();
+		foreach ($results as $result) {
+			if (!$queue->find($result->post_id)) {
+				$queue->add($result->post_id);
+			}
+		}
+		$queue->save();
+	}
+
+	// Fix comment author urls for Facebook comments...
+	$results = $wpdb->get_results("
+		SELECT comment_ID, comment_author_url
+		FROM $wpdb->comments
+		WHERE comment_type = 'social-facebook'
+		AND comment_author_url LIKE 'http://graph.facebook.com/%'
+	");
+	foreach ($results as $result) {
+		$url = explode('http://graph.facebook.com/', $result->comment_author_url);
+		$id = explode('/', $url[1]);
+
+		$wpdb->query($wpdb->prepare("
+			UPDATE $wpdb->comments
+			SET comment_author_url = %s
+			WHERE comment_ID = %s
+		", 'http://facebook.com/profile.php?id='.$id[1], $result->comment_ID));
+	}
+
+	// Remove old CRONs
+	if (($timestamp = wp_next_scheduled('social_cron_60_init')) !== false) {
+		wp_unschedule_event($timestamp, 'social_cron_60_init');
+	}
+	if (($timestamp = wp_next_scheduled('social_cron_60_core')) !== false) {
+		wp_unschedule_event($timestamp, 'social_cron_60_core');
+	}
+}
+
+// Flush the cache
+wp_cache_flush();
+
+// Decrement the semaphore and unlock
+$semaphore->unlock();