$parsableItem) { // Get Parsed Group $group = strtok($parsableItem, '.:'); $itemExt = str_replace(array($group . '.', $group . ':'), '', $parsableItem); $formattedParsables[$group][$parsableKey] = $itemExt; } $wpParser = Arr::only( $formattedParsables, array( 'wp', 'other' ) ); $formattedInputs = Arr::only( $formattedParsables, array( 'order', ) ); $orderAddressCodes = Arr::only( $formattedParsables, array( 'billing', 'shipping' ) ); $otherShortCodes = Arr::only( $formattedParsables, array( 'payment', ) ); $userShortCodes = Arr::only( $formattedParsables, array( 'user' ) ); $transactionShortCodes = Arr::only( $formattedParsables, array( 'transaction' ) ); $customerShortCodes = Arr::only( $formattedParsables, ['customer'] ); $parsedOthers = static::parseOthers($otherShortCodes, $order); $parsedInputs = static::parseInputFields($formattedInputs, $order); $parsedWp = isset($formattedParsables['wp']) ? static::parseWPFields($wpParser, $order) : []; $parsedAddress = static::parseAddressFields($orderAddressCodes, Arr::get($order, 'customer', [])); $parsedUser = static::parseUserFields($userShortCodes, Arr::get($parsable, 'user')); $parsedTransaction = isset($formattedParsables['transaction']) ? static::parseTransaction($transactionShortCodes, $transaction) : []; $parsedCustomer = isset($formattedParsables['customer']) ? static::parseCustomerFields($customerShortCodes, Arr::get($order, 'customer', [])) : []; $parsedData = array_merge( $parsedInputs, $parsedWp, $parsedAddress, $parsedOthers, $parsedUser, $parsedTransaction, $parsedCustomer ); $formattedParsedItems = []; foreach ($parsedData as $parsedKey => $parseItem) { if (is_array($parseItem)) { $parseItem = implode(', ', $parseItem); } $formattedParsedItems[$parsedKey] = $parseItem; } return self::replaceValue($content, $formattedParsedItems); } public static function arrayIterator($contentArray, $order) { foreach ($contentArray as $key => $val) { if (!is_array($val)) { $contentArray[$key] = static::parse($val, $order); } else { $contentArray[$key] = static::arrayIterator($val, $order); } } return $contentArray; } public static function parseUserFields($userShortCodes, $user = null): array { $customData = [ 'password_reset_link' => function ($user) { $user_data = get_userdata($user->ID); $user_login = $user_data->user_login; $key = get_password_reset_key($user_data); if (is_wp_error($key)) { return __("Error generating password reset key", 'fluent-cart'); } $locale = get_user_locale($user_data); return ' ' . __('Reset', 'fluent-cart') . ' '; } ]; global $current_user; if (!($user instanceof \WP_User)) { $user = $current_user; } $parsedData = array(); if (!$user) { return $parsedData; } foreach ($userShortCodes as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if (isset($customData[$targetItem])) { $parsedData[$placeholder] = $customData[$targetItem]($user); } else { $parsedData[$placeholder] = $user->{$targetItem}; } } } return $parsedData; } public static function parseCustomerFields($customerShortCodes, $customer): array { $parsedData = array(); foreach ($customerShortCodes as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($targetItem === 'first_name') { $val = Arr::get($customer, 'first_name', null); } if ($targetItem === 'last_name') { $val = Arr::get($customer, 'last_name', null); } $parsedData[$placeholder] = $val; } } return $parsedData; } public static function parseOthers($otherShortCodes, $order): array { $parsedData = array(); foreach ($otherShortCodes as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($targetItem === 'summary') { $val = static::getSummary($order); } if ($targetItem === 'receipt') { $val = static::getReceipt($order); } if (!empty($val)) { $parsedData[$placeholder] = $val; } } } return $parsedData; } public static function parseTransaction($transactionShortCodes, $transaction): array { $parsedData = []; foreach ($transactionShortCodes as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($targetItem === 'refund_amount') { $refund_amount = Helper::toDecimal(Arr::get($transaction, 'refund_amount', false)); $val = Helper::toDecimal($refund_amount); } if ($targetItem === 'created_at') { $val = $transaction['created_at']; } if (!empty($val)) { $parsedData[$placeholder] = $val; } } } return $parsedData; } public static function getSummary($order) { $paymentReceipt = new PaymentReceipt($order); ob_start(); do_action('fluent_cart/views/checkout_order_summary', compact('order', 'paymentReceipt')); return ob_get_clean(); } public static function getReceipt($order) { $paymentReceipt = new PaymentReceipt($order); ob_start(); do_action('fluent_cart/views/checkout_order_receipt', compact('order', 'paymentReceipt')); return ob_get_clean(); } public static function replaceValue($parsedItems, $shortcodeValues) { if (is_array($parsedItems)) { foreach ($parsedItems as $key => $value) { if (!is_array($value)) { $parsedItems[$key] = str_replace(array_keys($shortcodeValues), array_values($shortcodeValues), $value); } else { $parsedItems[$key] = self::replaceValue($value, $shortcodeValues); } } } else { $parsedItems = str_replace(array_keys($shortcodeValues), array_values($shortcodeValues), $parsedItems); } return $parsedItems; } public static function parseInputFields($placeholders, $order): array { $order = $order->load('customer', 'billing_address', 'shipping_address')->toArray(); $order['billing'] = Arr::get($order, 'billing_address'); $order['shipping'] = Arr::get($order, 'shipping_address'); unset($order['billing_address']); unset($order['shipping_address']); $storeSettings = new StoreSettings(); $profilePage = $storeSettings->getCustomerProfilePage(); $parsedData = []; foreach ($placeholders as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($groupKey == 'order') { if ($targetItem === 'customer_dashboard_link') { if (!empty($profilePage)) { $parsedData[$placeholder] = "" . Arr::get($order, 'id') . ""; } else { $parsedData[$placeholder] = Arr::get($order, 'id'); } } elseif ($targetItem === 'payment_link') { $parsedData[$placeholder] = PaymentHelper::getCustomPaymentLink(Arr::get($order, 'uuid')); } else if ($targetItem === 'total_amount') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'total_amount'), false); } elseif ($targetItem === 'total_paid') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'total_paid'), false); } else if ($targetItem === 'tax_total') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'tax_total'), false); } else if ($targetItem === 'shipping_total') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'shipping_total'), false); } elseif ($targetItem === 'manual_discount_total') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'manual_discount_total'), false); } elseif ($targetItem === 'coupon_discount_total') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'coupon_discount_total'), false); } elseif ($targetItem === 'shipping_tax') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'shipping_tax'), false); } elseif ($targetItem === 'total_refund') { $parsedData[$placeholder] = Helper::toDecimal(Arr::get($order, 'total_refund'), false); } else { $parsedData[$placeholder] = Arr::get($order, $targetItem); } } elseif ($groupKey == 'customer') { $parsedData[$placeholder] = Arr::get($order, 'customer.' . $targetItem, []); } elseif ($groupKey == 'order_items') { $parsedData[$placeholder] = Arr::get($order, 'order_items.' . $targetItem); } } } return $parsedData; } public static function parseShortcode($parsableItems): array { $parsable = []; preg_replace_callback('/{+(.*?)}/', function ($matches) use (&$parsable) { $parsable[$matches[0]] = $matches[1]; }, $parsableItems); return $parsable; } public static function nestedArrayItems($parsableItems): array { if (!is_array($parsableItems)) { return self::parseShortcode($parsableItems); } $parsableData = []; // checking item has child array elements foreach ($parsableItems as $parsable) { // checking if there is another child array, checking 2 levels deep if (is_array($parsable) && count($parsable)) { foreach ($parsable as $parsableItem) { $arrayParsed = self::parseShortcode($parsableItem); $parsableData = array_merge($parsable, $arrayParsed); } } else { $arrayParsed = self::parseShortcode($parsable); $parsableData = array_merge($parsable, $arrayParsed); } } return $parsableData; } public static function parseAddressFields($parsable, $data): array { if (empty($data)) { return []; } $billing = Arr::get($data, 'billing_address.0'); $shipping = Arr::get($data, 'shipping_address.0'); $parsedData = []; foreach ($parsable as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($groupKey === 'billing' && isset($billing)) { $val = Arr::get($billing, $targetItem); if ($targetItem === 'first_name' || $targetItem === 'last_name') { $val = static::splitName($billing, $targetItem); } $parsedData[$placeholder] = $val; } elseif ($groupKey === 'shipping' && isset($shipping)) { $val = Arr::get($shipping, $targetItem); if ($targetItem === 'first_name' || $targetItem === 'last_name') { $val = static::splitName($shipping, $targetItem); } $parsedData[$placeholder] = $val; } } } return $parsedData; } public static function splitName($data, $key = 'first_name') { $names = explode(" ", Arr::get($data, 'name')); return $key === 'first_name' ? $names[0] : $names[1]; } public static function parseWPFields($placeHolders, $order): array { $parsedData = array(); $metaData = new WpMetaHelper($order); foreach ($placeHolders as $groupKey => $values) { foreach ($values as $placeholder => $targetItem) { if ($groupKey == 'wp') { $parsedData[$placeholder] = $metaData->getWPValues($targetItem); } elseif ($groupKey == 'user_meta') { $parsedData[$placeholder] = $metaData->getuserMeta($targetItem); } elseif ($groupKey == 'other') { $parsedData[$placeholder] = $metaData->getOtherData($targetItem); } } } return $parsedData; } }