Migration.php
3 years ago
Migration_1_0.php
3 years ago
Migration_1_6.php
3 years ago
Migration_1_8.php
3 years ago
Migration_1_9.php
3 years ago
Migration_2.php
3 years ago
Migration_3.php
3 years ago
Migration_4.php
3 years ago
Migration_5.php
3 years ago
Migration_6.php
3 years ago
Migration_7.php
3 years ago
Migration_8.php
3 years ago
Migration_9.php
3 years ago
Migration_Job.php
3 years ago
Migration_1_8.php
117 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\Migrations; |
| 4 | |
| 5 | use IAWP\Known_Referrers; |
| 6 | use IAWP\Query; |
| 7 | |
| 8 | class Migration_1_8 extends Migration |
| 9 | { |
| 10 | /** |
| 11 | * @var string |
| 12 | */ |
| 13 | protected $database_version = '1.8'; |
| 14 | |
| 15 | /** |
| 16 | * @return void |
| 17 | */ |
| 18 | protected function handle(): void |
| 19 | { |
| 20 | global $wpdb; |
| 21 | |
| 22 | $charset_collate = $wpdb->get_charset_collate(); |
| 23 | |
| 24 | $views_table = Query::get_table_name(Query::VIEWS); |
| 25 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 26 | $referrer_groups_table = Query::get_table_name(Query::REFERRER_GROUPS); |
| 27 | $referrers_table = Query::get_table_name(Query::REFERRERS); |
| 28 | |
| 29 | $known_referrers = Known_Referrers::referrers(); |
| 30 | |
| 31 | // Create the groups table |
| 32 | $wpdb->query("DROP TABLE IF EXISTS $referrer_groups_table"); |
| 33 | $wpdb->query("CREATE TABLE $referrer_groups_table ( |
| 34 | referrer_group_id bigint(20) UNSIGNED AUTO_INCREMENT, |
| 35 | name varchar(2048) NOT NULL, |
| 36 | domain varchar(2048) NOT NULL, |
| 37 | domain_to_match varchar(2048) NOT NULL, |
| 38 | type ENUM ('Search', 'Social') NOT NULL, |
| 39 | PRIMARY KEY (referrer_group_id) |
| 40 | ) $charset_collate"); |
| 41 | |
| 42 | // Insert predefined groups |
| 43 | foreach ($known_referrers as $group) { |
| 44 | foreach ($group['domains'] as $domain) { |
| 45 | $wpdb->insert($referrer_groups_table, ['name' => $group['name'], 'domain' => $group['domains'][0], 'domain_to_match' => $domain, 'type' => $group['type']]); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | $wpdb->query(" |
| 50 | ALTER TABLE $referrers_table CHANGE COLUMN url domain varchar(2048) NOT NULL; |
| 51 | "); |
| 52 | $rows = $wpdb->get_results("SELECT * FROM $referrers_table"); |
| 53 | |
| 54 | foreach ($rows as $row) { |
| 55 | $potential_url = new URL($row->domain); |
| 56 | |
| 57 | if ($potential_url->is_valid_url()) { |
| 58 | $wpdb->query( |
| 59 | $wpdb->prepare( |
| 60 | "UPDATE $referrers_table SET domain = %s WHERE id = %d", |
| 61 | $potential_url->get_domain(), |
| 62 | $row->id |
| 63 | ) |
| 64 | ); |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | // add a new page field to view table |
| 69 | $wpdb->query(" |
| 70 | ALTER TABLE $views_table ADD COLUMN page bigint(20) UNSIGNED NOT NULL DEFAULT 1; |
| 71 | "); |
| 72 | |
| 73 | // move the page number to the view and set the resource_id to first of similar resources |
| 74 | $wpdb->query(" |
| 75 | UPDATE $views_table AS views |
| 76 | INNER JOIN $resources_table AS resources ON views.resource_id = resources.id |
| 77 | INNER JOIN |
| 78 | ( |
| 79 | SELECT MIN($resources_table.id) as resource_id, |
| 80 | resource, |
| 81 | singular_id, |
| 82 | author_id, |
| 83 | date_archive, |
| 84 | search_query, |
| 85 | post_type, |
| 86 | term_id, |
| 87 | not_found_url |
| 88 | FROM $views_table |
| 89 | INNER JOIN $resources_table |
| 90 | ON $resources_table.id = $views_table.resource_id |
| 91 | GROUP BY resource, singular_id, author_id, date_archive, search_query, post_type, term_id, not_found_url |
| 92 | ) AS matcher ON resources.resource = matcher.resource |
| 93 | AND (resources.singular_id = matcher.singular_id OR resources.singular_id IS NULL OR matcher.singular_id IS NULL) |
| 94 | AND (resources.author_id = matcher.author_id OR resources.author_id IS NULL OR matcher.author_id IS NULL) |
| 95 | AND (resources.date_archive = matcher.date_archive OR resources.date_archive IS NULL OR matcher.date_archive IS NULL) |
| 96 | AND (resources.search_query = matcher.search_query OR resources.search_query IS NULL OR matcher.search_query IS NULL) |
| 97 | AND (resources.post_type = matcher.post_type OR resources.post_type IS NULL OR matcher.post_type IS NULL) |
| 98 | AND (resources.term_id = matcher.term_id OR resources.term_id IS NULL OR matcher.term_id IS NULL) |
| 99 | AND (resources.not_found_url = matcher.not_found_url OR resources.not_found_url IS NULL OR matcher.not_found_url IS NULL) |
| 100 | AND resources.id != matcher.resource_id |
| 101 | SET views.resource_id = matcher.resource_id, views.page = resources.page |
| 102 | "); |
| 103 | |
| 104 | // delete the extra duplicate resources (or don't?) |
| 105 | $wpdb->query(" |
| 106 | DELETE resources FROM $resources_table AS resources |
| 107 | LEFT JOIN $views_table AS views ON resources.id = views.resource_id |
| 108 | WHERE views.id IS NULL |
| 109 | "); |
| 110 | |
| 111 | // remove the page column from resources |
| 112 | $wpdb->query(" |
| 113 | ALTER TABLE $resources_table DROP COLUMN page; |
| 114 | "); |
| 115 | } |
| 116 | } |
| 117 |