diff --git a/admin/class-pn-admin-field-renderers.php b/admin/class-pn-admin-field-renderers.php index 87a852c..84d4b43 100644 --- a/admin/class-pn-admin-field-renderers.php +++ b/admin/class-pn-admin-field-renderers.php @@ -144,91 +144,15 @@ class Peptide_News_Admin_Field_Renderers { ); } - public static function render_filter_enabled_field(): void { - $value = get_option( 'peptide_news_filter_enabled', 1 ); - printf( - '', - checked( $value, 1, false ), - esc_html__( 'Filter out ads, press releases, and promotional content during fetch', 'peptide-news' ) - ); - } + // ── Filter field proxies — @see Peptide_News_Admin_Filter_Field_Renderers ── - public static function render_filter_sensitivity_field(): void { - $value = get_option( 'peptide_news_filter_sensitivity', 'moderate' ); - $options = array( - 'strict' => __( 'Strict — block aggressively (may catch some legitimate articles)', 'peptide-news' ), - 'moderate' => __( 'Moderate — balanced filtering (recommended)', 'peptide-news' ), - 'lenient' => __( 'Lenient — only block obvious promotional content', 'peptide-news' ), - ); - - echo ''; - } - - public static function render_filter_llm_enabled_field(): void { - $value = get_option( 'peptide_news_filter_llm_enabled', 0 ); - printf( - '', - checked( $value, 1, false ), - esc_html__( 'Use LLM to classify borderline articles (requires AI Analysis to be enabled)', 'peptide-news' ) - ); - } - - public static function render_filter_llm_model_field(): void { - $value = get_option( 'peptide_news_filter_llm_model', '' ); - printf( - '', - esc_attr( $value ) - ); - echo '

' . esc_html__( 'OpenRouter model for content classification. Leave blank to use the Keywords Model above.', 'peptide-news' ) . '

'; - } - - public static function render_filter_title_keywords_field(): void { - $value = get_option( 'peptide_news_filter_title_keywords', '' ); - $placeholder = class_exists( 'Peptide_News_Content_Filter' ) - ? Peptide_News_Content_Filter::get_default_title_keywords_text() - : ''; - printf( - '', - esc_attr( $placeholder ), - esc_textarea( $value ) - ); - echo '

