Recept: een actie aan de popup met snelle bestelacties toevoegen
Doel: een nieuw onderdeel in de popup met snelle bestelacties, met je eigen velden en een opslagactie die de WooCommerce-API gebruikt.
De actie
Een actie implementeert AddoBack\Modules\OrderActions\QuickActionInterface. De popup en de REST-route pikken geregistreerde acties zonder verdere wijzigingen op.
id(): stabiel id, gebruikt in de REST-route. Kleine letters, cijfers, streepjes en underscores.label(): label van de opslaan-knop. Leeg voor een onderdeel zonder opslaan, zoals links.section(): kop van het popuponderdeel.priority(): positie in de popup, lager komt eerst.available( $order, $user ): of de actie wordt aangeboden voor deze bestelling en gebruiker. Een ontbrekende actie blijft uit de popup en wordt door de REST-route geweigerd.render( $order ): de velden, geëscaped. Veldnamen zijn gewoon, zonder prefix.handle( $order, $input ): voert de actie uit. Geef een array met minstensmessageterug, of eenWP_Error.
use AddoBack\Modules\OrderActions\QuickActionInterface;
final class Priority_Action implements QuickActionInterface {
public function id(): string {
return 'myplugin_priority';
}
public function label(): string {
return __( 'Save priority', 'myplugin' );
}
public function section(): string {
return __( 'Priority', 'myplugin' );
}
public function priority(): int {
return 50;
}
public function available( \WC_Order $order, \WP_User $user ): bool {
return user_can( $user, 'edit_shop_orders' );
}
public function render( \WC_Order $order ): string {
$current = (string) $order->get_meta( '_myplugin_priority' );
return '<select name="level"><option value="low"' . selected( $current, 'low', false ) . '>' . esc_html__( 'Low', 'myplugin' )
. '</option><option value="high"' . selected( $current, 'high', false ) . '>' . esc_html__( 'High', 'myplugin' ) . '</option></select>';
}
public function handle( \WC_Order $order, array $input ) {
$level = isset( $input['level'] ) && 'high' === $input['level'] ? 'high' : 'low';
$order->update_meta_data( '_myplugin_priority', $level );
$order->save(); // The same WooCommerce API as the order screen, so all hooks fire.
return array( 'message' => __( 'Priority saved.', 'myplugin' ) );
}
}
Registreren
add_filter( 'adba_order_quick_actions', static function ( array $actions ) {
$actions[] = new Priority_Action();
return $actions;
} );
Gerelateerd
- Hooks voor klanten en bestellingen
- Palettecommando's met stappen: dezelfde klus vanuit de command palette.
- JavaScript-API: de filter
adba.orderQuickActionswijzigt de onderdelen in de browser.