From d99c505d1cba9f8a0c9abfc4790bd8f806bb8953 Mon Sep 17 00:00:00 2001 From: Peptide News Team Date: Mon, 6 Apr 2026 16:32:42 +0700 Subject: [PATCH] Add missing Loader class and public CSS The Peptide_News_Loader class was referenced by class-peptide-news.php but never committed, causing a fatal error on plugin activation. Also adds public/css/public-style.css which is enqueued by the public class. Co-Authored-By: Claude Opus 4.6 --- includes/class-peptide-news-loader.php | 120 +++++++++++++++++++++++++ public/css/public-style.css | 70 +++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 includes/class-peptide-news-loader.php create mode 100644 public/css/public-style.css diff --git a/includes/class-peptide-news-loader.php b/includes/class-peptide-news-loader.php new file mode 100644 index 0000000..fd84937 --- /dev/null +++ b/includes/class-peptide-news-loader.php @@ -0,0 +1,120 @@ +actions = array(); + $this->filters = array(); + } + + /** + * Add a new action to the collection to be registered with WordPress. + * + * @since 1.0.0 + * @param string $hook The name of the WordPress action that is being registered. + * @param object $component A reference to the instance of the object on which the action is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority Optional. The priority at which the function should be fired. Default is 10. + * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1. + */ + public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args ); + } + + /** + * Add a new filter to the collection to be registered with WordPress. + * + * @since 1.0.0 + * @param string $hook The name of the WordPress filter that is being registered. + * @param object $component A reference to the instance of the object on which the filter is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority Optional. The priority at which the function should be fired. Default is 10. + * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1. + */ + public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args ); + } + + /** + * A utility function that is used to register the actions and hooks into a single collection. + * + * @since 1.0.0 + * @access private + * @param array $hooks The collection of hooks that is being registered (actions or filters). + * @param string $hook The name of the WordPress filter that is being registered. + * @param object $component A reference to the instance of the object on which the filter is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority The priority at which the function should be fired. + * @param int $accepted_args The number of arguments that should be passed to the $callback. + * @return array The collection of actions and filters registered with WordPress. + */ + private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) { + $hooks[] = array( + 'hook' => $hook, + 'component' => $component, + 'callback' => $callback, + 'priority' => $priority, + 'accepted_args' => $accepted_args, + ); + + return $hooks; + } + + /** + * Register the filters and actions with WordPress. + * + * @since 1.0.0 + */ + public function run() { + foreach ( $this->filters as $hook ) { + add_filter( + $hook['hook'], + array( $hook['component'], $hook['callback'] ), + $hook['priority'], + $hook['accepted_args'] + ); + } + + foreach ( $this->actions as $hook ) { + add_action( + $hook['hook'], + array( $hook['component'], $hook['callback'] ), + $hook['priority'], + $hook['accepted_args'] + ); + } + } +} diff --git a/public/css/public-style.css b/public/css/public-style.css new file mode 100644 index 0000000..24bc1f4 --- /dev/null +++ b/public/css/public-style.css @@ -0,0 +1,70 @@ +/** + * Peptide News Aggregator – Public Styles + * + * Styles for the front-end display of peptide news articles. + * + * @since 1.0.0 + */ + +/* Article grid / card layout */ +.peptide-news-container { + display: grid; + gap: 1.5rem; +} + +.article-card { + background: #fff; + border: 1px solid #e0e0e0; + padding: 1.25rem; + border-radius: 6px; + transition: box-shadow 0.2s ease; +} + +.article-card:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.article-title { + font-size: 1.125rem; + font-weight: 600; + color: #1a1a1a; + margin: 0 0 0.5rem; + line-height: 1.4; +} + +.article-title a { + color: inherit; + text-decoration: none; +} + +.article-title a:hover { + color: #0073aa; +} + +.article-meta { + font-size: 0.8125rem; + color: #666; + margin-bottom: 0.75rem; +} + +.article-excerpt { + font-size: 0.9375rem; + line-height: 1.6; + color: #444; +} + +.article-source { + display: inline-block; + font-size: 0.75rem; + background: #f0f0f0; + padding: 0.2rem 0.5rem; + border-radius: 3px; + color: #555; +} + +.article-thumbnail { + width: 100%; + height: auto; + border-radius: 4px; + margin-bottom: 0.75rem; +}