'scalar' ); } if ( preg_match( '/^date:([a-z_]+)$/', $field, $m ) && in_array( $m[1], self::DATE_TYPES, true ) ) { return array( 'kind' => 'date', 'type' => $m[1], ); } if ( preg_match( '/^item:(\*|\d+):([a-z_]+)$/', $field, $m ) && in_array( $m[2], self::ITEM_PROPS, true ) ) { return array( 'kind' => 'item', 'item_id' => $m[1], 'prop' => $m[2], ); } if ( preg_match( '/^meta:(.+)$/', $field, $m ) ) { return array( 'kind' => 'meta', 'key' => $m[1], ); } return null; } /** * Whether a key is valid. * * @param string $field Field key. * @return bool */ public static function is_valid( $field ) { return null !== self::parse( $field ); } /** * Human label for a key. * * @param string $field Field key. * @return string */ public static function label( $field ) { $labels = array( self::STATUS => __( 'Status', 'recast-subscriptions' ), self::REQUIRES_MANUAL_RENEWAL => __( 'Manual renewal', 'recast-subscriptions' ), self::PAYMENT_METHOD => __( 'Payment method', 'recast-subscriptions' ), self::PAYMENT_METHOD_TITLE => __( 'Payment method title', 'recast-subscriptions' ), self::BILLING_PERIOD => __( 'Billing period', 'recast-subscriptions' ), self::BILLING_INTERVAL => __( 'Billing interval', 'recast-subscriptions' ), self::CURRENCY => __( 'Currency', 'recast-subscriptions' ), self::TOTAL => __( 'Recurring total', 'recast-subscriptions' ), self::TOTAL_TAX => __( 'Recurring tax', 'recast-subscriptions' ), 'date:start' => __( 'Start date', 'recast-subscriptions' ), 'date:trial_end' => __( 'Trial end', 'recast-subscriptions' ), 'date:next_payment' => __( 'Next payment', 'recast-subscriptions' ), 'date:end' => __( 'End date', 'recast-subscriptions' ), 'date:last_order_date_created' => __( 'Last order', 'recast-subscriptions' ), 'date:cancelled' => __( 'Cancelled', 'recast-subscriptions' ), ); if ( isset( $labels[ $field ] ) ) { return $labels[ $field ]; } if ( 0 === strpos( $field, 'display:' ) ) { return __( 'Unit price', 'recast-subscriptions' ); } $parsed = self::parse( $field ); if ( $parsed && 'item' === $parsed['kind'] ) { $props = array( 'subtotal' => __( 'Line price before discounts', 'recast-subscriptions' ), 'total' => __( 'Line price after discounts', 'recast-subscriptions' ), 'tax_class' => __( 'Tax class', 'recast-subscriptions' ), 'quantity' => __( 'Quantity', 'recast-subscriptions' ), 'product_id' => __( 'Product', 'recast-subscriptions' ), 'variation_id' => __( 'Variation', 'recast-subscriptions' ), 'name' => __( 'Line item name', 'recast-subscriptions' ), 'attributes' => __( 'Attributes', 'recast-subscriptions' ), 'taxes' => __( 'Line tax', 'recast-subscriptions' ), ); return isset( $props[ $parsed['prop'] ] ) ? $props[ $parsed['prop'] ] : ucfirst( str_replace( '_', ' ', $parsed['prop'] ) ); } if ( $parsed && 'meta' === $parsed['kind'] ) { /* translators: %s: meta key */ return sprintf( __( 'Custom field %s', 'recast-subscriptions' ), $parsed['key'] ); } return ucfirst( str_replace( array( '_', ':' ), ' ', $field ) ); } /** * Value type of a key, for diff rendering. * * @param string $field Field key. * @return string money|date|string|int|bool|meta|json */ public static function type( $field ) { $parsed = self::parse( $field ); if ( ! $parsed ) { return 'string'; } switch ( $parsed['kind'] ) { case 'date': return 'date'; case 'meta': return 'meta'; case 'item': if ( in_array( $parsed['prop'], array( 'subtotal', 'total' ), true ) ) { return 'money'; } if ( in_array( $parsed['prop'], array( 'quantity', 'product_id', 'variation_id' ), true ) ) { return 'int'; } return in_array( $parsed['prop'], array( 'taxes', 'attributes' ), true ) ? 'json' : 'string'; } switch ( $field ) { case self::TOTAL: case self::TOTAL_TAX: return 'money'; case self::BILLING_INTERVAL: return 'int'; case self::REQUIRES_MANUAL_RENEWAL: return 'bool'; } return 'string'; } }