Add "Pull Page" functionality to admin bar and REST API endpoint
This commit is contained in:
@@ -531,6 +531,133 @@ function oribi_sync_apply_theme_files( string $api_base, string $branch, string
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pull a single page (and theme files) from the repo.
|
||||
*
|
||||
* Used by the admin-bar "Pull Page" button to re-sync only the page currently
|
||||
* being viewed plus all theme files, then returns a result array.
|
||||
*
|
||||
* @param int $post_id WordPress post ID.
|
||||
*
|
||||
* @return array{ok: bool, created: string[], updated: string[], skipped: string[], errors: string[], theme_updated: string[]}
|
||||
*/
|
||||
function oribi_sync_pull_page_from_repo( int $post_id ): array {
|
||||
$result = [
|
||||
'ok' => true,
|
||||
'created' => [],
|
||||
'updated' => [],
|
||||
'skipped' => [],
|
||||
'errors' => [],
|
||||
'theme_updated' => [],
|
||||
];
|
||||
|
||||
$post = get_post( $post_id );
|
||||
if ( ! $post ) {
|
||||
$result['ok'] = false;
|
||||
$result['errors'][] = 'Post not found.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
$slug = $post->post_name;
|
||||
|
||||
// ── Gather settings ────────────────────────────────────────────────────
|
||||
$repo_url = get_option( 'oribi_sync_repo', '' );
|
||||
$branch = get_option( 'oribi_sync_branch', 'main' ) ?: 'main';
|
||||
$pat = oribi_sync_get_pat();
|
||||
|
||||
if ( empty( $repo_url ) || empty( $pat ) ) {
|
||||
$result['ok'] = false;
|
||||
$result['errors'][] = 'Repository URL or PAT is not configured.';
|
||||
return $result;
|
||||
}
|
||||
|
||||
$parsed = oribi_sync_parse_repo_url( $repo_url );
|
||||
if ( is_wp_error( $parsed ) ) {
|
||||
$result['ok'] = false;
|
||||
$result['errors'][] = $parsed->get_error_message();
|
||||
return $result;
|
||||
}
|
||||
|
||||
$provider = oribi_sync_get_provider();
|
||||
$api_base = oribi_sync_api_base( $provider, $parsed );
|
||||
|
||||
// ── Fetch tree ─────────────────────────────────────────────────────────
|
||||
$tree = oribi_sync_fetch_tree( $api_base, $branch, $provider, $pat );
|
||||
if ( is_wp_error( $tree ) ) {
|
||||
$result['ok'] = false;
|
||||
$result['errors'][] = 'Tree fetch failed: ' . $tree->get_error_message();
|
||||
return $result;
|
||||
}
|
||||
|
||||
// ── Find the matching page file ────────────────────────────────────────
|
||||
$page_files = oribi_sync_filter_tree( $tree, 'Pages' );
|
||||
$target_entry = null;
|
||||
|
||||
foreach ( $page_files as $entry ) {
|
||||
$file_slug = oribi_sync_filename_to_slug( basename( $entry['path'] ) );
|
||||
if ( $file_slug === $slug ) {
|
||||
$target_entry = $entry;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! $target_entry ) {
|
||||
$result['skipped'][] = $slug . ' (not found in Pages/ directory)';
|
||||
} else {
|
||||
$raw_content = oribi_sync_fetch_file( $api_base, $branch, $target_entry['path'], $provider, $pat );
|
||||
if ( is_wp_error( $raw_content ) ) {
|
||||
$result['errors'][] = $target_entry['path'] . ': ' . $raw_content->get_error_message();
|
||||
$result['ok'] = false;
|
||||
} else {
|
||||
$raw_content = trim( $raw_content );
|
||||
$ext = strtolower( pathinfo( basename( $target_entry['path'] ), PATHINFO_EXTENSION ) );
|
||||
|
||||
if ( $ext === 'php' ) {
|
||||
$content = oribi_sync_execute_php( $raw_content, $slug );
|
||||
if ( is_wp_error( $content ) ) {
|
||||
$result['errors'][] = $target_entry['path'] . ': ' . $content->get_error_message();
|
||||
$result['ok'] = false;
|
||||
$content = null;
|
||||
}
|
||||
} else {
|
||||
$content = $raw_content;
|
||||
}
|
||||
|
||||
if ( $content !== null ) {
|
||||
$checksum = hash( 'sha256', $raw_content );
|
||||
$git_sha = $target_entry['sha'] ?? '';
|
||||
|
||||
$update = wp_update_post( [
|
||||
'ID' => $post->ID,
|
||||
'post_content' => $content,
|
||||
'post_status' => 'publish',
|
||||
], true );
|
||||
|
||||
if ( is_wp_error( $update ) ) {
|
||||
$result['errors'][] = $slug . ': ' . $update->get_error_message();
|
||||
$result['ok'] = false;
|
||||
} else {
|
||||
update_post_meta( $post->ID, '_oribi_sync_checksum', $checksum );
|
||||
update_post_meta( $post->ID, '_oribi_sync_git_sha', $git_sha );
|
||||
update_post_meta( $post->ID, '_oribi_sync_source', $repo_url . '@' . $branch . ':' . $target_entry['path'] );
|
||||
update_post_meta( $post->ID, '_oribi_sync_last_run', current_time( 'mysql' ) );
|
||||
update_post_meta( $post->ID, '_wp_page_template', 'default' );
|
||||
$result['updated'][] = $slug;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Sync theme files ───────────────────────────────────────────────────
|
||||
$theme_sync = oribi_sync_apply_theme_files( $api_base, $branch, $provider, $pat, false, $tree );
|
||||
$result['theme_updated'] = $theme_sync['updated'];
|
||||
foreach ( $theme_sync['errors'] as $err ) {
|
||||
$result['errors'][] = '[theme] ' . $err;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch theme files from the repo (for preview / apply).
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user