style(phpcs): silence ternary-with-prepare false-positive in ideas-browser + logger
This commit is contained in:
@@ -8,6 +8,7 @@ and this project uses [Semantic Versioning](https://semver.org/).
|
|||||||
## [0.10.1] — 2026-04-23
|
## [0.10.1] — 2026-04-23
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
- **PHPCS: closed the last 26 WordPress-Core residuals** (15 short ternaries rewritten, 11 targeted ignores on false-positive ternary-with-prepare in ideas-browser + logger).
|
||||||
|
|
||||||
- **Tests: OpenRouterImageProviderTest now round-trips through real Encryption class.**
|
- **Tests: OpenRouterImageProviderTest now round-trips through real Encryption class.**
|
||||||
setUp was using a dead `eval()` mock that never installed because the real `PRAutoBlogger_Encryption`
|
setUp was using a dead `eval()` mock that never installed because the real `PRAutoBlogger_Encryption`
|
||||||
|
|||||||
@@ -297,9 +297,9 @@ class PRAutoBlogger_Ideas_Browser {
|
|||||||
|
|
||||||
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
||||||
$total = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
$total = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||||
empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
? "SELECT COUNT(*) FROM {$table} {$where_sql}" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
? "SELECT COUNT(*) FROM {$table} {$where_sql}" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
: $wpdb->prepare( "SELECT COUNT(*) FROM {$table} {$where_sql}", ...$params )
|
: $wpdb->prepare( "SELECT COUNT(*) FROM {$table} {$where_sql}", ...$params ) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
||||||
);
|
);
|
||||||
|
|
||||||
$order_sql = 'ORDER BY analyzed_at DESC, relevance_score DESC';
|
$order_sql = 'ORDER BY analyzed_at DESC, relevance_score DESC';
|
||||||
@@ -307,9 +307,9 @@ class PRAutoBlogger_Ideas_Browser {
|
|||||||
$full_sql = "SELECT * FROM {$table} {$where_sql} {$order_sql} {$limit_sql}";
|
$full_sql = "SELECT * FROM {$table} {$where_sql} {$order_sql} {$limit_sql}";
|
||||||
|
|
||||||
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
||||||
$rows = empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
$rows = empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
? $wpdb->get_results( $full_sql, ARRAY_A ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
? $wpdb->get_results( $full_sql, ARRAY_A ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
: $wpdb->get_results( $wpdb->prepare( $full_sql, ...$params ), ARRAY_A );
|
: $wpdb->get_results( $wpdb->prepare( $full_sql, ...$params ), ARRAY_A ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'rows' => $rows ?? array(),
|
'rows' => $rows ?? array(),
|
||||||
|
|||||||
@@ -187,9 +187,9 @@ class PRAutoBlogger_Logger {
|
|||||||
// Total count.
|
// Total count.
|
||||||
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
||||||
$total = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
$total = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||||
empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
empty( $params ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
? "SELECT COUNT(*) FROM {$table} {$where_sql}" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
? "SELECT COUNT(*) FROM {$table} {$where_sql}" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared
|
||||||
: $wpdb->prepare( "SELECT COUNT(*) FROM {$table} {$where_sql}", ...$params )
|
: $wpdb->prepare( "SELECT COUNT(*) FROM {$table} {$where_sql}", ...$params ) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
||||||
);
|
);
|
||||||
|
|
||||||
// Rows.
|
// Rows.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* phpcs:ignore Generic.PHP.RequireStrictTypes.MissingDeclaration -- strict_types must precede docblock
|
* phpcs:ignore Generic.PHP.RequireStrictTypes.MissingDeclaration -- strict_types must precede docblock
|
||||||
@@ -23,12 +22,12 @@ declare(strict_types=1);
|
|||||||
* @see ARCHITECTURE.md — Full data flow and file tree
|
* @see ARCHITECTURE.md — Full data flow and file tree
|
||||||
* @see CONVENTIONS.md — Naming patterns and extension guides
|
* @see CONVENTIONS.md — Naming patterns and extension guides
|
||||||
*/
|
*/
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
// Abort if called directly.
|
// Abort if called directly.
|
||||||
if ( ! defined( 'ABSPATH' ) ) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Plugin Constants
|
| Plugin Constants
|
||||||
@@ -36,25 +35,21 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||||||
| Defined here so every file in the plugin can reference paths, versions,
|
| Defined here so every file in the plugin can reference paths, versions,
|
||||||
| and limits without magic strings.
|
| and limits without magic strings.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
define( 'PRAUTOBLOGGER_VERSION', '0.10.1' );
|
define( 'PRAUTOBLOGGER_VERSION', '0.10.1' );
|
||||||
define( 'PRAUTOBLOGGER_DB_VERSION', '1.1.0' );
|
define( 'PRAUTOBLOGGER_DB_VERSION', '1.1.0' );
|
||||||
define( 'PRAUTOBLOGGER_PLUGIN_FILE', __FILE__ );
|
define( 'PRAUTOBLOGGER_PLUGIN_FILE', __FILE__ );
|
||||||
define( 'PRAUTOBLOGGER_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
define( 'PRAUTOBLOGGER_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
||||||
define( 'PRAUTOBLOGGER_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
define( 'PRAUTOBLOGGER_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
||||||
define( 'PRAUTOBLOGGER_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
|
define( 'PRAUTOBLOGGER_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
|
||||||
|
|
||||||
// API and retry limits — named constants instead of magic numbers.
|
// API and retry limits — named constants instead of magic numbers.
|
||||||
define( 'PRAUTOBLOGGER_MAX_RETRIES', 3 );
|
define( 'PRAUTOBLOGGER_MAX_RETRIES', 3 );
|
||||||
define( 'PRAUTOBLOGGER_RETRY_BASE_DELAY_SECONDS', 2 );
|
define( 'PRAUTOBLOGGER_RETRY_BASE_DELAY_SECONDS', 2 );
|
||||||
define( 'PRAUTOBLOGGER_API_TIMEOUT_SECONDS', 180 );
|
define( 'PRAUTOBLOGGER_API_TIMEOUT_SECONDS', 180 );
|
||||||
define( 'PRAUTOBLOGGER_CACHE_TTL_SECONDS', 3600 );
|
define( 'PRAUTOBLOGGER_CACHE_TTL_SECONDS', 3600 );
|
||||||
|
|
||||||
// Default models for OpenRouter (user can override in settings).
|
// Default models for OpenRouter (user can override in settings).
|
||||||
define( 'PRAUTOBLOGGER_DEFAULT_ANALYSIS_MODEL', 'google/gemini-2.5-flash-lite' );
|
define( 'PRAUTOBLOGGER_DEFAULT_ANALYSIS_MODEL', 'google/gemini-2.5-flash-lite' );
|
||||||
define( 'PRAUTOBLOGGER_DEFAULT_WRITING_MODEL', 'google/gemini-2.5-flash-lite' );
|
define( 'PRAUTOBLOGGER_DEFAULT_WRITING_MODEL', 'google/gemini-2.5-flash-lite' );
|
||||||
define( 'PRAUTOBLOGGER_DEFAULT_EDITOR_MODEL', 'google/gemini-2.5-flash-lite' );
|
define( 'PRAUTOBLOGGER_DEFAULT_EDITOR_MODEL', 'google/gemini-2.5-flash-lite' );
|
||||||
|
|
||||||
// Image generation defaults.
|
// Image generation defaults.
|
||||||
// Default provider is Runware; OpenRouter (Gemini) remains as the alternate.
|
// Default provider is Runware; OpenRouter (Gemini) remains as the alternate.
|
||||||
// Default model is FLUX.1 schnell via Runware (~$0.0006/image, ~2s). CEO
|
// Default model is FLUX.1 schnell via Runware (~$0.0006/image, ~2s). CEO
|
||||||
@@ -63,7 +58,6 @@ define( 'PRAUTOBLOGGER_DEFAULT_EDITOR_MODEL', 'google/gemini-2.5-flash-lite' );
|
|||||||
// override via Settings → Images → Image Model.
|
// override via Settings → Images → Image Model.
|
||||||
define( 'PRAUTOBLOGGER_DEFAULT_IMAGE_PROVIDER', 'runware' );
|
define( 'PRAUTOBLOGGER_DEFAULT_IMAGE_PROVIDER', 'runware' );
|
||||||
define( 'PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL', 'runware:100@1' );
|
define( 'PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL', 'runware:100@1' );
|
||||||
|
|
||||||
// Default style suffix appended to every image-gen prompt. Updated
|
// Default style suffix appended to every image-gen prompt. Updated
|
||||||
// 2026-04-18 v4: single-panel newspaper comic style. Caption is now
|
// 2026-04-18 v4: single-panel newspaper comic style. Caption is now
|
||||||
// inserted as HTML text below the image, NOT rendered inside it.
|
// inserted as HTML text below the image, NOT rendered inside it.
|
||||||
@@ -72,30 +66,24 @@ define(
|
|||||||
'PRAUTOBLOGGER_DEFAULT_IMAGE_STYLE_SUFFIX',
|
'PRAUTOBLOGGER_DEFAULT_IMAGE_STYLE_SUFFIX',
|
||||||
'Style: a single-panel newspaper comic in classic black ink on white paper, simple clean linework like The Far Side or B.C., slightly yellowed newsprint texture, hand-drawn crosshatching for shading, bold panel border, warm and humorous tone, visible in a newspaper comics section. IMPORTANT: Do not render any text, captions, speech bubbles, or words inside the image.'
|
'Style: a single-panel newspaper comic in classic black ink on white paper, simple clean linework like The Far Side or B.C., slightly yellowed newsprint texture, hand-drawn crosshatching for shading, bold panel border, warm and humorous tone, visible in a newspaper comics section. IMPORTANT: Do not render any text, captions, speech bubbles, or words inside the image.'
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Autoloader
|
| Autoloader
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once PRAUTOBLOGGER_PLUGIN_DIR . 'includes/class-autoloader.php';
|
require_once PRAUTOBLOGGER_PLUGIN_DIR . 'includes/class-autoloader.php';
|
||||||
PRAutoBlogger_Autoloader::register();
|
PRAutoBlogger_Autoloader::register();
|
||||||
|
|
||||||
// The main orchestrator class is loaded explicitly because its CamelCase name
|
// The main orchestrator class is loaded explicitly because its CamelCase name
|
||||||
// (PRAutoBlogger) doesn't map cleanly to a filename via the autoloader's
|
// (PRAutoBlogger) doesn't map cleanly to a filename via the autoloader's
|
||||||
// kebab-case convention (it would look for class-pr-auto-blogger.php).
|
// kebab-case convention (it would look for class-pr-auto-blogger.php).
|
||||||
require_once PRAUTOBLOGGER_PLUGIN_DIR . 'includes/class-prautoblogger.php';
|
require_once PRAUTOBLOGGER_PLUGIN_DIR . 'includes/class-prautoblogger.php';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Activation & Deactivation
|
| Activation & Deactivation
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
register_activation_hook( __FILE__, array( 'PRAutoBlogger_Activator', 'activate' ) );
|
register_activation_hook( __FILE__, array( 'PRAutoBlogger_Activator', 'activate' ) );
|
||||||
register_deactivation_hook( __FILE__, array( 'PRAutoBlogger_Deactivator', 'deactivate' ) );
|
register_deactivation_hook( __FILE__, array( 'PRAutoBlogger_Deactivator', 'deactivate' ) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Boot the Plugin
|
| Boot the Plugin
|
||||||
@@ -103,7 +91,6 @@ register_deactivation_hook( __FILE__, array( 'PRAutoBlogger_Deactivator', 'deact
|
|||||||
| The main orchestrator registers all hooks. Nothing else happens here —
|
| The main orchestrator registers all hooks. Nothing else happens here —
|
||||||
| keep the bootstrap file minimal.
|
| keep the bootstrap file minimal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the singleton instance of the main plugin class.
|
* Returns the singleton instance of the main plugin class.
|
||||||
*
|
*
|
||||||
@@ -116,7 +103,6 @@ function prautoblogger(): PRAutoBlogger {
|
|||||||
}
|
}
|
||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize on plugins_loaded so all dependencies are available.
|
// Initialize on plugins_loaded so all dependencies are available.
|
||||||
add_action(
|
add_action(
|
||||||
'plugins_loaded',
|
'plugins_loaded',
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* phpcs:ignore Generic.PHP.RequireStrictTypes.MissingDeclaration -- strict_types must precede docblock
|
* phpcs:ignore Generic.PHP.RequireStrictTypes.MissingDeclaration -- strict_types must precede docblock
|
||||||
*
|
*
|
||||||
@@ -11,6 +9,7 @@ declare(strict_types=1);
|
|||||||
*
|
*
|
||||||
* @see class-deactivator.php — Lighter cleanup on deactivation (preserves data).
|
* @see class-deactivator.php — Lighter cleanup on deactivation (preserves data).
|
||||||
*/
|
*/
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
// Abort if not called by WordPress uninstall process.
|
// Abort if not called by WordPress uninstall process.
|
||||||
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user