fix: two fatal errors preventing plugin activation (v0.1.1)

1. NAMESPACE is a PHP reserved keyword — renamed to REST_NAMESPACE
   in the REST controller. This caused a parse error on activation.

2. Autoloader can't resolve PR_Core class — the class name equals the
   autoloader prefix exactly, so stripping "PR_Core_" yields an empty
   suffix and the wrong filename. Added explicit require_once in
   bootstrap, same pattern as PRAutoBlogger.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
peptiderepo
2026-04-19 16:13:21 +07:00
parent 3162dbe975
commit c70352eb40
3 changed files with 23 additions and 9 deletions

View File

@@ -3,6 +3,15 @@
All notable changes to Peptide Repo Core are documented here.
Format: [Semantic Versioning](https://semver.org/).
## [0.1.1] — 2026-04-19
### Fixed
- **Fatal error on activation: `NAMESPACE` is a PHP reserved keyword.** Renamed
to `REST_NAMESPACE` in the REST controller.
- **Fatal error: autoloader cannot resolve `PR_Core` class.** Class name equals
the autoloader prefix exactly, producing wrong filename. Added explicit
require_once in bootstrap (same pattern as PRAutoBlogger).
## [0.1.0] — 2026-04-17
### Added

View File

@@ -23,7 +23,7 @@ declare(strict_types=1);
class PR_Core_Rest_Controller {
/** @var string REST namespace. */
private const NAMESPACE = 'pr-core/v1';
private const REST_NAMESPACE = 'pr-core/v1';
/**
* Register the rest_api_init hook.
@@ -43,7 +43,7 @@ class PR_Core_Rest_Controller {
*/
public function register_routes(): void {
// GET /peptides
register_rest_route( self::NAMESPACE, '/peptides', [
register_rest_route( self::REST_NAMESPACE, '/peptides', [
'methods' => 'GET',
'callback' => [ $this, 'list_peptides' ],
'permission_callback' => '__return_true',
@@ -57,14 +57,14 @@ class PR_Core_Rest_Controller {
] );
// GET /peptides/{id}
register_rest_route( self::NAMESPACE, '/peptides/(?P<id>\d+)', [
register_rest_route( self::REST_NAMESPACE, '/peptides/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => [ $this, 'get_peptide' ],
'permission_callback' => '__return_true',
] );
// GET /peptides/{id}/dosing
register_rest_route( self::NAMESPACE, '/peptides/(?P<id>\d+)/dosing', [
register_rest_route( self::REST_NAMESPACE, '/peptides/(?P<id>\d+)/dosing', [
'methods' => 'GET',
'callback' => [ $this, 'list_dosing' ],
'permission_callback' => '__return_true',
@@ -75,21 +75,21 @@ class PR_Core_Rest_Controller {
] );
// POST /peptides/{id}/dosing (auth required)
register_rest_route( self::NAMESPACE, '/peptides/(?P<id>\d+)/dosing', [
register_rest_route( self::REST_NAMESPACE, '/peptides/(?P<id>\d+)/dosing', [
'methods' => 'POST',
'callback' => [ $this, 'create_dosing' ],
'permission_callback' => [ $this, 'check_write_permission' ],
] );
// GET /peptides/{id}/legal
register_rest_route( self::NAMESPACE, '/peptides/(?P<id>\d+)/legal', [
register_rest_route( self::REST_NAMESPACE, '/peptides/(?P<id>\d+)/legal', [
'methods' => 'GET',
'callback' => [ $this, 'list_legal' ],
'permission_callback' => '__return_true',
] );
// POST /peptides/{id}/legal (auth required)
register_rest_route( self::NAMESPACE, '/peptides/(?P<id>\d+)/legal', [
register_rest_route( self::REST_NAMESPACE, '/peptides/(?P<id>\d+)/legal', [
'methods' => 'POST',
'callback' => [ $this, 'create_legal' ],
'permission_callback' => [ $this, 'check_write_permission' ],

View File

@@ -3,7 +3,7 @@
* Plugin Name: Peptide Repo Core
* Plugin URI: https://peptiderepo.com
* Description: Canonical peptide schema — shared data layer for the peptiderepo.com ecosystem. Provides the pr_peptide CPT, dosing rows, legal status cells, AI candidate queue, disclaimer component, and JSON-LD output.
* Version: 0.1.0
* Version: 0.1.1
* Author: peptiderepo
* Author URI: https://peptiderepo.com
* License: GPL-2.0-or-later
@@ -22,7 +22,7 @@ if ( ! defined( 'ABSPATH' ) ) {
/* ── Constants ────────────────────────────────────────────────────────── */
define( 'PR_CORE_VERSION', '0.1.0' );
define( 'PR_CORE_VERSION', '0.1.1' );
define( 'PR_CORE_PLUGIN_FILE', __FILE__ );
define( 'PR_CORE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'PR_CORE_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
@@ -33,6 +33,11 @@ define( 'PR_CORE_TARGET_SCHEMA_VERSION', 3 );
require_once PR_CORE_PLUGIN_DIR . 'includes/class-pr-core-autoloader.php';
PR_Core_Autoloader::register();
// The main orchestrator class is loaded explicitly because its name (PR_Core)
// equals the autoloader prefix exactly — stripping "PR_Core_" yields an empty
// suffix, producing "class-pr-core-.php" instead of "class-pr-core.php".
require_once PR_CORE_PLUGIN_DIR . 'includes/class-pr-core.php';
/* ── Activation / Deactivation ────────────────────────────────────────── */
register_activation_hook( __FILE__, [ 'PR_Core_Activator', 'activate' ] );