$entry) { $key = $norm($entry['motto']); if ($key !== '') $by_motto[$key][] = $i + 1; } $existing = get_posts([ 'post_type' => 'post', 'post_status' => 'any', 'posts_per_page' => -1, 'category' => 14, 'orderby' => 'ID', 'order' => 'ASC', ]); $used = []; $updated = $ambiguous = $unmatched = 0; $to_update = []; foreach ($existing as $post) { $matches = []; foreach ($by_motto as $motto => $indices) { if (str_contains($norm($post->post_content), $motto)) $matches = array_merge($matches, $indices); } $matches = array_values(array_unique($matches)); if (count($matches) !== 1 || isset($used[$matches[0]])) { $ambiguous += count($matches) > 1; $unmatched += count($matches) === 0; continue; } $idx = $matches[0]; $used[$idx] = true; $entry = $book[$idx - 1]; $to_update[] = [$post->ID, $idx, $entry]; $updated++; } $planned_new = count($book) - count($used); if ($ambiguous || $unmatched) { printf("DRY-RUN: existentes indexados=%d; nuevos=%d; ambiguos=%d; sin coincidencia=%d; total=%d\n", $updated, $planned_new, $ambiguous, $unmatched, count($book)); fwrite(STDERR, "ABORTAR APLICACIÓN: hay posts existentes sin correspondencia única.\n"); exit(3); } if ($apply) foreach ($to_update as [$post_id, $idx, $entry]) { update_post_meta($post_id, '_fea_book_index', (string) $idx); update_post_meta($post_id, '_fea_cita', $entry['citation']); update_post_meta($post_id, '_fea_fuente', 'A la fuente cada día — Fray Marcos, entrada #' . $idx); } $created = 0; foreach ($book as $i => $entry) { $idx = $i + 1; if (isset($used[$idx])) continue; $body = '

' . esc_html($entry['title']) . '

' . '

' . esc_html($entry['citation']) . '

' . '

' . esc_html($entry['gospel']) . '

' . '

' . esc_html($entry['motto']) . '

'; foreach ($entry['paragraphs'] as $paragraph) $body .= '

' . esc_html($paragraph) . '

'; if ($apply) { $id = wp_insert_post(['post_title' => $entry['title'], 'post_content' => $body, 'post_status' => 'publish', 'post_category' => [14]], true); if (is_wp_error($id)) { fwrite(STDERR, $id->get_error_message() . "\n"); exit(1); } update_post_meta($id, '_fea_book_index', (string) $idx); update_post_meta($id, '_fea_cita', $entry['citation']); update_post_meta($id, '_fea_fuente', 'A la fuente cada día — Fray Marcos, entrada #' . $idx); } $created++; } printf("%s: existentes indexados=%d; nuevos=%d; ambiguos=%d; sin coincidencia=%d; total=%d\n", $apply ? 'APLICADO' : 'DRY-RUN', $updated, $created, $ambiguous, $unmatched, count($book));