[wp-trac] [WordPress Trac] #37692: Introduce WP_Database_Table base class

WordPress Trac noreply at wordpress.org
Wed Aug 17 13:23:29 UTC 2016


#37692: Introduce WP_Database_Table base class
-----------------------------+-----------------------------
 Reporter:  johnjamesjacoby  |      Owner:
     Type:  enhancement      |     Status:  new
 Priority:  normal           |  Milestone:  Awaiting Review
Component:  Database         |    Version:
 Severity:  normal           |   Keywords:  2nd-opinion
  Focuses:                   |
-----------------------------+-----------------------------
 I've always thought it odd that WordPress only versions blogs, and not
 each individual database table. On one hand, it's great that the schema
 changes rarely enough that WordPress core would not get a lot of use out
 of it. On the other, many plugins would benefit pretty hugely from a smart
 base class that encapsulated a lot of the procedural work of having custom
 database tables and maintaining a schema.

 BuddyPress, for example, comes with several object & metadata pairs, for
 groups, activity, friends, profiles, messages, notifications, etc... It
 currently takes WordPress's approach of having a big-dumb installer and a
 bunch of tangled together upgrade routines. I'd love it if each component
 could manage it's own schema on the fly, with it's own upgrade routines
 and database table classes to separate the responsibilities, but without
 needing to setup `admin_init` hooks and `version_compare()` checks for
 each component.

 Django has something similar currently, as do other open-source projects
 like Piwik, GitLab, Mattermost, etc...

 ----

 I'm imagining that each core database table would extend the `WP_DB_Table`
 class, each with their own `db_version` and their own methods for
 upgrading to newer versions.

 Global tables (like `wp_users`) would use `site_id` `-1` in the
 `wp_sitemeta` database table to distinguish them as global, and not per-
 network or per-site.

 ----

 This way, when a plugin like WooCommerce wants to introduce new database
 tables, they just extend the base class, pass in an array of column-keys &
 attributes, and the base class would handle the `$wpdb` table registration
 and all of the other bits and bobs.

 Eventually... eventually it could get paired up with some kind of a
 `WP_Base_Query` class to automatically handle cache-key assignments, and
 generate basic crud methods based on the parameters in the associated
 `WP_Database_Table` extension.

 ----

 I think this becomes particularly useful in REST applications, where
 WordPress's APIs can be used and extended for any manner of scalable data
 storage outside of the core database schemas.

 Obviously this is a huge idea with lots of moving parts, and without a
 core need ideas like this are pretty slow on the go. I am already starting
 to do something similar in my own plugins though - just without the base
 class - and it feels much easier to maintain each plugin knowing there is
 a similar convention between them.

 See: https://code.flox.io/stuttter/wp-site-aliases/blob/master/includes
 /class-wp-site-aliases-db-table.php

--
Ticket URL: <https://core.trac.wordpress.org/ticket/37692>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list