Automattic\WooCommerce\Internal\OrderWithdrawal
OrderWithdrawalController{} │ final │ WC 1.0└─ RegisterHooksInterface
Registers the order withdrawal endpoint and related feature-gated UI.
No Hooks.
Usage
$OrderWithdrawalController = new OrderWithdrawalController(); // use class methods
Methods
- public add_endpoint_setting( $settings )
- public add_query_var( $query_vars )
- public get_endpoint_title( $title )
- public init( OrderWithdrawalFormProcessor $form_processor, OrderWithdrawalFormView $form_view, OrderWithdrawalFeatureHighlightNotification $feature_highlight_notification )
- public is_enabled()
- public is_endpoint_request()
- public maybe_flush_rewrite_rules( string $feature_id )
- public maybe_register_feature_highlight_notification()
- public register()
- public render_view()
- private get_form_action_url()
- private get_shop_url()
- private get_template_args()
OrderWithdrawalController{} OrderWithdrawalController{} code WC 11.1.2
final class OrderWithdrawalController implements RegisterHooksInterface {
private const FEATURE_ID = 'order_withdrawal';
private const ENDPOINT_KEY = 'order-withdrawal';
private const ENDPOINT_SLUG = 'withdraw-order';
private const ENDPOINT_OPTION = 'woocommerce_myaccount_order_withdrawal_endpoint';
/**
* Form processor.
*
* @var OrderWithdrawalFormProcessor
*/
private OrderWithdrawalFormProcessor $form_processor;
/**
* Form view.
*
* @var OrderWithdrawalFormView
*/
private OrderWithdrawalFormView $form_view;
/**
* Feature highlight notification.
*
* @var OrderWithdrawalFeatureHighlightNotification
*/
private OrderWithdrawalFeatureHighlightNotification $feature_highlight_notification;
/**
* Initialize dependencies.
*
* @param OrderWithdrawalFormProcessor $form_processor Form processor.
* @param OrderWithdrawalFormView $form_view Form view.
* @param OrderWithdrawalFeatureHighlightNotification $feature_highlight_notification Feature highlight notification.
* @internal
*
* @since 11.1.0
*/
final public function init( OrderWithdrawalFormProcessor $form_processor, OrderWithdrawalFormView $form_view, OrderWithdrawalFeatureHighlightNotification $feature_highlight_notification ): void { // phpcs:ignore Generic.CodeAnalysis.UnnecessaryFinalModifier.Found -- Required by WooCommerce injection method rules.
$this->form_processor = $form_processor;
$this->form_view = $form_view;
$this->feature_highlight_notification = $feature_highlight_notification;
}
/**
* Register hooks.
*
* @since 11.1.0
*/
public function register(): void {
add_action( FeaturesController::FEATURE_ENABLED_CHANGED_ACTION, array( $this, 'maybe_flush_rewrite_rules' ), 10, 1 );
add_filter( 'woocommerce_get_query_vars', array( $this, 'add_query_var' ), 10, 1 );
add_filter( 'woocommerce_endpoint_' . self::ENDPOINT_KEY . '_title', array( $this, 'get_endpoint_title' ), 10, 1 );
add_filter( 'woocommerce_settings_pages', array( $this, 'add_endpoint_setting' ), 10, 1 );
add_action( 'woocommerce_account_' . self::ENDPOINT_KEY . '_endpoint', array( $this, 'render_view' ) );
add_action( 'woocommerce_before_delete_order', array( $this->form_processor, 'delete_order_withdrawal_inbox_note_for_order' ), 10, 1 );
add_action( 'before_delete_post', array( $this->form_processor, 'delete_order_withdrawal_inbox_note_for_order' ), 10, 1 );
add_action( 'woocommerce_privacy_remove_order_personal_data', array( $this->form_processor, 'delete_order_withdrawal_inbox_note_for_order' ), 10, 1 );
add_action( 'init', array( $this, 'maybe_register_feature_highlight_notification' ), 10, 0 );
}
/**
* Whether order withdrawal is enabled.
*
* @since 11.1.0
*/
public function is_enabled(): bool {
return FeaturesUtil::feature_is_enabled( self::FEATURE_ID );
}
/**
* Whether the current My Account request is for the public order withdrawal endpoint.
*
* @since 11.1.0
*/
public function is_endpoint_request(): bool {
global $wp;
return $this->is_enabled()
&& isset( $wp->query_vars[ self::ENDPOINT_KEY ] )
&& self::ENDPOINT_KEY === WC()->query->get_current_endpoint();
}
/**
* Queue a rewrite rules flush when the feature is toggled.
*
* @param string $feature_id Feature being toggled.
*
* @since 11.1.0
*/
public function maybe_flush_rewrite_rules( string $feature_id ): void {
if ( self::FEATURE_ID === $feature_id ) {
update_option( 'woocommerce_queue_flush_rewrite_rules', 'yes' );
}
}
/**
* Register the order withdrawal feature highlight notification if the feature is not enabled.
*
* @since 11.1.0
*/
public function maybe_register_feature_highlight_notification(): void {
if ( ! $this->is_enabled() ) {
$this->feature_highlight_notification->register();
}
}
/**
* Register the order withdrawal query var.
*
* @param array $query_vars Existing query vars keyed by endpoint key.
* @return array
*
* @since 11.1.0
*/
public function add_query_var( $query_vars ): array {
if ( ! is_array( $query_vars ) ) {
return array();
}
if ( $this->is_enabled() ) {
$query_vars[ self::ENDPOINT_KEY ] = (string) get_option( self::ENDPOINT_OPTION, self::ENDPOINT_SLUG );
}
return $query_vars;
}
/**
* Order withdrawal endpoint page title.
*
* @param string $title Default title.
* @return string
*
* @since 11.1.0
*/
public function get_endpoint_title( $title ): string {
return __( 'Withdraw from contract', 'woocommerce' );
}
/**
* Add the endpoint setting when the feature is enabled.
*
* @param array $settings Page settings.
* @return array
*
* @since 11.1.0
*/
public function add_endpoint_setting( $settings ): array {
if ( ! is_array( $settings ) ) {
return array();
}
if ( ! $this->is_enabled() ) {
return $settings;
}
$endpoint_setting = array(
'title' => __( 'Order withdrawal', 'woocommerce' ),
'desc' => __( 'Endpoint for the order withdrawal page.', 'woocommerce' ),
'id' => self::ENDPOINT_OPTION,
'type' => 'text',
'default' => self::ENDPOINT_SLUG,
'desc_tip' => true,
);
$new_settings = array();
$added = false;
foreach ( $settings as $setting ) {
if ( is_array( $setting ) && self::ENDPOINT_OPTION === ( $setting['id'] ?? '' ) ) {
return $settings;
}
if (
! $added &&
is_array( $setting ) &&
'sectionend' === ( $setting['type'] ?? '' ) &&
'account_endpoint_options' === ( $setting['id'] ?? '' )
) {
$new_settings[] = $endpoint_setting;
$added = true;
}
$new_settings[] = $setting;
}
if ( ! $added ) {
$new_settings[] = $endpoint_setting;
}
return $new_settings;
}
/**
* Render the order withdrawal view.
*
* @since 11.1.0
*/
public function render_view(): void {
if ( ! $this->is_enabled() ) {
return;
}
wc_get_template( 'myaccount/form-order-withdrawal.php', $this->get_template_args() );
}
/**
* Get template arguments for the order withdrawal form.
*
* @return array<string,mixed>
*/
private function get_template_args(): array {
return $this->form_view->get_template_args(
$this->form_processor->process_current_request(),
$this->get_form_action_url(),
$this->get_shop_url()
);
}
/**
* Get a safe shop URL for the confirmation link.
*/
private function get_shop_url(): string {
$shop_url = wc_get_page_permalink( 'shop' );
return $shop_url ? $shop_url : home_url( '/' );
}
/**
* Get the form action URL.
*/
private function get_form_action_url(): string {
$account_url = wc_get_page_permalink( 'myaccount' );
return wc_get_endpoint_url( self::ENDPOINT_KEY, '', $account_url ? $account_url : home_url( '/' ) );
}
}