fix: wire Image B source data — was hardcoded null, never generated

Root cause: both attach_generated_images() in post-assembler and the
retroactive handler in executor passed null as source_data to the image
pipeline. The pipeline's Image B branch requires non-null source_data
to fire, so Image B was silently skipped on every article since the
feature was built.

Fix: added get_source_data_for_image() to Source_Collector to retrieve
the original Reddit post title/content by source_ids. Post-assembler
now pulls source_ids from the Article_Idea; executor pulls them from
the _prautoblogger_source_ids post meta saved by the publisher.

Also added a regression test proving Image B is skipped when source_data
is null, so this handoff gap will be caught if re-introduced.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
peptiderepo
2026-04-18 08:34:21 +07:00
parent 5b5286ca5b
commit b5e91ba3a6
4 changed files with 98 additions and 2 deletions

View File

@@ -57,6 +57,47 @@ class PRAutoBlogger_Source_Collector {
return $total_inserted;
}
/**
* Retrieve source data rows by their database IDs.
*
* Used by the image pipeline to build Image B's source-driven prompt from
* the source_ids stored on the Article_Idea. Returns the first matching
* row's title and content; these map directly to what
* Image_Prompt_Builder::build_source_prompt() expects.
*
* Side effects: one SELECT query.
*
* @param int[] $ids Database row IDs from the source_data table.
* @return array{title: string, selftext: string}|null First source row, or null if none found.
*/
public function get_source_data_for_image( array $ids ): ?array {
if ( empty( $ids ) ) {
return null;
}
global $wpdb;
$table = $wpdb->prefix . 'prautoblogger_source_data';
$placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) );
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
$row = $wpdb->get_row(
$wpdb->prepare(
"SELECT title, content, subreddit FROM {$table} WHERE id IN ({$placeholders}) ORDER BY score DESC LIMIT 1",
...$ids
),
ARRAY_A
);
if ( null === $row ) {
return null;
}
return [
'title' => $row['title'] ?? 'Reddit Discussion',
'selftext' => $row['content'] ?? '',
];
}
/**
* Store collected source data in the database.
*