data = $data; $this->config = $config; } /** * Creates the header and footer for the XML file. * * @return array An array with 'header' and 'footer' keys. */ public function make_header_footer() { $header_footer = $this->get_header_footer( $this->config ); return \apply_filters( "ctx_make_{$this->config->feedType}_feed_header_footer", $header_footer, $this->data, $this->config ); } /** * Convert an array to XML format. * * This method recursively converts an array into an XML string. Special handling is applied for * certain keys and configurations (e.g., Google Review specific formatting). * * @param array $array The array to convert. * @param string $xml Reference to the XML string being built. */ public function array_to_xml( $array, &$xml ) { foreach ( $array as $key => $value ) { if ( \is_array( $value ) ) { if ( !\is_numeric( $key ) ) { $this->feed_body .= "<$key>" . PHP_EOL; self::array_to_xml( $value, $child ); $this->feed_body .= "" . PHP_EOL; } else { self::array_to_xml( $value, $xml ); } } else { $value = $this->format_value( $key, $value ); $this->feed_body .= $value; } } } /** * Format the value for XML output. * * This method applies XML encoding and specific formatting based on the key and configuration. * * @param string $key The key associated with the value. * @param mixed $value The value to be formatted. * * @return string The formatted value. */ private function format_value( $key, $value ) { if ( !\in_array( $key, ['g:tax', 'g:shipping'], true ) ) { $value = \htmlentities( $value, ENT_XML1 | ENT_QUOTES, 'UTF-8' ); $value = $this->get_CDATA( $value ); } if ( $this->config->get_feed_template() === 'googlereview' ) { if ( "overall" === $key ) { $value = "<$key min='1' max='5'>" . $value . "". PHP_EOL; } elseif ( "review_url" === $key ) { $value = "<$key type='group'>" . $value . "". PHP_EOL; }else { $value = "<$key>" . $value . "" . PHP_EOL; } }else{ $value = "<$key>" . $value . "" . PHP_EOL; } return $value; } /** * CDATA add * * @return string */ private function get_CDATA( $value ){ $settings = Settings::get( 'enable_cdata' ); return $this->add_CDATA( $settings,$value ); } /** Add CDATA to String * * @param string $status * @param string $output * * @return string */ private function add_CDATA( $status, $output ) { if ( 'yes' === $status && $output && $output!="") { $output = $this->remove_CDATA( $output ); return ''; }else if( 'no' === $status && strpos( $output, '<![CDATA[') !== false ){ return \html_entity_decode( $output ); } return $output; } /** Remove CDATA from String * * @param string $output * * @return string */ private function remove_CDATA( $output ) { $output = \html_entity_decode( $output ); return \str_replace( [ "" ], "", $output ); } /** * Make XML body. * * @return false|string */ public function make_body() { // create simpleXML object $xml = ''; $this->array_to_xml( $this->data, $xml ); return \apply_filters( "ctx_make_{$this->config->feedType}_feed_body", $this->feed_body, $this->data, $this->config ); } /** * Create XML File Header and Footer based on configuration. * * This method generates the header and footer for the XML file. It handles different templates * and configurations, such as a special format for Google Review feeds. * * @param Config $config Configuration object for the feed. * * @return array An array with 'header' and 'footer' keys containing the XML strings. */ private function get_header_footer( $config ) { if( $config->get_feed_template() === 'googlereview' ){ $header = GooglereviewStructure::make_google_review_header(); $footer = 'itemsWrapper . '>'; $xml_wrapper['header'] = $this->make_header( $config, $header ); $xml_wrapper['footer'] = "\n" . $this->make_footer( $config, $footer ); }else{ $xml_wrapper['header'] = $this->make_header( $config ); $xml_wrapper['footer'] = "\n" . $this->make_footer( $config ); } $config->itemWrapper = \str_replace( ' ', '_', $config->itemWrapper ); $config->itemsWrapper = \str_replace( ' ', '_', $config->itemsWrapper ); if ( \file_exists( WOO_FEED_FREE_ADMIN_PATH . 'partials/templates/' . $config->provider . '.txt' ) ) { $txt = \file_get_contents( WOO_FEED_FREE_ADMIN_PATH . 'partials/templates/' . $config->provider . '.txt' ); $txt = \trim( $txt ); $txt = \explode( '{separator}', $txt ); if ( 2 === \count( $txt ) ) { $xml_wrapper['header'] = $this->make_header( $config, \trim( $txt[0] ) ); $xml_wrapper['footer'] = "\n" . $this->make_footer( $config, \trim( $txt[1] ) ); } } return $xml_wrapper; } /** * Replace template variables. * * * @param $header * @param $config * * @return array|string|string[] */ private function replace_template_variable( $header, $config ) { $variables = [ '{DateTimeNow}' => \gmdate( 'Y-m-d H:i:s', \strtotime( \current_time( 'mysql' ) ) ), '{BlogName}' => \get_bloginfo( 'name' ), '{BlogURL}' => \get_bloginfo( 'url' ), '{BlogDescription}' => "CTX Feed - This product feed is generated with the CTX Feed - WooCommerce Product Feed Manager plugin by WebAppick.com. For all your support questions check out our plugin Docs on https://webappick.com/docs or e-mail to: support@webappick.com", '{BlogEmail}' => \get_bloginfo( 'admin_email' ), ]; $variables = \apply_filters( 'ctx_xml_header_template_variables', $variables, $config ); return \str_replace( \array_keys( $variables ), \array_values( $variables ), $header ); } /** * Make XML Header. * * @param $config * @param $override * * @return mixed|void */ private function make_header( $config, $override = '' ) { $config->itemsWrapper = \str_replace( ' ', '_', $config->itemsWrapper ); if ( ! empty( $override ) ) { $header = $override; } else { $header = '' . PHP_EOL . "<" . \wp_unslash( $config->itemsWrapper ) . ">"; } if ( ! empty( $config->extraHeader ) ) { $header .= PHP_EOL . \wp_unslash( $config->extraHeader ); } // replace template variables. $header = $this->replace_template_variable( $header, $config ); return \apply_filters( 'ctx_make_xml_header', $header, $config ); } /** * Make XML Footer. * * @param $config * @param $override * * @return mixed|void */ private function make_footer( $config, $override = '' ) { if ( ! empty( $override ) ) { $footer = $override; } else { $footer = 'itemsWrapper . '>'; } return \apply_filters( 'ctx_make_xml_footer', $footer, $config ); } /** * @param $feed * * @return array|string|string[] */ private function remove_header_footer( $feed ) { return \str_replace( [ '', '', '', '' ], '', $feed ); } }