' . esc_html__( 'One keyword/phrase per line. Articles with these in the title are blocked. Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; - } - - public static function render_filter_body_keywords_field(): void { - $value = get_option( 'peptide_news_filter_body_keywords', '' ); - $placeholder = class_exists( 'Peptide_News_Content_Filter' ) - ? Peptide_News_Content_Filter::get_default_body_keywords_text() - : ''; - printf( - '', - esc_attr( $placeholder ), - esc_textarea( $value ) - ); - echo '

' . esc_html__( 'One keyword/phrase per line. Multiple matches in article body trigger filtering (threshold depends on sensitivity). Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; - } - - public static function render_filter_blocked_domains_field(): void { - $value = get_option( 'peptide_news_filter_blocked_domains', '' ); - $placeholder = class_exists( 'Peptide_News_Content_Filter' ) - ? Peptide_News_Content_Filter::get_default_blocked_domains_text() - : ''; - printf( - '', - esc_attr( $placeholder ), - esc_textarea( $value ) - ); - echo '

' . esc_html__( 'One domain per line. Articles from these sources are always blocked. Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; - } + public static function render_filter_enabled_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_enabled_field(); } + public static function render_filter_sensitivity_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_sensitivity_field(); } + public static function render_filter_llm_enabled_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_llm_enabled_field(); } + public static function render_filter_llm_model_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_llm_model_field(); } + public static function render_filter_title_keywords_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_title_keywords_field(); } + public static function render_filter_body_keywords_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_body_keywords_field(); } + public static function render_filter_blocked_domains_field(): void { Peptide_News_Admin_Filter_Field_Renderers::render_filter_blocked_domains_field(); } public static function render_llm_enabled_field(): void { $value = get_option( 'peptide_news_llm_enabled', 0 ); diff --git a/admin/class-pn-admin-filter-field-renderers.php b/admin/class-pn-admin-filter-field-renderers.php new file mode 100644 index 0000000..b6003dc --- /dev/null +++ b/admin/class-pn-admin-filter-field-renderers.php @@ -0,0 +1,103 @@ + %s', + checked( $value, 1, false ), + esc_html__( 'Filter out ads, press releases, and promotional content during fetch', 'peptide-news' ) + ); + } + + public static function render_filter_sensitivity_field(): void { + $value = get_option( 'peptide_news_filter_sensitivity', 'moderate' ); + $options = array( + 'strict' => __( 'Strict — block aggressively (may catch some legitimate articles)', 'peptide-news' ), + 'moderate' => __( 'Moderate — balanced filtering (recommended)', 'peptide-news' ), + 'lenient' => __( 'Lenient — only block obvious promotional content', 'peptide-news' ), + ); + + echo ''; + } + + public static function render_filter_llm_enabled_field(): void { + $value = get_option( 'peptide_news_filter_llm_enabled', 0 ); + printf( + '', + checked( $value, 1, false ), + esc_html__( 'Use LLM to classify borderline articles (requires AI Analysis to be enabled)', 'peptide-news' ) + ); + } + + public static function render_filter_llm_model_field(): void { + $value = get_option( 'peptide_news_filter_llm_model', '' ); + printf( + '', + esc_attr( $value ) + ); + echo '

' . esc_html__( 'OpenRouter model for content classification. Leave blank to use the Keywords Model above.', 'peptide-news' ) . '

'; + } + + public static function render_filter_title_keywords_field(): void { + $value = get_option( 'peptide_news_filter_title_keywords', '' ); + $placeholder = class_exists( 'Peptide_News_Content_Filter' ) + ? Peptide_News_Content_Filter::get_default_title_keywords_text() + : ''; + printf( + '', + esc_attr( $placeholder ), + esc_textarea( $value ) + ); + echo '

' . esc_html__( 'One keyword/phrase per line. Articles with these in the title are blocked. Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; + } + + public static function render_filter_body_keywords_field(): void { + $value = get_option( 'peptide_news_filter_body_keywords', '' ); + $placeholder = class_exists( 'Peptide_News_Content_Filter' ) + ? Peptide_News_Content_Filter::get_default_body_keywords_text() + : ''; + printf( + '', + esc_attr( $placeholder ), + esc_textarea( $value ) + ); + echo '

' . esc_html__( 'One keyword/phrase per line. Multiple matches in article body trigger filtering (threshold depends on sensitivity). Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; + } + + public static function render_filter_blocked_domains_field(): void { + $value = get_option( 'peptide_news_filter_blocked_domains', '' ); + $placeholder = class_exists( 'Peptide_News_Content_Filter' ) + ? Peptide_News_Content_Filter::get_default_blocked_domains_text() + : ''; + printf( + '', + esc_attr( $placeholder ), + esc_textarea( $value ) + ); + echo '

' . esc_html__( 'One domain per line. Articles from these sources are always blocked. Leave empty to use built-in defaults.', 'peptide-news' ) . '

'; + } +} diff --git a/includes/class-peptide-news.php b/includes/class-peptide-news.php index 184f7e1..476c0a6 100755 --- a/includes/class-peptide-news.php +++ b/includes/class-peptide-news.php @@ -55,6 +55,7 @@ class Peptide_News { require_once PEPTIDE_NEWS_PLUGIN_DIR . 'includes/class-peptide-news-cost-tracker.php'; require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-assets.php'; require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-menu.php'; + require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-filter-field-renderers.php'; require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-field-renderers.php'; require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-settings.php'; require_once PEPTIDE_NEWS_PLUGIN_DIR . 'admin/class-pn-admin-log-viewer.php';