From cdf176e224352677ee9a11e6be240589456c0137 Mon Sep 17 00:00:00 2001 From: Matt Batchelder Date: Mon, 23 Feb 2026 19:35:33 -0500 Subject: [PATCH] Add force pull functionality and improve post content handling --- dist/oribi-tech-sync.zip | Bin 44659 -> 46741 bytes includes/admin.php | 24 +++++++- includes/post-sync.php | 24 +++++--- includes/push-client.php | 15 ++++- includes/sync-engine.php | 125 +++++++++++++++++++++++++++++++++++---- 5 files changed, 165 insertions(+), 23 deletions(-) diff --git a/dist/oribi-tech-sync.zip b/dist/oribi-tech-sync.zip index e53d98b0c3c993ef13c5986e5137f8d19958c563..46d9aa28822b12388cf0d79e5faf319d85201b2b 100644 GIT binary patch delta 28813 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 I|2^OT2l*uFiU0rr delta 26689 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 diff --git a/includes/admin.php b/includes/admin.php index cfcd30c..374c247 100644 --- a/includes/admin.php +++ b/includes/admin.php @@ -257,6 +257,18 @@ add_action( 'admin_post_oribi_sync_pull', function () { exit; } ); +add_action( 'admin_post_oribi_sync_force_pull', function () { + if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Permission denied.' ); + check_admin_referer( 'oribi_sync_force_pull' ); + + $result = oribi_sync_run( false, true ); + + set_transient( 'oribi_sync_result', $result, 60 ); + + wp_redirect( add_query_arg( 'oribi_sync_done', 'force_pull', admin_url( 'options-general.php?page=oribi-sync' ) ) ); + exit; +} ); + add_action( 'admin_post_oribi_sync_clear_pat', function () { if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Permission denied.' ); check_admin_referer( 'oribi_sync_clear_pat' ); @@ -330,9 +342,10 @@ function oribi_sync_settings_page() {

@@ -469,6 +482,11 @@ function oribi_sync_settings_page() { onclick="return confirm('Pull content from the repo (no push). Continue?');"> Pull Only
+ + Force Pull + diff --git a/includes/post-sync.php b/includes/post-sync.php index 3ae727b..ed0043e 100644 --- a/includes/post-sync.php +++ b/includes/post-sync.php @@ -733,14 +733,14 @@ function oribi_sync_run_posts( } $post_arr['ID'] = $existing->ID; - $post_id = wp_update_post( $post_arr, true ); + $post_id = oribi_sync_save_post( $post_arr ); if ( is_wp_error( $post_id ) ) { $result['errors'][] = $slug . ': ' . $post_id->get_error_message(); continue; } $result['updated'][] = $slug; } else { - $post_id = wp_insert_post( $post_arr, true ); + $post_id = oribi_sync_save_post( $post_arr ); if ( is_wp_error( $post_id ) ) { $result['errors'][] = $slug . ': ' . $post_id->get_error_message(); continue; @@ -788,7 +788,7 @@ function oribi_sync_run_posts( $entry['path'] ); if ( $rewritten !== $html_content ) { - wp_update_post( [ 'ID' => $post_id, 'post_content' => $rewritten ] ); + oribi_sync_save_post( [ 'ID' => $post_id, 'post_content' => $rewritten ] ); } // ── Featured image ────────────────────────────────────────────────── @@ -852,10 +852,13 @@ function oribi_sync_trash_removed_posts( array $current_slugs ): array { * The post_content (HTML) is stored as the body — raw HTML is valid in * most Markdown flavours and renders correctly when re-imported. * - * @param WP_Post $post + * @param WP_Post $post + * @param int|null $post_id When provided, post_content is read raw from the DB. * @return string Markdown source. */ -function oribi_sync_generate_post_markdown( WP_Post $post ): string { +function oribi_sync_generate_post_markdown( WP_Post $post, ?int $post_id = null ): string { + global $wpdb; + $fm = "---\n"; // Title — decode HTML entities (WP stores & etc. in DB) so the YAML @@ -909,7 +912,14 @@ function oribi_sync_generate_post_markdown( WP_Post $post ): string { $fm .= "---\n\n"; - return $fm . $post->post_content; + // Read post_content directly from the DB when a post_id is supplied so + // we get exactly what oribi_sync_save_post() wrote, with no filter applied. + $id = $post_id ?? $post->ID; + $body = (string) $wpdb->get_var( + $wpdb->prepare( 'SELECT post_content FROM ' . $wpdb->posts . ' WHERE ID = %d', $id ) + ); + + return $fm . $body; } // ─── Push post to repo ──────────────────────────────────────────────────────── @@ -976,7 +986,7 @@ function oribi_sync_push_post( int $post_id, array $opts = [] ): array { $repo_path = rtrim( $posts_folder, '/' ) . '/' . $post->post_name . '.md'; } - $markdown_content = oribi_sync_generate_post_markdown( $post ); + $markdown_content = oribi_sync_generate_post_markdown( $post, $post_id ); $commit_msg = $opts['message'] ?? 'Sync: update post ' . $post->post_name . ' from WordPress'; $new_checksum = hash( 'sha256', $markdown_content ); diff --git a/includes/push-client.php b/includes/push-client.php index 6b65d8f..3bbf7d9 100644 --- a/includes/push-client.php +++ b/includes/push-client.php @@ -386,9 +386,18 @@ function oribi_sync_push_page( int $post_id, array $opts = [] ): array { } // ── Generate content ────────────────────────────────────────────────── - $slug = $post->post_name; - $title = $post->post_title; - $wp_content = $post->post_content; + $slug = $post->post_name; + $title = $post->post_title; + + // Read post_content directly from the DB — bypassing every get_post() + // filter — so we get exactly what oribi_sync_save_post() wrote. + global $wpdb; + $wp_content = (string) $wpdb->get_var( + $wpdb->prepare( 'SELECT post_content FROM ' . $wpdb->posts . ' WHERE ID = %d', $post_id ) + ); + + // Clean any corruption baked in by previous syncs (e.g. \u0026amp; artefacts) + $wp_content = oribi_sync_clean_block_content( $wp_content ); $commit_msg = $opts['message'] ?? "Sync: update {$slug} from WordPress"; diff --git a/includes/sync-engine.php b/includes/sync-engine.php index 7ab39d4..d8670af 100644 --- a/includes/sync-engine.php +++ b/includes/sync-engine.php @@ -11,6 +11,93 @@ if ( ! defined( 'ABSPATH' ) ) exit; // ─── Helpers ────────────────────────────────────────────────────────────────── +/** + * Insert or update a post while writing post_content DIRECTLY to the DB. + * + * Every code-path in wp_insert_post / wp_update_post runs the content through + * sanitize_post_field() → apply_filters('pre_post_content') and + * apply_filters('content_save_pre'), both of which have wp_kses_post + * callbacks that turn & (inside Gutenberg block JSON) into &. + * kses_remove_filters() only unhooks content_save_pre, NOT pre_post_content, + * so the ampersand corruption survived even with those wrappers. + * + * This helper lets WP create/update every other field normally (title, slug, + * status, dates, author …) with an empty content placeholder, then immediately + * overwrites post_content in the DB directly — no filters, no escaping beyond + * the $wpdb placeholder. + * + * @param array $post_arr Same shape as wp_insert_post / wp_update_post. + * @return int|WP_Error Post ID on success, WP_Error on failure. + */ +function oribi_sync_save_post( array $post_arr ) { + global $wpdb; + + $content = $post_arr['post_content'] ?? ''; + $post_arr['post_content'] = ''; // let WP handle everything else + + if ( ! empty( $post_arr['ID'] ) ) { + $post_id = wp_update_post( $post_arr, true ); + } else { + $post_id = wp_insert_post( $post_arr, true ); + } + + if ( is_wp_error( $post_id ) ) { + return $post_id; + } + + $wpdb->update( + $wpdb->posts, + [ 'post_content' => $content ], + [ 'ID' => (int) $post_id ], + [ '%s' ], + [ '%d' ] + ); + + clean_post_cache( (int) $post_id ); + + return $post_id; +} + +/** + * Clean previously-corrupted Gutenberg block content. + * + * Old syncs ran content through wp_kses_post which HTML-entity-encoded `&` + * inside JSON attributes to `&`. php's json_encode then re-encoded that + * `&` to `\u0026`, producing `\u0026amp;` instead of just `\u0026`. + * + * This function corrects those artefacts so block JSON attributes contain + * the right unicode escape sequences. + * + * Also normalises plain `&` → `&` inside JSON block comments so the + * next round of json_encode produces a single clean `\u0026`. + * + * @param string $content Gutenberg block HTML. + * @return string Cleaned block HTML. + */ +function oribi_sync_clean_block_content( string $content ): string { + // json_encode always hex-escapes & as \u0026 (even with JSON_UNESCAPED_UNICODE, + // which only affects codepoints > U+007F). Previous syncs also ran content + // through wp_kses_post which turned & into &, so json_encode then produced + // \u0026amp; instead of just \u0026. + // + // Fix the double-encoded forms first, then unescape the remaining \u0026 back + // to literal & — Gutenberg's block JSON parser treats both identically. + // These sequences are unambiguous in Gutenberg block comment JSON. + $content = str_replace( '\u0026amp;', '&', $content ); + $content = str_replace( '\u0026lt;', '<', $content ); + $content = str_replace( '\u0026gt;', '>', $content ); + $content = str_replace( '\u0026quot;', '"', $content ); + $content = str_replace( '\u0026#039;', "'", $content ); + // Clean any remaining plain hex-escapes of ASCII punctuation + $content = str_replace( '\u0026', '&', $content ); + $content = str_replace( '\u003C', '<', $content ); + $content = str_replace( '\u003E', '>', $content ); + $content = str_replace( '\u0022', '"', $content ); + $content = str_replace( '\u0027', "'", $content ); + + return $content; +} + /** * Strip a case-insensitive directory prefix from a file path. * @@ -29,14 +116,26 @@ function oribi_sync_strip_prefix( string $path, string $prefix ): string { /** Generate a self-closing block comment (standalone or child blocks). */ if ( ! function_exists( 'oribi_b' ) ) { function oribi_b( $name, $attrs = [] ) { - return ''; + $json = wp_json_encode( $attrs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ); + // json_encode always hex-escapes & < > ' for XSS safety, but these are + // inside HTML comments so they are safe as literals in Gutenberg block JSON. + $json = str_replace( [ '\u0026', '\u003C', '\u003E', '\u0022', '\u0027' ], + [ '&', '<', '>', '"', "'" ], $json ); + return ''; } } /** Generate an opening tag for a parent block comment. */ if ( ! function_exists( 'oribi_b_open' ) ) { function oribi_b_open( $name, $attrs = [] ) { - $json = ! empty( $attrs ) ? ' ' . wp_json_encode( $attrs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) : ''; + if ( ! empty( $attrs ) ) { + $json = wp_json_encode( $attrs, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ); + $json = str_replace( [ '\u0026', '\u003C', '\u003E', '\u0022', '\u0027' ], + [ '&', '<', '>', '"', "'" ], $json ); + $json = ' ' . $json; + } else { + $json = ''; + } return ''; } } @@ -100,10 +199,11 @@ function oribi_sync_execute_php( string $php_source, string $slug ) { * Run the full page sync. * * @param bool $dry_run If true, returns what would happen without making changes. + * @param bool $force If true, bypasses SHA-based change detection and re-pulls all files. * * @return array{ok: bool, created: string[], updated: string[], trashed: string[], skipped: string[], errors: string[]} */ -function oribi_sync_run( bool $dry_run = false ): array { +function oribi_sync_run( bool $dry_run = false, bool $force = false ): array { $result = [ 'ok' => true, 'created' => [], @@ -177,7 +277,7 @@ function oribi_sync_run( bool $dry_run = false ): array { $git_sha = $entry['sha'] ?? ''; $stored_git_sha = $existing ? get_post_meta( $existing->ID, '_oribi_sync_git_sha', true ) : ''; - if ( $existing && ! empty( $git_sha ) && $git_sha === $stored_git_sha ) { + if ( ! $force && $existing && ! empty( $git_sha ) && $git_sha === $stored_git_sha ) { $result['skipped'][] = $slug . ' (unchanged)'; if ( ! $dry_run ) { update_post_meta( $existing->ID, '_oribi_sync_last_run', current_time( 'mysql' ) ); @@ -209,6 +309,9 @@ function oribi_sync_run( bool $dry_run = false ): array { $content = $raw_content; } + // Clean any corruption from previous syncs (e.g. \u0026amp; artefacts) + $content = oribi_sync_clean_block_content( $content ); + // Checksum based on raw source — used as fallback for providers without tree SHA $checksum = hash( 'sha256', $raw_content ); @@ -238,11 +341,11 @@ function oribi_sync_run( bool $dry_run = false ): array { } } - $update_result = wp_update_post( [ + $update_result = oribi_sync_save_post( [ 'ID' => $existing->ID, 'post_content' => $content, 'post_status' => 'publish', - ], true ); + ] ); if ( is_wp_error( $update_result ) ) { $result['errors'][] = $slug . ': ' . $update_result->get_error_message(); @@ -261,13 +364,13 @@ function oribi_sync_run( bool $dry_run = false ): array { // Create new page $title = oribi_sync_slug_to_title( $slug ); - $post_id = wp_insert_post( [ + $post_id = oribi_sync_save_post( [ 'post_title' => $title, 'post_name' => $slug, 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => $content, - ], true ); + ] ); if ( is_wp_error( $post_id ) ) { $result['errors'][] = $slug . ': ' . $post_id->get_error_message(); @@ -624,14 +727,16 @@ function oribi_sync_pull_page_from_repo( int $post_id ): array { } if ( $content !== null ) { + // Clean any corruption from previous syncs + $content = oribi_sync_clean_block_content( $content ); $checksum = hash( 'sha256', $raw_content ); $git_sha = $target_entry['sha'] ?? ''; - $update = wp_update_post( [ + $update = oribi_sync_save_post( [ 'ID' => $post->ID, 'post_content' => $content, 'post_status' => 'publish', - ], true ); + ] ); if ( is_wp_error( $update ) ) { $result['errors'][] = $slug . ': ' . $update->get_error_message();