Files
bdm 0bd78e587a Resolve the known issues; switch licence to GPL
Closes the three problems that blocked the consolidation and records the rest
as tasks.

Licence: GPLv2 or later (WordPress.org compatible)

  LICENSE is now the full GPLv2 text and NOTICE is gone (it was Apache
  specific). All 101 SPDX headers read GPL-2.0-or-later and every shipped
  header says "GPLv2 or later".

  This also fixes an inconsistency that predated the consolidation: the theme's
  style.css declared GPLv2 while its PHP files carried Apache headers.

  Old/ and archive/pre-umbra-releases/ keep their original Apache headers on
  purpose -- they are frozen snapshots, not shipped code.

Schema: the catalogue schema is canonical for bd_books and bd_series

  Adds Umbra_Schema_Migration. The catalogue and library modules previously
  both created those two tables with different columns, so whichever plugin
  activated first won and the other read and wrote against the wrong shape.

  The migration detects a library-shaped table, RENAMES it aside (never drops
  it), creates the canonical table and copies rows across:

    - book IDs preserved, keeping bd_book_meta, bd_reviews, bd_ratings and
      bd_review_shortlinks valid
    - title/slug/description resolved from the linked post
    - the library's single isbn/asin land on the ebook columns; amazon_asin is
      also set so existing product links keep working
    - series migrated first so books.series_id still resolves
    - post linkage rewritten as _bd_bookshelf_book_id (preserved meta key)
    - publish_date kept as _bd_bookshelf_publish_date (no catalogue column)
    - bd_ratings goodreads/amazon folded into rating_goodreads/rating_amazon
    - rows whose post is gone are skipped with a log line, not turned into
      unusable books
    - duplicate slugs de-duplicated, since catalogue slug is UNIQUE

  It runs before dbDelta, and on admin_init as well as activation, because
  plugin updates do not re-run activation hooks. Ordering matters: dbDelta adds
  columns but never drops them, so pointed at a library-shaped table it would
  graft on catalogue columns and leave a table satisfying neither schema.

  Umbra_Bookshelf_Helper_Install no longer creates bd_books or bd_series.

Scraping: Goodreads only, one implementation

  There were three Goodreads implementations and two Amazon ones; both library
  "scrapers" were empty stubs attached to cron events that fired on schedule to
  do nothing, and both real scraper classes were never called at all.

  Umbra_Amazon_Scraper is deleted and the duplicate HTML parsing is gone from
  Umbra_Rating_Sync, which now delegates to Umbra_Goodreads_Scraper. The two
  library stubs and their cron registrations are removed. One schedule
  survives: bd_bookshelf_sync_ratings, every 12 hours.

  The rating_amazon column is retained (it holds data and is populated during
  migration) and Amazon retail links are unaffected.

  A new rating fetch failure keeps the last known value instead of writing zero.
  The admin ratings notice no longer warns about Amazon scraping.

Umbra_SEO is now instantiated

  It registers its hooks from a constructor and the bootstrap never constructed
  it, so the class was dead code and no SEO output was produced. Its meta, Open
  Graph, Twitter card and sitemap hooks now attach. Completing SEO for generated
  book detail pages is docs/TASKS.md #2.

Assets that 404'd

  - assets/images/default-cover.png now holds a real 512x815 cover
    (WorkingTitleCover_512x815.png). The helper returned this path but the
    repository contained no images at all.
  - email/assets/js/admin.js is committed as an empty placeholder. It was
    enqueued on every email admin page but had never been committed.

Tests

  - tests/schema_migration_test.php: 42 checks against a real database, driven
    through the sqlite3 CLI on a throwaway file. Covers shape detection, row
    mapping, ID preservation, orphan handling, rating folding, idempotency and
    slug collisions.
  - tests/run_all.sh runs every suite.
  - The declared version is now checked against the plugin header rather than a
    literal, so a version bump cannot silently break the suite.

Docs

  - KNOWN-ISSUES.md rewritten: three resolved, three remaining.
  - TASKS.md added: email admin behaviour, book detail page SEO, batching the
    rating sync, reclaiming legacy tables, reconciling the two book models,
    retiring the Old/ archive.
  - SPEC and ARCHITECTURE updated for schema ownership, the migration ordering
    constraint, and the single scraper.

Version 1.1.0.
2026-10-22 09:47:00 -07:00
..

=== BD Bookshelf ===
Contributors: bdmurphy
Requires at least: 6.0
Tested up to: 6.4
Requires PHP: 7.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Copyright 2026 B.D. Murphy

Custom WordPress theme for B.D. Murphy's author website featuring book showcase, series management, blog, and reviews. Focused on presenting and selling books. With plugin support the work to launch and manage books will be reduced. bd-bookshelf plugin will provide basic help and bd-bookshelfhelper will be a full book title management system.

== Description ==

BD Bookshelf is a custom WordPress theme designed for authors who want to showcase their books, publish blog posts, manage reviews, and connect with readers. The theme is fully Customizer-driven, allowing you to configure colors, typography, and display options without touching code.

Features:

