config = $config; $this->ids = $ids; $this->config->itemWrapper = 'review'; $this->config->itemsWrapper = 'reviews'; $this->review_limit = $this->get_review_limit_per_product(); } /** * Retrieve the review limit. * * This function returns the review limit, which is filtered by 'get_review_limit'. * If the filter is not applied, the default limit of 0 is returned. * * @return int The review limit. */ public function get_review_limit_per_product(){ $limit = 0; return apply_filters( 'woo_feed_get_review_limit_per_product', $limit ); } /** * Retrieves the XML structure. * * @return array The constructed XML data structure. */ public function get_xml_structure() { $attributes = $this->config->attributes; $mattributes = $this->config->mattributes; $wrapper = \str_replace( " ", "_", $this->config->itemWrapper );; $data = []; $ids = $this->ids; foreach ( $ids as $id ) { $review = array(); $product = \wc_get_product( $id ); if( !ValidateProduct::is_valid( $product, $this->config, $id ) ){ continue; } $args = array( 'post_id' => $id, 'status' => 'approve', 'post_status' => 'publish', 'post_type' => 'product', 'parent' => 0 ); if( $this->review_limit > 0 ){ $args['number'] = $this->review_limit; $args['orderby'] = 'comment_date'; $args['order'] = 'DESC'; } $reviews = \get_comments( $args ); $i = 0; if ( $reviews && \is_array( $reviews ) ) { foreach ( $reviews as $single_review ) { $review_content = $single_review->comment_content; if (empty( $review_content ) ) { continue; } $rating = \get_comment_meta( $single_review->comment_ID, 'rating', true ); if (empty($rating)) { continue; } $review_time = !empty($single_review->comment_date_gmt) ? \gmdate('c', \strtotime($single_review->comment_date_gmt)) : ""; //Review Content //strip tags and spacial characters $strip_review_content = CommonHelper::strip_all_tags( wp_specialchars_decode($review_content ) ); $review_content = !empty( \strlen($strip_review_content ) ) && 0 < \strlen( $strip_review_content ) ? $strip_review_content : $review_content; $review_product_url = !empty( $product->get_permalink() ) ? $product->get_permalink() : ""; $review_id = !empty($single_review->comment_ID) ? $single_review->comment_ID : ""; $review_author = !empty($single_review->comment_author) ? $single_review->comment_author : ""; $review_user_id = !empty($single_review->user_id) ? $single_review->user_id : ""; $review[ $wrapper ]['review_id'] = $review_id; $review[$wrapper]['reviewer']['name'] = $review_author; $review[$wrapper]['reviewer']['reviewer_id'] = $review_user_id; $review[$wrapper]['content'] = $review_content; $review[$wrapper]['review_timestamp'] = $review_time; $review[$wrapper]['review_url'] = $review_product_url; $review[$wrapper]['ratings']["overall"] = $rating; $review[$wrapper]['products'] = array(); $review[$wrapper]['products']['product'] = array(); $review[$wrapper]['products']['product']['product_name'] = !empty( $product->get_name() ) ? $product->get_name() : ""; $review[$wrapper]['products']['product']['product_url'] = $review_product_url; foreach ( $attributes as $attr_key => $attribute ) { $merchant_attribute = isset($mattributes[ $attr_key ] ) ? $mattributes[ $attr_key ] : ''; if ( "review_temp_gtin" === $merchant_attribute) { $review[$wrapper]['products']['product']['product_ids']['gtins'] = $this->get_product_ids( $product, $this->config, $attr_key, $attribute, $merchant_attribute, 'gtin' ); } elseif ( "review_temp_mpn" === $merchant_attribute) { $review[$wrapper]['products']['product']['product_ids']['mpns'] = $this->get_product_ids( $product, $this->config, $attr_key, $attribute, $merchant_attribute, 'mpn' );; } elseif ( "review_temp_sku" === $merchant_attribute ) { $review[$wrapper]['products']['product']['product_ids']['skus']= $this->get_product_ids( $product, $this->config, $attr_key, $attribute, $merchant_attribute, 'sku' );; } elseif ( "review_temp_brand" === $merchant_attribute) { $review[$wrapper]['products']['product']['product_ids']['brands'] =$this->get_product_ids( $product, $this->config, $attr_key, $attribute, $merchant_attribute, 'brand' );; } } $data[] = $review; } } } return $data; } /** * Get Product Ids associated with a review (Ex: variations) * * @param $product * @param $config * @param $attr_key * @param $attribute * @param $merchant_attribute * @param $id_type * * @return array */ public function get_product_ids( $product, $config, $attr_key, $attribute, $merchant_attribute, $id_type ) { $prefix = $this->config->prefix[ $attr_key ]; $suffix = $this->config->suffix[ $attr_key ]; if ( $product->is_type( 'variable' ) ) { $variations = $product->get_children(); if ( ! empty( $variations ) ) { $variation_ids = []; foreach ( $variations as $key => $variation ) { $variation = \wc_get_product( $variation ); if ( 'pattern' === $config->type[ $attr_key ] ) { $attribute_value = $prefix." ".$config->default[ $attr_key ]." ".$suffix; } else { $attribute_value = $prefix." ".ProductHelper::get_attribute_value_by_type( $attribute, $variation, $this->config )." ".$suffix; } $variation_ids[ $key ][ $id_type ] = \trim( $attribute_value ); } return $variation_ids; } } // For non variation products $attribute_value = ""; if ( 'pattern' === $config->type[ $attr_key ] ) { $attribute_value = $config->default[ $attr_key ]; } else { $attribute_value = ProductHelper::get_attribute_value_by_type( $attribute, $product, $this->config ); } // Add Prefix and Suffix into Output $attribute_value = \trim( $prefix )." ".\trim( $attribute_value )." ".\trim( $suffix ); $attribute_value = ! empty( $attribute_value ) ? $attribute_value : ""; return [ $id_type => trim( $attribute_value ) ]; } /** * Retrieves the CSV structure. * Currently, this method serves as a wrapper for the get_xml_structure method. * * @return mixed The XML structure converted to CSV format. */ public function get_csv_structure() { return $this->get_xml_structure(); } /** * Retrieves the TSV structure. * Currently, this method serves as a wrapper for the get_xml_structure method. * * @return mixed The XML structure converted to TSV format. */ public function get_tsv_structure() { return $this->get_xml_structure(); } /** * Retrieves the TXT structure. * Currently, this method serves as a wrapper for the get_xml_structure method. * * @return mixed The XML structure converted to TXT format. */ public function get_txt_structure() { return $this->get_xml_structure(); } /** * Retrieves the XML structure. * Currently, this method serves as a wrapper for the get_xml_structure method. * * @return mixed The XML structure converted to XLS format. */ public function get_xls_structure() { return $this->get_xml_structure(); } /** * Retrieves the JSON structure. * Currently, this method serves as a wrapper for the get_xml_structure method. * * @return mixed The XML structure converted to JSON format. */ public function get_json_structure() { return $this->get_xml_structure(); } /** * Process Reviews Product Header * @return mixed */ public static function make_google_review_header() { $version = '2.3'; $aggregator_name = 'review'; $publisher_name = 'CTX Feed – WooCommerce Product Feed Generator by Webappick'; $provider_onfo = "$version $aggregator_name $publisher_name "; $xml_header_link = ''; return '' . PHP_EOL . $xml_header_link. PHP_EOL . $provider_onfo. "<" . \wp_unslash( 'reviews' ) . ">"; } }