Reading $product->id or $order->billing_email has worked since the plugin existed, because they were public properties on an object wrapping a post. 3.0 makes them private with a magic…
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…
3.0 moved order item data into its own tables and left the old access functions working, which means a query written against the old shape returns results and…
The getter looks like ceremony over a property and is the entire point of the release: with the read going through a method, where the value comes from…
An order, a refund and a subscription are all shop_order-ish posts and are not the same class, so code type-hinting WC_Order breaks the first time a refund arrives.…
Every plugin reading _price from post meta is now reading a private field. The mechanical half, the half that is not, and the compatibility layer for code you…
WooCommerce maintains its own session handler backed by a database table and a cookie, entirely separate from $_SESSION. Code that starts a PHP session to store something cart-related…
Hooking save_post to react to an order being paid works occasionally and misses every transition made from a payment gateway callback, the REST API or WP-CLI. The status…