* Full-width banner with Reading Through Time artwork
* Sticky navigation menu with mobile hamburger support
* Book showcase page with cover grid and Goodreads integration
* Blog page with category filtering and pagination
* Reviews page with Goodreads sidebar widget
* About page with author bio, awards, and newsletter signup
* Social sharing buttons (Facebook, X/Twitter, LinkedIn, WhatsApp, Copy Link)
* Customizable colors, fonts, and display options via Customizer
* Responsive design for all screen sizes
* Accessible with skip links, ARIA labels, and keyboard navigation

== Installation ==

1. Upload the `bd-murphy-author` folder to `/wp-content/themes/`
2. Activate the theme through the 'Themes' menu in WordPress
3. Go to Appearance > Customize to configure your settings
4. Set a static front page in Settings > Reading if desired
5. Create a navigation menu under Appearance > Menus

== Frequently Asked Questions ==

= How do I change the banner image? =

Go to Appearance > Customize > Header Image. You can upload your own image or use the default Reading Through Time banner.

= How do I configure the Goodreads widget? =

Go to Appearance > Customize > Author Book Settings. Enter your Goodreads Author ID. Then go to Display Options and enable "Goodreads Integration" to allow the theme to fetch data from Goodreads.

= How do I add book covers to the Books page? =

The theme includes default book covers as examples. With the companion BD BookShelfHelper plugin, you can add your own books via the BD BookHelper admin menu.

= Does this theme work with block editor? =

Yes. The theme supports the WordPress block editor (Gutenberg) for page and post content.

= What plugins does this theme work with? =

The theme is designed to work standalone or with the companion BD BookShelfHelper plugin for enhanced book management and BD SimpleEmail for newsletter management.

== Changelog ==

= 2.2.10 =
* Version bump to 2.2.10

= 2.2.9 =
* Renamed theme folder to bd-bookshelf to match text domain slug
* Added copyright notice to readme.txt
* Fixed copyright notice format in style.css
* Added comments_template() to page templates
* Fixed hard-coded link in theme-admin.php
* Version bump to 2.2.9

= 2.2.8 =
* Added comments.php template with wp_list_comments, comment_form, and paginate_comments_links
* Added register_block_style and register_block_pattern support
* Added tag display in blog templates
* Fixed copyright notice format for WordPress.org validation
* Version bump to 2.2.8

= 2.2.7 =
* Version bump to 2.2.7 for WordPress.org submission

= 2.2.6 =
* Fixed duplicate Theme URI and Author URI validation error
* Added required Tags line to style.css header
* Added copyright notice to style.css
* Changed text domain from bd-murphy to bd-bookshelf to match theme slug
* Added wp_link_pages to page templates
* Enqueued no-js script properly instead of inline in header.php
* Added responsive-embeds and align-wide theme support
* Added screen-reader-text CSS class
* Added required WordPress CSS classes (wp-caption, alignright, alignleft, aligncenter, etc.)
* Replaced include() with get_template_part() in short-urls.php
* Version bump to 2.2.6

= 2.2.5 =
* Verified front-page sidebar layout (66%/34% grid working correctly)
* Confirmed all page templates render properly (Home, Books, About, Reviews)
* Full WordPress.org theme review compliance confirmed

= 2.2.3 =
* Changed Goodreads widget sort order to total review count (most reviews first)
* Added opt-in consent for Goodreads remote fetching
* Added transient caching for Goodreads data (24 hours)
* Bundled Google Fonts locally for privacy compliance
* Fixed PHP errors in archive-book.php and archive-series.php templates
* Fixed unquoted sidebar ID in page.php
* Added missing readme.txt
* Updated theme screenshots

= 2.2.1 =
* Changed Goodreads widget to show top 6 books sorted by rating
* Fixed usort comparison for rating sort

= 2.2.0 =
* Fixed duplicate Goodreads widget on homepage
* Added Goodreads widget to sidebar for all pages except Books
* Added configurable Newsletter Signup and Sign Up for Updates display options
* Reordered navigation menu: Home, Books, Blogs, Reviews, About
* Fixed footer links to display as vertical list
* Fixed banner to fill screen width on all pages
* Added Books page with grid layout and default book cover examples

= 2.1.0 =
* Initial release with Customizer settings, Goodreads widget, social sharing

== Upgrade Notice ==

= 2.2.9 =
This update fixes copyright notice and adds comments template support.

= 2.2.8 =
This update adds comments support, block styles/patterns, and tag display for full WordPress.org compliance.

= 2.2.7 =
WordPress.org submission ready.

= 2.2.6 =
This update addresses all WordPress.org theme validation requirements including text domain, copyright notice, required CSS classes, and proper script enqueuing.

= 2.2.5 =
This update confirms full WordPress.org theme review compliance and correct layout across all page templates.

= 2.2.3 =
This update addresses WordPress.org theme review requirements including privacy compliance, bundled fonts, and template fixes. Enable Goodreads integration in Customizer > Display Options after upgrading.

== Resources ==

* Banner image: Custom Reading Through Time artwork, B.D. Murphy (author), used with permission
* Author icon: Custom quill pen logo, B.D. Murphy (author), used with permission
* Book cover images: Used under fair use for demonstration purposes
* Fonts: Playfair Display and Lato by Google Fonts, SIL Open Font License