feat: Dynamic SPA slug, field label storage, and SPA frontpage support (WIP)

This commit is contained in:
Dwindi Ramadhana
2026-01-10 00:50:32 +07:00
parent d3ec580ec8
commit 3357fbfcf1
20 changed files with 1317 additions and 465 deletions

View File

@@ -858,25 +858,49 @@ class OrdersController {
}
}
// 3. Billing information is required for a healthy order
$required_billing_fields = [
'first_name' => __( 'Billing first name', 'woonoow' ),
'last_name' => __( 'Billing last name', 'woonoow' ),
'email' => __( 'Billing email', 'woonoow' ),
];
// 3. Billing information required based on checkout fields configuration
// Get checkout field settings to respect hidden/required status from PHP snippets
$checkout_fields = apply_filters( 'woonoow/checkout/fields', [], $items );
// Address fields only required for physical products
if ( $has_physical_product ) {
$required_billing_fields['address_1'] = __( 'Billing address', 'woonoow' );
$required_billing_fields['city'] = __( 'Billing city', 'woonoow' );
$required_billing_fields['postcode'] = __( 'Billing postcode', 'woonoow' );
$required_billing_fields['country'] = __( 'Billing country', 'woonoow' );
// Helper to check if a billing field is required
$is_field_required = function( $field_key ) use ( $checkout_fields ) {
foreach ( $checkout_fields as $field ) {
if ( isset( $field['key'] ) && $field['key'] === $field_key ) {
// Field is not required if hidden or explicitly not required
if ( ! empty( $field['hidden'] ) || $field['type'] === 'hidden' ) {
return false;
}
return ! empty( $field['required'] );
}
}
// Default: core fields are required if not found in API
return true;
};
// Core billing fields - check against API configuration
if ( $is_field_required( 'billing_first_name' ) && empty( $billing['first_name'] ) ) {
$validation_errors[] = __( 'Billing first name is required', 'woonoow' );
}
foreach ( $required_billing_fields as $field => $label ) {
if ( empty( $billing[ $field ] ) ) {
/* translators: %s: field label */
$validation_errors[] = sprintf( __( '%s is required', 'woonoow' ), $label );
if ( $is_field_required( 'billing_last_name' ) && empty( $billing['last_name'] ) ) {
$validation_errors[] = __( 'Billing last name is required', 'woonoow' );
}
if ( $is_field_required( 'billing_email' ) && empty( $billing['email'] ) ) {
$validation_errors[] = __( 'Billing email is required', 'woonoow' );
}
// Address fields only required for physical products AND if not hidden
if ( $has_physical_product ) {
if ( $is_field_required( 'billing_address_1' ) && empty( $billing['address_1'] ) ) {
$validation_errors[] = __( 'Billing address is required', 'woonoow' );
}
if ( $is_field_required( 'billing_city' ) && empty( $billing['city'] ) ) {
$validation_errors[] = __( 'Billing city is required', 'woonoow' );
}
if ( $is_field_required( 'billing_postcode' ) && empty( $billing['postcode'] ) ) {
$validation_errors[] = __( 'Billing postcode is required', 'woonoow' );
}
if ( $is_field_required( 'billing_country' ) && empty( $billing['country'] ) ) {
$validation_errors[] = __( 'Billing country is required', 'woonoow' );
}
}
@@ -1244,10 +1268,18 @@ class OrdersController {
$s = sanitize_text_field( $req->get_param('search') ?? '' );
$limit = max( 1, min( 20, absint( $req->get_param('limit') ?? 10 ) ) );
$args = [ 'limit' => $limit, 'status' => 'publish' ];
if ( $s ) { $args['s'] = $s; }
$prods = wc_get_products( $args );
// Use WP_Query for proper search support (wc_get_products doesn't support 's' parameter)
$args = [
'post_type' => [ 'product' ],
'post_status' => 'publish',
'posts_per_page' => $limit,
];
if ( $s ) {
$args['s'] = $s;
}
$query = new \WP_Query( $args );
$prods = array_filter( array_map( 'wc_get_product', $query->posts ) );
$rows = array_map( function( $p ) {
$data = [
'id' => $p->get_id(),