Files
cascapediastjules/wp-content/themes/cascapedia-st-jules/scripts/migrate-content.php

211 lines
9.6 KiB
PHP

<?php
if ( ! defined('ABSPATH') ) {
require_once dirname(__DIR__, 4) . '/wp-load.php';
}
do_action('acf/init');
$data = json_decode(file_get_contents(__DIR__ . '/migration-data.json'), true);
if (!$data) {
fwrite(STDERR, "migration-data.json invalid\n");
exit(1);
}
$routes = [
'home' => 'accueil',
'municipality' => 'municipalite',
'mayor' => 'mot-du-maire',
'council' => 'conseil-municipal',
'services' => 'services-municipaux-et-publics',
'documents' => 'documents-importants',
'community' => 'notre-communaute',
'communityPhotos' => 'album-photos-communaute',
'activitiesPhotos' => 'album-photos-activites',
'developmentPlan' => 'plan-de-developpement',
'townMap' => 'carte-de-la-ville',
'businesses' => 'entreprises-locales',
'events' => 'evenements',
'publicNotices' => 'avis-publics',
'minutes' => 'proces-verbaux',
'newsletters' => 'bulletins',
];
function lval($value, $lang, $fallback = '') {
if (is_array($value) && isset($value[$lang])) return $value[$lang];
if (is_string($value)) return $value;
return $fallback;
}
function rich($value, $lang) {
$v = lval($value, $lang);
return is_string($v) ? $v : '';
}
function flatten_items($items): array {
$out = [];
foreach ((array) $items as $item) {
if (!is_array($item)) continue;
$label_fr = $item['name'] ?? lval($item['title'] ?? $item['label'] ?? '', 'fr');
$label_en = $item['name'] ?? lval($item['title'] ?? $item['label'] ?? '', 'en');
$out[] = [
'label_fr' => is_string($label_fr) ? $label_fr : '',
'label_en' => is_string($label_en) ? $label_en : '',
'content_fr' => wp_json_encode($item, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
'content_en' => wp_json_encode($item, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
];
}
return $out;
}
function map_section(array $section): array {
$layout = str_replace('-', '_', $section['type'] ?? 'wysiwyg');
$row = ['acf_fc_layout' => $layout];
if (isset($section['title'])) {
$row['title_fr'] = lval($section['title'], 'fr');
$row['title_en'] = lval($section['title'], 'en');
}
if (isset($section['body'])) {
$row['body_fr'] = rich($section['body'], 'fr');
$row['body_en'] = rich($section['body'], 'en');
}
if (isset($section['intro'])) {
$row['body_fr'] = trim(($row['body_fr'] ?? '') . "\n" . rich($section['intro'], 'fr'));
$row['body_en'] = trim(($row['body_en'] ?? '') . "\n" . rich($section['intro'], 'en'));
}
if (isset($section['subtitle'])) {
$row['body_fr'] = trim(($row['body_fr'] ?? '') . "\n" . rich($section['subtitle'], 'fr'));
$row['body_en'] = trim(($row['body_en'] ?? '') . "\n" . rich($section['subtitle'], 'en'));
}
if ($layout === 'hero_carousel') $row['slides'] = flatten_items($section['slides'] ?? []);
if ($layout === 'services_list') $row['services'] = flatten_items($section['services'] ?? []);
if ($layout === 'events_list') $row['events'] = flatten_items($section['events'] ?? []);
if ($layout === 'businesses_list') $row['categories'] = flatten_items($section['categories'] ?? []);
if ($layout === 'council_grid') $row['members'] = flatten_items($section['members'] ?? []);
if ($layout === 'documents_list') $row['groups'] = flatten_items($section['groups'] ?? []);
if ($layout === 'photo_gallery') {
$row['title_fr'] = $row['title_fr'] ?? '';
$row['title_en'] = $row['title_en'] ?? '';
$row['_source_photos_json'] = wp_json_encode($section['photos'] ?? [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
if ($layout === 'pdf_embed') {
$row['_source_pdf_href'] = $section['href'] ?? '';
}
$row['_source_json'] = wp_json_encode($section, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
return $row;
}
$updated = 0;
foreach ($data['pages'] as $key => $page) {
if (!isset($routes[$key])) continue;
$post = get_page_by_path($routes[$key], OBJECT, 'page');
if (!$post) continue;
$sections = array_map('map_section', $page['sections'] ?? []);
update_field('sections', $sections, $post->ID);
update_post_meta($post->ID, '_react_sections_json', wp_json_encode($page['sections'] ?? [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
update_post_meta($post->ID, '_seo_title_fr', lval($page['seo']['title'] ?? '', 'fr'));
update_post_meta($post->ID, '_seo_title_en', lval($page['seo']['title'] ?? '', 'en'));
update_post_meta($post->ID, '_seo_description_fr', lval($page['seo']['description'] ?? '', 'fr'));
update_post_meta($post->ID, '_seo_description_en', lval($page['seo']['description'] ?? '', 'en'));
wp_update_post(['ID' => $post->ID, 'post_excerpt' => lval($page['seo']['description'] ?? '', 'fr')]);
$updated++;
}
update_field('municipality_name_fr', $data['siteSettings']['municipality']['name']['fr'] ?? '', 'option');
update_field('municipality_name_en', $data['siteSettings']['municipality']['name']['en'] ?? '', 'option');
update_field('phone', $data['siteSettings']['contact']['phone'] ?? '', 'option');
update_field('email', $data['siteSettings']['contact']['email'] ?? '', 'option');
update_field('address_fr', $data['siteSettings']['contact']['address']['fr'] ?? '', 'option');
update_field('address_en', $data['siteSettings']['contact']['address']['en'] ?? '', 'option');
update_field('hours_fr', $data['siteSettings']['contact']['hours']['fr'] ?? '', 'option');
update_field('hours_en', $data['siteSettings']['contact']['hours']['en'] ?? '', 'option');
update_field('facebook_url', $data['siteSettings']['social']['facebook'] ?? '', 'option');
function upsert_post_by_title(string $type, string $title, array $args = []): int {
$query = new WP_Query([
'post_type' => $type,
'title' => $title,
'post_status' => 'any',
'posts_per_page' => 1,
'fields' => 'ids',
'no_found_rows' => true,
]);
$existing_id = $query->posts[0] ?? 0;
$postarr = array_merge([
'post_type' => $type,
'post_status' => 'publish',
'post_title' => $title,
], $args);
if ($existing_id) {
$postarr['ID'] = $existing_id;
wp_update_post($postarr);
return (int) $existing_id;
}
return (int) wp_insert_post($postarr);
}
$business_count = 0;
foreach (($data['pages']['businesses']['sections'] ?? []) as $section) {
if (($section['type'] ?? '') !== 'businesses-list') continue;
foreach (($section['categories'] ?? []) as $category) {
foreach (($category['businesses'] ?? []) as $business) {
$id = upsert_post_by_title('local_business', $business['name'] ?? 'Entreprise', [
'post_content' => lval($business['description'] ?? '', 'fr'),
'post_excerpt' => lval($business['description'] ?? '', 'en'),
]);
update_post_meta($id, 'phone', $business['phone'] ?? '');
update_post_meta($id, 'email', $business['email'] ?? '');
update_post_meta($id, 'website', $business['website'] ?? '');
update_post_meta($id, 'address', $business['address'] ?? '');
update_post_meta($id, '_source_json', wp_json_encode($business, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$business_count++;
}
}
}
$event_count = 0;
foreach (($data['pages']['home']['sections'] ?? []) as $section) {
if (($section['type'] ?? '') !== 'events-list') continue;
foreach (($section['events'] ?? []) as $event) {
$id = upsert_post_by_title('event', lval($event['title'] ?? '', 'fr', 'Événement'), [
'post_content' => lval($event['description'] ?? '', 'fr'),
'post_excerpt' => lval($event['description'] ?? '', 'en'),
]);
update_post_meta($id, 'event_date', $event['date'] ?? '');
update_post_meta($id, 'location_fr', lval($event['location'] ?? '', 'fr'));
update_post_meta($id, 'location_en', lval($event['location'] ?? '', 'en'));
update_post_meta($id, '_source_json', wp_json_encode($event, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$event_count++;
}
}
foreach (($data['pages']['events']['sections'] ?? []) as $section) {
if (($section['type'] ?? '') !== 'text-intro') continue;
$title = lval($section['title'] ?? '', 'fr');
if (!$title) continue;
$id = upsert_post_by_title('event', $title, [
'post_content' => lval($section['body'] ?? '', 'fr'),
'post_excerpt' => lval($section['body'] ?? '', 'en'),
]);
update_post_meta($id, '_source_json', wp_json_encode($section, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$event_count++;
}
$gallery_count = 0;
foreach (['communityPhotos' => 'Album photos communauté', 'activitiesPhotos' => 'Album photos activités'] as $page_key => $fallback_title) {
foreach (($data['pages'][$page_key]['sections'] ?? []) as $section) {
if (($section['type'] ?? '') !== 'photo-gallery') continue;
$section_title = lval($section['title'] ?? '', 'fr');
$title = 'Galerie - ' . ($section_title ?: $fallback_title);
$id = upsert_post_by_title('gallery', $title, ['post_content' => lval($section['intro'] ?? '', 'fr')]);
update_post_meta($id, '_source_photos_json', wp_json_encode($section['photos'] ?? [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
update_post_meta($id, '_source_json', wp_json_encode($section, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$gallery_count++;
}
}
echo "updated_pages={$updated}\n";
echo "businesses={$business_count}\n";
echo "events={$event_count}\n";
echo "galleries={$gallery_count}\n";