Automattic\WooCommerce\Internal\PushNotifications\Triggers
StockNotificationTrigger{}
Listens for WooCommerce stock events and feeds stock notifications into the PendingNotificationStore.
No Hooks.
Usage
$StockNotificationTrigger = new StockNotificationTrigger(); // use class methods
Methods
- public on_backorder( array $args )
- public on_low_stock( WC_Product $product )
- public on_no_stock( WC_Product $product )
- public register()
- private add_notification( int $product_id, string $event_type, ?int $stock_quantity_at_trigger = null )
Changelog
| Since 10.9.0 | Introduced. |
StockNotificationTrigger{} StockNotificationTrigger{} code WC 10.9.1
class StockNotificationTrigger {
/**
* Registers WordPress hooks for stock events.
*
* @return void
*
* @since 10.9.0
*/
public function register(): void {
add_action( 'woocommerce_low_stock', array( $this, 'on_low_stock' ) );
add_action( 'woocommerce_no_stock', array( $this, 'on_no_stock' ) );
add_action( 'woocommerce_product_on_backorder', array( $this, 'on_backorder' ) );
}
/**
* Handles the woocommerce_low_stock hook.
*
* Captures the product's stock quantity at this moment so the dispatcher,
* which runs in a separate process and re-fetches the product, doesn't
* read a stale value if cache invalidation hasn't fully propagated.
*
* @param WC_Product $product The product whose stock is low.
* @return void
*
* @since 10.9.0
*/
public function on_low_stock( WC_Product $product ): void {
$stock = $product->get_stock_quantity();
$this->add_notification(
$product->get_id(),
StockNotification::EVENT_LOW_STOCK,
null !== $stock ? (int) $stock : null
);
}
/**
* Handles the woocommerce_no_stock hook.
*
* @param WC_Product $product The product that is out of stock.
* @return void
*
* @since 10.9.0
*/
public function on_no_stock( WC_Product $product ): void {
$this->add_notification( $product->get_id(), StockNotification::EVENT_OUT_OF_STOCK );
}
/**
* Handles the woocommerce_product_on_backorder hook.
*
* @param array $args Backorder event data.
* @phpstan-param array{product: WC_Product, order_id: int, quantity: int|float} $args
* @return void
*
* @since 10.9.0
*/
public function on_backorder( array $args ): void {
$product = $args['product'] ?? null;
if ( ! $product instanceof WC_Product ) {
return;
}
$this->add_notification( $product->get_id(), StockNotification::EVENT_ON_BACKORDER );
}
/**
* Creates a stock notification and adds it to the pending store.
*
* @param int $product_id The product ID.
* @param string $event_type The stock event type.
* @param int|null $stock_quantity_at_trigger Stock quantity at the moment WC fired the event, or null when not applicable.
* @return void
*/
private function add_notification( int $product_id, string $event_type, ?int $stock_quantity_at_trigger = null ): void {
if ( $product_id <= 0 ) {
return;
}
wc_get_container()->get( PendingNotificationStore::class )->add(
new StockNotification( $product_id, $event_type, $stock_quantity_at_trigger )
);
}
}