File "class-mailchimp-woocommerce-transform-products.php"

Full Path: /home/vantageo/public_html/cache/cache/cache/cache/cache/cache/.wp-cli/wp-content/plugins/mailchimp-for-woocommerce_bk/includes/api/class-mailchimp-woocommerce-transform-products.php
File size: 11.13 KB
MIME-type: text/x-php
Charset: utf-8

<?php

/**
 * Created by Vextras.
 *
 * Name: Ryan Hungate
 * Email: ryan@vextras.com
 * Date: 7/13/16
 * Time: 8:29 AM
 */
class MailChimp_WooCommerce_Transform_Products {

	/**
	 * @param int $page
	 * @param int $limit
	 *
	 * @return object
	 */
	public function compile( $page = 1, $limit = 5 ) {
		$response = (object) array(
			'endpoint' => 'products',
			'page'     => $page ? $page : 1,
			'limit'    => (int) $limit,
			'count'    => 0,
			'stuffed'  => false,
			'items'    => array(),
		);

		if ( ( ( $products = $this->getProductPostsIds( $page, $limit ) ) && ! empty( $products ) ) ) {
			foreach ( $products as $post_id ) {
				$response->items[] = $post_id;
				$response->count++;
			}
		}

		$response->stuffed = $response->count > 0 && (int) $response->count === (int) $limit;

		return $response;
	}

	/**
	 * @param MailChimp_WooCommerce_LineItem $item
	 * @return MailChimp_WooCommerce_Product
	 */
	public function fromOrderItem( MailChimp_WooCommerce_LineItem $item ) {
		$product = new MailChimp_WooCommerce_Product();

		$fallback_title = $item->getFallbackTitle();
		if ( empty( $fallback_title ) ) {
			$fallback_title = "deleted_{$item->getProductId()}";
		}

		$product->setId( $item->getProductId() );
		$product->setTitle( $fallback_title );

		$variant = new MailChimp_WooCommerce_ProductVariation();
		$variant->setId( $item->getProductId() );
		$variant->setTitle( $fallback_title );
		$variant->setInventoryQuantity( 0 );
		$variant->setVisibility( 'hidden' );
		$variant->setSku( $item->getFallbackSku() );

		$product->addVariant( $variant );

		return apply_filters('mailchimp_sync_lineitem', $product);
	}

