get_id(), array( 'order_type' => 'any' ) ); return is_array( $subscriptions ) && ! empty( $subscriptions ); } /** * Render Paid date, Completed date and Payment method in order admin General section (after Date created / Status / Customer). * For subscription orders or orders related to a subscription (renewal, parent, switch, resubscribe), fields are shown but disabled. * * @param \WC_Order $order Order object. */ public function render_date_fields( $order ) { if ( ! $order || ! ( $order instanceof \WC_Order ) ) { return; } if ( ! current_user_can( self::ADMIN_CAPABILITY ) || ! current_user_can( get_post_type_object( $order->get_type() )->cap->edit_post, $order->get_id() ) ) { return; } $readonly = $this->is_subscription_order( $order ) || $this->is_order_related_to_subscription( $order ); $disabled_attr = $readonly ? ' disabled="disabled"' : ''; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Using WooCommerce filter for compatibility. $date_pattern = apply_filters( 'woocommerce_date_input_html_pattern', '[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])' ); if ( $readonly ) { echo '
' . esc_html__( 'These fields are managed by the subscription.', 'advanced-order-editor-for-woocommerce' ) . '
'; } // Completed date — only when order is completed or already has a completed date set $date_completed = $order->get_date_completed( 'edit' ); if ( $order->has_status( 'completed' ) || $date_completed ) { $ts = $date_completed ? $date_completed->getTimestamp() : ''; ?>/> />: />
get_date_paid( 'edit' ); $ts = $date_paid ? $date_paid->getTimestamp() : ''; ?>/> />: />
get_payment_method( 'edit' ); $payment_gateways = WC()->payment_gateways() ? WC()->payment_gateways()->payment_gateways() : array(); $found_method = false; ?>is_subscription_order( $order ) || $this->is_order_related_to_subscription( $order ) ) { return; } if ( ! current_user_can( self::ADMIN_CAPABILITY ) || ! current_user_can( get_post_type_object( $order->get_type() )->cap->edit_post, $order->get_id() ) ) { return; } $needs_save = false; if ( isset( $_POST['berrypress_epd_paid_date'] ) ) { $timestamp = $this->parse_posted_date( 'berrypress_epd_paid_date' ); $order->set_date_paid( $timestamp ); $needs_save = true; } if ( isset( $_POST['berrypress_epd_completed_date'] ) ) { $timestamp = $this->parse_posted_date( 'berrypress_epd_completed_date' ); $order->set_date_completed( $timestamp ); $needs_save = true; } if ( isset( $_POST['berrypress_epd_payment_method'] ) ) { $methods = WC()->payment_gateways() ? WC()->payment_gateways()->payment_gateways() : array(); $new_method = sanitize_text_field( wp_unslash( $_POST['berrypress_epd_payment_method'] ) ); $title = $new_method; if ( ! empty( $new_method ) && isset( $methods[ $new_method ] ) && is_object( $methods[ $new_method ] ) ) { $title = $methods[ $new_method ]->get_title(); } elseif ( 'other' === $new_method ) { $title = __( 'Other', 'advanced-order-editor-for-woocommerce' ); } $order->set_payment_method( $new_method ); $order->set_payment_method_title( $title ); $needs_save = true; } if ( $needs_save ) { $order->save(); } // phpcs:enable WordPress.Security.NonceVerification.Missing } /** * Parse date from POST (date + hour + minute + second). * * @param string $prefix Field prefix (e.g. 'berrypress_epd_paid_date'). * @return int|null Unix timestamp or null if empty/invalid. */ private function parse_posted_date( $prefix ) { $date_str = isset( $_POST[ $prefix ] ) ? sanitize_text_field( wp_unslash( $_POST[ $prefix ] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verified by WooCommerce order save if ( $date_str === '' ) { return null; } $hour = isset( $_POST[ $prefix . '_hour' ] ) ? absint( $_POST[ $prefix . '_hour' ] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verified by WooCommerce order save $minute = isset( $_POST[ $prefix . '_minute' ] ) ? absint( $_POST[ $prefix . '_minute' ] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verified by WooCommerce order save $second = isset( $_POST[ $prefix . '_second' ] ) ? absint( $_POST[ $prefix . '_second' ] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- nonce verified by WooCommerce order save $hour = min( 23, max( 0, $hour ) ); $minute = min( 59, max( 0, $minute ) ); $second = min( 59, max( 0, $second ) ); $datetime_str = $date_str . ' ' . $hour . ':' . $minute . ':' . $second; try { $timestamp = new \DateTimeImmutable( $datetime_str, wp_timezone() ); return $timestamp->getTimestamp(); } catch (\Exception $ex) {} return null; } } EditPaidDate::instance();