| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | /* |
|---|
| 4 | Plugin Name: CF GUID Fix |
|---|
| 5 | Plugin URI: http://crowdfavorite.com/wordpress/plugins/cf-guid-fix/ |
|---|
| 6 | Description: Correct duplicate GUID values created with versions of WordPress that exhibited a <a href="http://core.trac.wordpress.org/ticket/15041">non-unique GUID bug</a>. |
|---|
| 7 | Version: 1.0 |
|---|
| 8 | Author: Crowd Favorite |
|---|
| 9 | Author URI: http://crowdfavorite.com |
|---|
| 10 | */ |
|---|
| 11 | |
|---|
| 12 | function cf_guid_fix_admin_init() { |
|---|
| 13 | if (isset($_GET['cf_action'])) { |
|---|
| 14 | switch ($_GET['cf_action']) { |
|---|
| 15 | case 'guid-fix': |
|---|
| 16 | cf_guid_fix(); |
|---|
| 17 | wp_die('Post GUIDs should be unique now.'); |
|---|
| 18 | break; |
|---|
| 19 | } |
|---|
| 20 | } |
|---|
| 21 | } |
|---|
| 22 | add_action('admin_init', 'cf_guid_fix_admin_init'); |
|---|
| 23 | |
|---|
| 24 | function cf_guid_fix() { |
|---|
| 25 | global $wpdb; |
|---|
| 26 | |
|---|
| 27 | // add index on GUID column |
|---|
| 28 | $wpdb->query(" |
|---|
| 29 | ALTER TABLE $wpdb->posts |
|---|
| 30 | ADD INDEX (guid) |
|---|
| 31 | "); |
|---|
| 32 | |
|---|
| 33 | // find non-unique GUID values |
|---|
| 34 | |
|---|
| 35 | // NOTE: not including revisions since that's a whole other mess to |
|---|
| 36 | // try to get the numbering right if we change the GUID |
|---|
| 37 | |
|---|
| 38 | // this gets the GUIDs |
|---|
| 39 | // SELECT guid |
|---|
| 40 | // FROM $wpdb->posts |
|---|
| 41 | // WHERE post_type != 'revision' |
|---|
| 42 | // GROUP BY guid |
|---|
| 43 | // HAVING COUNT(guid) > 1 |
|---|
| 44 | |
|---|
| 45 | // WORKS - but is very slow |
|---|
| 46 | // SELECT ID |
|---|
| 47 | // FROM $wpdb->posts |
|---|
| 48 | // WHERE guid IN ( |
|---|
| 49 | // SELECT guid |
|---|
| 50 | // FROM $wpdb->posts |
|---|
| 51 | // WHERE post_type != 'revision' |
|---|
| 52 | // GROUP BY guid |
|---|
| 53 | // HAVING COUNT(guid) > 1 |
|---|
| 54 | // ) |
|---|
| 55 | // AND post_type != 'revision' |
|---|
| 56 | |
|---|
| 57 | $non_unique_guids = $wpdb->get_col($wpdb->prepare(" |
|---|
| 58 | SELECT p1.ID |
|---|
| 59 | FROM $wpdb->posts p1 |
|---|
| 60 | WHERE 1 < ( |
|---|
| 61 | SELECT COUNT(ID) |
|---|
| 62 | FROM $wpdb->posts p2 |
|---|
| 63 | WHERE p1.post_type != 'revision' |
|---|
| 64 | AND p1.guid = p2.guid |
|---|
| 65 | ) |
|---|
| 66 | AND p1.post_type != 'revision' |
|---|
| 67 | ")); |
|---|
| 68 | |
|---|
| 69 | // make them unique |
|---|
| 70 | |
|---|
| 71 | if (count($non_unique_guids)) { |
|---|
| 72 | foreach ($non_unique_guids as $post_id) { |
|---|
| 73 | $url = site_url('?p='.$post_id); |
|---|
| 74 | $wpdb->query($wpdb->prepare(" |
|---|
| 75 | UPDATE $wpdb->posts |
|---|
| 76 | SET guid = %s |
|---|
| 77 | WHERE ID = %d |
|---|
| 78 | ", $url, $post_id)); |
|---|
| 79 | } |
|---|
| 80 | } |
|---|
| 81 | |
|---|
| 82 | // remove index from GUID column |
|---|
| 83 | $wpdb->query(" |
|---|
| 84 | ALTER TABLE $wpdb->posts |
|---|
| 85 | DROP INDEX guid |
|---|
| 86 | "); |
|---|
| 87 | |
|---|
| 88 | } |
|---|