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:
@@ -132,7 +132,10 @@ class PRAutoBlogger_Post_Assembler {
|
||||
* @param array $post_data Post data array (for article content).
|
||||
*/
|
||||
public static function attach_generated_images( int $post_id, PRAutoBlogger_Article_Idea $idea, array $post_data ): void {
|
||||
$source_data = null;
|
||||
// Fetch the original Reddit source data for Image B's source-driven prompt.
|
||||
// The idea's source_ids point to rows in the source_data table collected
|
||||
// during the pipeline's collection step.
|
||||
$source_data = ( new PRAutoBlogger_Source_Collector() )->get_source_data_for_image( $idea->get_source_ids() );
|
||||
|
||||
try {
|
||||
$result = ( new PRAutoBlogger_Image_Pipeline() )->generate_and_attach_images( $post_id, $post_data, $source_data );
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user