- Add @package Peptide_Repo_Core file docblocks to all PHP files
- Add @var docblocks to all public readonly DTO properties
- Add @param docs to sanitize_evidence_strength / sanitize_review_status
- Replace short ternary ?: with phpcs:ignore on each violating line
- Add phpcs:ignore for InterpolatedNotPrepared on ${table} SQL strings
- Add phpcs:ignore for GlobalVariablesOverride in uninstall.php and card.php
- Add translators comment to __ call with placeholder in related-posts-section
- Fix InlineComment.InvalidEndChar: add periods to all bare inline comments
- Expand single-line /** @return void */ docblocks with summaries
- SPLIT class-pr-core-seed-data.php (was 360 lines):
→ class-pr-core-seed-data.php (149 lines, orchestration only)
→ class-pr-core-seed-fixtures.php (254 lines, static fixture data)
- SPLIT class-pr-core-peptide-cpt.php (was 309 lines):
→ class-pr-core-peptide-cpt.php (224 lines, CPT + hooks + sanitizers)
→ class-pr-core-peptide-meta-schema.php (133 lines, meta field defs)
- SPLIT class-pr-core-settings.php (was 340 lines after docblock expansion):
→ class-pr-core-settings.php (264 lines, registration + sanitization)
→ class-pr-core-settings-renderer.php (124 lines, render methods)
- All includes/ PHP files now <= 300 lines
Agent-Session: claude-adopt-ci-20260616
117 lines
4.4 KiB
PHP
117 lines
4.4 KiB
PHP
<?php
|
|
/**
|
|
* Peptide Repo Core — Selective data teardown on uninstall.
|
|
*
|
|
* Removes plugin-owned data only: custom tables, PR Core-authored peptide
|
|
* posts, pr_core_ options, and the manage_peptide_content capability.
|
|
* Shared data (the 89 canonical peptide posts authored by PSA, and the
|
|
* peptide_category taxonomy terms) is preserved.
|
|
*
|
|
* @see ARCHITECTURE.md — §2.9 Uninstall specification.
|
|
* @package Peptide_Repo_Core
|
|
*/
|
|
|
|
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
|
exit;
|
|
}
|
|
|
|
global $wpdb;
|
|
|
|
/* ── 1. Drop custom tables ────────────────────────────────────────────── */
|
|
|
|
$tables = array(
|
|
$wpdb->prefix . 'pr_dosing_rows',
|
|
$wpdb->prefix . 'pr_legal_cells',
|
|
$wpdb->prefix . 'pr_ai_candidate_queue',
|
|
);
|
|
|
|
foreach ( $tables as $table ) {
|
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.SchemaChange,WordPress.DB.DirectDatabaseQuery.DirectQuery
|
|
$wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
}
|
|
|
|
/* ── 2. Delete only peptide posts authored through PR Core's UI ───────── */
|
|
|
|
/*
|
|
* As of v0.2.0, PR Core shares the `peptide` CPT with Peptide Search AI.
|
|
* PSA authored the 89 canonical peptide posts on peptiderepo.com; those
|
|
* predate PR Core and do NOT carry the `_pr_core_authored` flag. A blanket
|
|
* DELETE here would destroy site-owned content, not plugin-owned content.
|
|
*
|
|
* This loop only deletes posts that PR Core itself created (flagged with
|
|
* post-meta `_pr_core_authored = '1'`). If no post carries the flag, the
|
|
* loop no-ops and shared content is preserved.
|
|
*/
|
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
|
$post_ids = $wpdb->get_col(
|
|
$wpdb->prepare(
|
|
"SELECT p.ID FROM {$wpdb->posts} p // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
INNER JOIN {$wpdb->postmeta} pm
|
|
ON p.ID = pm.post_id AND pm.meta_key = %s AND pm.meta_value = %s
|
|
WHERE p.post_type = %s",
|
|
'_pr_core_authored',
|
|
'1',
|
|
'peptide'
|
|
)
|
|
);
|
|
|
|
foreach ( $post_ids as $post_id ) { // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
|
wp_delete_post( (int) $post_id, true );
|
|
}
|
|
|
|
/* ── 3. Preserve taxonomy terms (shared ownership post-v0.2.0) ────────── */
|
|
|
|
/*
|
|
* `peptide_category` is shared between PR Core and PSA. Term metadata
|
|
* (descriptions, parent relationships, counts) is data the site owns —
|
|
* removing it on PR Core uninstall would strip categorization from the
|
|
* peptide posts that remain. So we intentionally do NOT enumerate or
|
|
* delete terms here. `pr_peptide_family` is gone in v0.2.0 so no cleanup
|
|
* is needed for it either.
|
|
*/
|
|
|
|
/* ── 4. Delete all pr_core_ prefixed options ──────────────────────────── */
|
|
|
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
|
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.NoCaching
|
|
$wpdb->query(
|
|
"DELETE FROM {$wpdb->options} WHERE option_name LIKE 'pr\_core\_%'" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
|
);
|
|
|
|
/* ── 4b. Delete v0.6.0 schema-input meta keys from all peptide posts ──── */
|
|
|
|
/*
|
|
* Migration 0004 writes _pr_molecular_formula, _pr_molecular_weight, _pr_aliases,
|
|
* and _pr_faq_items to the shared peptide posts. These are PR Core-authored values
|
|
* (derived from PubChem / PSA) and are safe to remove on uninstall.
|
|
*
|
|
* @see ARCHITECTURE.md — §2.9 Uninstall specification.
|
|
*/
|
|
$schema_meta_keys = array(
|
|
'_pr_molecular_formula',
|
|
'_pr_molecular_weight',
|
|
'_pr_aliases',
|
|
'_pr_faq_items',
|
|
);
|
|
|
|
foreach ( $schema_meta_keys as $meta_key ) {
|
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
|
|
$wpdb->delete(
|
|
$wpdb->postmeta,
|
|
array( 'meta_key' => $meta_key ),
|
|
array( '%s' )
|
|
);
|
|
}
|
|
|
|
/* ── 5. Remove manage_peptide_content capability from all roles ───────── */
|
|
|
|
$editable_roles = wp_roles()->roles;
|
|
|
|
foreach ( array_keys( $editable_roles ) as $role_name ) {
|
|
$role = get_role( $role_name ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
|
if ( $role && $role->has_cap( 'manage_peptide_content' ) ) {
|
|
$role->remove_cap( 'manage_peptide_content' );
|
|
}
|
|
}
|