Products have always been posts, which is why a catalogue of any size ends up fighting wp_postmeta. The CRUD layer puts a data store between the object and its storage, and the store is replaceable.
add_filter( 'woocommerce_data_stores', function ( $stores ) {
$stores['product'] = 'Shop_Product_Table_Store';
return $stores;
} );
class Shop_Product_Table_Store extends WC_Product_Data_Store_CPT
{
public function read( &$product ) { /* from your own table */ }
}
Nothing in the plugin or in a template needs to know, because everything now goes through wc_get_product(). That is the prize, and it is a prize for later — the interfaces are new and the CPT store is the only complete implementation this year. What it changes today is that the door exists, which it did not in 2.6.