	/**
	 * @param WP_Post $post
	 * @param null    $fallback_title
	 *
	 * @return MailChimp_WooCommerce_Product
	 * @throws Exception
	 */
	public function transform( WP_Post $post, $fallback_title = null ) {
		if ( ! ( $woo = wc_get_product( $post ) ) ) {
			return $this->wooProductNotLoadedCorrectly( $post, $fallback_title );
		}

		$variant_posts = $this->getProductVariantPosts( $post->ID );

		$variants = $variant_posts ? array_merge( array( $woo ), $variant_posts ) : array( $woo );

		$is_variant = count( $variants ) > 1;

		$product = new MailChimp_WooCommerce_Product();

		$product->setId( $woo->get_id() );
		$product->setHandle( $post->post_name );
		$product->setImageUrl( $this->getProductImage( $post ) );
		$product->setDescription( $post->post_content );
		$product->setPublishedAtForeign( mailchimp_date_utc( $post->post_date ) );
		$product->setTitle( $woo->get_title() );
		$product->setUrl( $woo->get_permalink() );

		$original_vendor = '';
		if ( in_array( 'woocommerce-product-vendors/woocommerce-product-vendors.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) || defined( 'WC_PRODUCT_VENDORS_VERSION' ) ) {
			$vendor_id       = WC_Product_Vendors_Utils::get_vendor_id_from_product( $woo->get_id() );
			$vendor_data     = WC_Product_Vendors_Utils::get_vendor_data_by_id( $vendor_id );
			$original_vendor = $vendor_data['name'];
		}
		$vendor_filter = apply_filters( 'mailchimp_sync_product_vendor', $original_vendor, $product );
		if ( $original_vendor != '' && is_string( $vendor_filter ) ) {
			$product->setVendor( $vendor_filter );
		} elseif ( $original_vendor != '' && is_string( $original_vendor ) ) {
			$product->setVendor( $original_vendor );
		}

		foreach ( $variants as $variant ) {

			$product_variant = $this->variant( $variant, $woo->get_title() );

			if ( ! $product_variant ) {
				continue;
			}

			$product_variant_title = $product_variant->getTitle();

			if ( empty( $product_variant_title ) ) {
				$product_variant->setTitle( $woo->get_title() );
			}

			$product_variant_image = $product_variant->getImageUrl();

			if ( empty( $product_variant_image ) ) {
				$product_variant->setImageUrl( $product->getImageUrl() );
			}

			$product->addVariant( $product_variant );
		}

		return apply_filters('mailchimp_sync_product', $product, $woo);
	}

	/**
	 * @param $post
	 * @param null $fallback_title
	 *
	 * @return MailChimp_WooCommerce_ProductVariation
	 */
	public function variant( $post, $fallback_title = null ) {
		if ( $post instanceof WC_Product || $post instanceof WC_Product_Variation ) {
			$woo = $post;
		} else {
			if ( isset( $post->post_type ) && $post->post_type === 'product_variation' ) {
				$woo = new WC_Product_Variation( $post->ID );
			} else {
				$woo = wc_get_product( $post );
			}
		}

		$variant = new MailChimp_WooCommerce_ProductVariation();

		if ( ! $woo ) {
			// mailchimp_error("products.transform", "could not load product variant", array('post' => print_r($post, true)));
			return $variant;
		}

		$variant->setId( $woo->get_id() );
		$variant->setUrl( $woo->get_permalink() );
		$variant->setImageUrl( $this->getProductImage( $post ) );
		$variant->setPrice( $woo->get_price() );
		$variant->setSku( $woo->get_sku() );
		$variant->setBackorders( $woo->backorders_allowed() );

		if ( empty( $variant->getTitle() ) ) {
			if ( ! empty( $fallback_title ) ) {
				$variant->setTitle( $fallback_title );
			} elseif ( ! empty( $variant->getSku() ) ) {
				$variant->setTitle( $variant->getSku() );
			}
		}

		// only set these properties if the product is currently visible or purchasable.
		if ( $woo->is_purchasable() && $woo->is_visible() ) {
			if ( $woo->is_in_stock() ) {
				$variant->setInventoryQuantity( ( $woo->managing_stock() ? $woo->get_stock_quantity() : 1000000 ) );
			} else {
				$variant->setInventoryQuantity( 0 );
			}
		} else {
			$variant->setInventoryQuantity( 0 );
		}

		if ( $woo instanceof WC_Product_Variation ) {

			$variation_title = $woo->get_title();
			if ( empty( $variation_title ) ) {
				$variation_title = $fallback_title;
			}

			$title = array( $variation_title );

			foreach ( $woo->get_variation_attributes() as $attribute => $value ) {
				if ( is_string( $value ) && ! empty( $value ) ) {
					$name    = ucfirst( str_replace( array( 'attribute_pa_', 'attribute_' ), '', $attribute ) );
					$title[] = "$name = $value";
				}
			}

			$variant->setTitle( implode( ' :: ', $title ) );
			$variant->setVisibility( ( $woo->variation_is_visible() ? 'visible' : '' ) );
		} else {
			$variant->setVisibility( ( $woo->is_visible() ? 'visible' : '' ) );
			$variant->setTitle( $woo->get_title() );
		}

		return $variant;
	}

	/**
	 * @param int $page
	 * @param int $posts
	 * @return array|bool
	 */
	public function getProductPostsIds( $page = 1, $posts = 5 ) {
		$offset = 0;

		if ( $page > 1 ) {
			$offset = ( ( $page - 1 ) * $posts );
		}

		$params = array(
			'post_type'      => array_merge( array_keys( wc_get_product_types() ), array( 'product' ) ),
			'posts_per_page' => $posts,
			'post_status'    => array( 'private', 'publish', 'draft' ),
			'offset'         => $offset,
			'orderby'        => 'ID',
			'order'          => 'ASC',
			'fields'         => 'ids',
		);

		$products = get_posts( $params );

		if ( empty( $products ) ) {
			sleep( 2 );
			$products = get_posts( $params );
			if ( empty( $products ) ) {
				return false;
			}
		}

		return $products;
	}

	/**
	 * @param $id
	 * @return array|bool
	 */
	public function getProductVariantPosts( $id ) {
		$variants = get_posts(
			array(
				'post_type'   => 'product_variation',
				'post_status' => array( 'private', 'publish', 'draft' ),
				'numberposts' => -1,
				'post_parent' => $id,
			)
		);

		if ( empty( $variants ) ) {
			return false;
		}

		return $variants;
	}

	public function getProductImage( $post ) {
		$id        = is_a( $post, 'WC_Product' ) ? $post->get_id() : $post->ID;
		$meta      = get_post_meta( $id );
		$key       = '_thumbnail_id';
		$image_key = $this->getProductImageKey();
		if ( $meta && is_array( $meta ) && array_key_exists( $key, $meta ) && isset( $meta[ $key ][0] ) ) {
			$img = wp_get_attachment_image_src( $meta[ $key ][0], $image_key );
			if ( ! empty( $img[0] ) ) {
				if ( substr( $img[0], 0, 4 ) !== 'http' ) {
					return rtrim( home_url(), '/' ) . '/' . ltrim( $img[0], '/' );
				}
				return $img[0];
			}
		}
		return get_the_post_thumbnail_url( $id, $image_key );
	}

	/**
	 * @return null|string
	 */
	public function getProductImageKey() {
		return mailchimp_get_option( 'mailchimp_product_image_key', 'medium' );
	}

	/**
	 * @param $id
	 * @param $title
	 *
	 * @return bool|MailChimp_WooCommerce_Product
	 * @throws MailChimp_WooCommerce_Error
	 * @throws MailChimp_WooCommerce_RateLimitError
	 * @throws MailChimp_WooCommerce_ServerError
	 */
	public static function deleted( $id, $title ) {
		$store_id = mailchimp_get_store_id();
		$api      = mailchimp_get_api();

		if ( ! ( $product = $api->getStoreProduct( $store_id, "deleted_{$id}" ) ) ) {
			$product = new MailChimp_WooCommerce_Product();

			$product->setId( "deleted_{$id}" );
			$product->setTitle( $title );

			$variant = new MailChimp_WooCommerce_ProductVariation();
			$variant->setId( $product->getId() );
			$variant->setTitle( $title );
			$variant->setInventoryQuantity( 0 );
			$variant->setVisibility( 'hidden' );

			$product->addVariant( $variant );

			return $api->addStoreProduct( $store_id, $product );
		}

		return $product;
	}

	/**
	 * @param $item
	 *
	 * @return bool|MailChimp_WooCommerce_Product
	 * @throws MailChimp_WooCommerce_Error
	 * @throws MailChimp_WooCommerce_RateLimitError
	 * @throws MailChimp_WooCommerce_ServerError
	 */
	public static function missing_order_item( $item ) {
		// we can only do this with an order item
		if ( ! $item instanceof WC_Order_Item_Product ) {
			return false;
		}

		$store_id = mailchimp_get_store_id();
		$api      = mailchimp_get_api();

		// If the $item->get_product_id() is null or 0, we can try to retrieve the id directly from "wc_order_product_lookup" table
		if ( ! $id = $item->get_product_id() ) {
			global $wpdb;
			$query        = "SELECT product_id FROM {$wpdb->prefix}wc_order_product_lookup WHERE order_item_id = %s";
			$query_result = $wpdb->get_results( $wpdb->prepare( $query, $item->get_id() ) );
			$id           = $query_result[0]->product_id ?: 0;
		}

		$title = $item->get_name();

		// only do this if we haven't pushed this product ID up yet to Mailchimp
		if ( ! ( $product = $api->getStoreProduct( $store_id, "deleted_{$id}" ) ) ) {
			$product = new MailChimp_WooCommerce_Product();

			$product->setId( "deleted_{$id}" );
			$product->setTitle( $title );

			$variant = new MailChimp_WooCommerce_ProductVariation();
			$variant->setId( $product->getId() );
			$variant->setTitle( $title );
			$variant->setInventoryQuantity( 0 );
			$variant->setVisibility( 'hidden' );

			$product->addVariant( $variant );

			return $api->addStoreProduct( $store_id, $product );
		}

		return $product;
	}

	/**
	 * @param $post
	 * @param null $fallback_title
	 *
	 * @return MailChimp_WooCommerce_Product
	 */
	protected function wooProductNotLoadedCorrectly( $post, $fallback_title = null ) {
		$product = new MailChimp_WooCommerce_Product();
		$product->setId( $post->ID );
		$product->setHandle( $post->post_name );
		$product->setDescription( $post->post_content );
		$product->setImageUrl( $this->getProductImage( $post ) );

		$variant = $this->variant( $post, ( $post->post_name ? $post->post_name : $fallback_title ) );

		if ( ! $variant->getImageUrl() ) {
			$variant->setImageUrl( $product->getImageUrl() );
		}

		$product->addVariant( $variant );

		return $product;
	}
}