oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/Structure/GooglereviewStructure.php
2025-03-31 21:42:48 +02:00

281 lines
9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Class GooglereviewStructure
*
* @package CTXFeed
* @subpackage CTXFeed\V5\Structure
*/
namespace CTXFeed\V5\Structure;
use CTXFeed\V5\Filter\ValidateProduct;
use CTXFeed\V5\Helper\CommonHelper;
use CTXFeed\V5\Helper\ProductHelper;
/**
* Class representing the structure for GoogleReview.
* Implements the GoogleReview-related operations.
*/
class GooglereviewStructure {
/**
* Configuration settings.
*
* @var \Config $config
*/
private $config;
/**
* Product ids.
*
* @var array $ids
*/
private $ids;
/**
* Review limit.
*
* @var int $limit
*/
private $review_limit;
/**
* Constructor for GooglereviewStructure.
*
* @param mixed $config Configuration settings.
* @param array $ids Product ids.
*/
public function __construct( $config, $ids ) {
$this->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>$version</version>
<aggregator>
<name>$aggregator_name</name>
</aggregator>
<publisher>
<name>$publisher_name</name>
</publisher>";
$xml_header_link = '<feed xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.google.com/shopping/reviews/schema/product/2.3/product_reviews.xsd">';
return '<?xml version="1.0" encoding="UTF-8" ?>' . PHP_EOL . $xml_header_link. PHP_EOL . $provider_onfo. "<" . \wp_unslash( 'reviews' ) . ">";
}
}