564 lines
16 KiB
PHP
564 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* Analytics function class
|
|
*
|
|
* @since 1.10.0
|
|
* @package TInvWishlist\Analytics
|
|
*/
|
|
|
|
// If this file is called directly, abort.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
die;
|
|
}
|
|
|
|
/**
|
|
* Analytics function class
|
|
*/
|
|
class TInvWL_Analytics {
|
|
|
|
/**
|
|
* Database table
|
|
*
|
|
* @var string
|
|
*/
|
|
private $table;
|
|
|
|
/**
|
|
* Plugin name
|
|
*
|
|
* @var string
|
|
*/
|
|
private $_name;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param array $wishlist Array wishlist.
|
|
* @param string $plugin_name Plugin name.
|
|
*
|
|
* @global wpdb $wpdb
|
|
*/
|
|
function __construct( $wishlist, $plugin_name = TINVWL_PREFIX ) {
|
|
global $wpdb;
|
|
|
|
$this->wishlist = (array) $wishlist;
|
|
$this->_name = $plugin_name;
|
|
$this->table = sprintf( '%s%s_%s', $wpdb->prefix, $this->_name, 'analytics' );
|
|
}
|
|
|
|
/**
|
|
* Get wishlist id
|
|
*
|
|
* @return int
|
|
*/
|
|
function wishlist_id() {
|
|
if ( is_array( $this->wishlist ) && array_key_exists( 'ID', $this->wishlist ) ) {
|
|
return $this->wishlist['ID'];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Get author wishlist
|
|
*
|
|
* @return int
|
|
*/
|
|
function wishlist_author() {
|
|
if ( is_array( $this->wishlist ) && array_key_exists( 'author', $this->wishlist ) ) {
|
|
return $this->wishlist['author'];
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Get product info
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
private function product_data( $product_id, $variation_id = 0 ) {
|
|
$product_id = absint( $product_id );
|
|
$variation_id = absint( $variation_id );
|
|
|
|
if ( 'product_variation' == get_post_type( $product_id ) ) { // WPCS: loose comparison ok.
|
|
$variation_id = $product_id;
|
|
$product_id = wp_get_post_parent_id( $variation_id );
|
|
}
|
|
|
|
$product_data = wc_get_product( $variation_id ? $variation_id : $product_id );
|
|
|
|
if ( ! $product_data || 'trash' === $product_data->post->post_status ) {
|
|
return null;
|
|
}
|
|
|
|
$product_data->variation_id = absint( $product_data->variation_id );
|
|
|
|
return $product_data;
|
|
}
|
|
|
|
/**
|
|
* Add views analitycs
|
|
*
|
|
* @param integer $wishlist_id If exist wishlist object, you can put 0.
|
|
* @param boolean $author is author wislist.
|
|
*
|
|
*/
|
|
function view_products( $wishlist, $author = null ) {
|
|
$products = TInvWL_Public_Wishlist_View::instance()->get_current_products_query();
|
|
if ( empty( $products ) || ! is_array( $products ) ) {
|
|
return false;
|
|
}
|
|
$data = array();
|
|
foreach ( $products as $key => $product ) {
|
|
$data['product_ids'][ $key ] = $product['product_id'];
|
|
$data['variation_ids'][ $key ] = $product['variation_id'];
|
|
}
|
|
|
|
$this->add( ( $author ? 'author' : 'visite' ), $wishlist['ID'], $data['product_ids'], $data['variation_ids'] );
|
|
}
|
|
|
|
/**
|
|
* Apply analytics actions
|
|
*
|
|
* @param string $type Type action.
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
private function _product( $type, $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
$wishlist_id = $this->wishlist_id();
|
|
$quantity = absint( $quantity );
|
|
|
|
return $this->add( $type, $wishlist_id, $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Add to wishlist product
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function added( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'added', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Add to cart product
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function cart_product( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'add_to_cart', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Bougt product
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function sell_product( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'sell', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Click to product page from wishlist
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function click_product_from_wl( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'click', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Click to product page from wishlist by author
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function click_author_product_from_wl( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'author_click', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Bought product from wishlist
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function sell_product_from_wl( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'wishlist', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Gifted product
|
|
*
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applyed product.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function gifted_product( $product_id, $variation_id = 0, $quantity = 1 ) {
|
|
return $this->_product( 'gift', $product_id, $variation_id, $quantity );
|
|
}
|
|
|
|
/**
|
|
* Add action product
|
|
*
|
|
* @param string $type Action field.
|
|
* @param integer $wishlist_id If exist wishlist object, you can put 0.
|
|
* @param integer $product_id Product id.
|
|
* @param integer $variation_id Product variation id.
|
|
* @param integer $quantity Quantity applied actions.
|
|
*
|
|
* @return boolean
|
|
* @global wpdb $wpdb
|
|
*/
|
|
function add( $type = 'visite', $wishlist_id = 0, $product_id = 0, $variation_id = 0, $quantity = 1 ) {
|
|
if ( ! in_array( $type, array(
|
|
'added',
|
|
'add_to_cart',
|
|
'author',
|
|
'author_click',
|
|
'click',
|
|
'gift',
|
|
'visite',
|
|
'wishlist',
|
|
) ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
|
return false;
|
|
}
|
|
if ( empty( $wishlist_id ) ) {
|
|
$wishlist_id = $this->wishlist_id();
|
|
}
|
|
if ( empty( $wishlist_id ) ) {
|
|
return false;
|
|
}
|
|
|
|
$product_id = ( is_array( $product_id ) ) ? $product_id : array( $product_id );
|
|
$variation_id = ( is_array( $variation_id ) ) ? $variation_id : array( $variation_id );
|
|
if ( empty( $product_id ) && ! empty( $variation_id ) ) {
|
|
$ids = array();
|
|
foreach ( $product_id as $key => $id ) {
|
|
$product_data = $this->product_data( $id, $variation_id[ $key ] );
|
|
if ( $product_data ) {
|
|
$ids['product_id'][ $key ] = $product_data->is_type( 'variation' ) ? $product_data->get_parent_id() : $product_data->get_id();
|
|
$ids['variation_id'][ $key ] = $product_data->is_type( 'variation' ) ? $product_data->get_id() : 0;
|
|
}
|
|
}
|
|
if ( empty( $ids ) ) {
|
|
return false;
|
|
}
|
|
$product_id = $ids['product_id'];
|
|
$variation_id = $ids['variation_id'];
|
|
}
|
|
$data = array(
|
|
'wishlist_id' => $wishlist_id,
|
|
'product_id' => $product_id,
|
|
'variation_id' => $variation_id,
|
|
);
|
|
|
|
foreach ( $product_id as $key => $id ) {
|
|
$data['ID'][ $key ] = md5( implode( '|', array(
|
|
'wishlist_id' => $wishlist_id,
|
|
'product_id' => $id,
|
|
'variation_id' => $variation_id[ $key ],
|
|
) ) );
|
|
}
|
|
|
|
if ( 'visite' == $type ) { // WPCS: loose comparison ok.
|
|
$user = wp_get_current_user();
|
|
if ( $user->exists() ) {
|
|
if ( $this->wishlist_author() == $user->ID ) { // WPCS: loose comparison ok.
|
|
$type = 'author';
|
|
}
|
|
}
|
|
}
|
|
switch ( $type ) {
|
|
case 'author':
|
|
$data['visite_author'] = $quantity;
|
|
break;
|
|
case 'visite':
|
|
$data['visite'] = $quantity;
|
|
break;
|
|
case 'author_click':
|
|
$data['click_author'] = $quantity;
|
|
break;
|
|
case 'click':
|
|
$data['click'] = $quantity;
|
|
break;
|
|
case 'add_to_cart':
|
|
$data['cart'] = $quantity;
|
|
break;
|
|
case 'gift':
|
|
$data['sell_as_gift'] = $quantity;
|
|
break;
|
|
case 'wishlist':
|
|
$data['sell_of_wishlist'] = $quantity;
|
|
break;
|
|
}
|
|
switch ( $type ) {
|
|
case 'added':
|
|
case 'author':
|
|
case 'visite':
|
|
break;
|
|
default :
|
|
if ( empty( $product_id ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
$fields = array();
|
|
$values = array();
|
|
$duplicates = array();
|
|
foreach ( array_keys( $product_id ) as $index ) {
|
|
foreach ( $data as $key => $value ) {
|
|
if ( 0 === $index ) {
|
|
$fields[] = $key;
|
|
if ( in_array( $key, array(
|
|
'cart',
|
|
'sell_as_gift',
|
|
'click_author',
|
|
'click',
|
|
'sell_of_wishlist',
|
|
'visite',
|
|
'visite_author',
|
|
'added',
|
|
) ) ) { // @codingStandardsIgnoreLine WordPress.PHP.StrictInArray.MissingTrueStrict
|
|
$duplicates[] = sprintf( '`%s`=`%s`+%d', $key, $key, $value );
|
|
}
|
|
}
|
|
|
|
if ( in_array( $key, array( 'product_id', 'variation_id', 'ID' ) ) ) {
|
|
$values[ $index ][] = $value[ $index ];
|
|
} else {
|
|
$values[ $index ][] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
$fields = '`' . implode( '`,`', $fields ) . '`';
|
|
$data = array();
|
|
foreach ( $values as $value ) {
|
|
$data[] = "('" . implode( "','", $value ) . "')";
|
|
}
|
|
$data = implode( ",", $data );
|
|
$duplicates = implode( ',', $duplicates );
|
|
|
|
global $wpdb;
|
|
|
|
return $wpdb->query( "INSERT INTO `$this->table` ($fields) VALUES $data ON DUPLICATE KEY UPDATE $duplicates" ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
}
|
|
|
|
/**
|
|
* Get products
|
|
*
|
|
* @param array $data Request.
|
|
*
|
|
* @return array
|
|
* @global wpdb $wpdb
|
|
*/
|
|
function get( $data = array() ) {
|
|
$default = array(
|
|
'count' => 10,
|
|
'field' => null,
|
|
'offset' => 0,
|
|
'order' => 'ASC',
|
|
'order_by' => 'visite',
|
|
'external' => true,
|
|
'sql' => '',
|
|
);
|
|
|
|
foreach ( array_keys( $default ) as $_k ) {
|
|
if ( array_key_exists( $_k, $data ) ) {
|
|
$default[ $_k ] = $data[ $_k ];
|
|
unset( $data[ $_k ] );
|
|
}
|
|
}
|
|
|
|
$default['offset'] = absint( $default['offset'] );
|
|
$default['count'] = absint( $default['count'] );
|
|
if ( is_array( $default['field'] ) ) {
|
|
$default['field'] = '`' . implode( '`,`', $default['field'] ) . '`';
|
|
} elseif ( is_string( $default['field'] ) ) {
|
|
$default['field'] = array( 'ID', $default['field'] );
|
|
$default['field'] = '`' . implode( '`,`', $default['field'] ) . '`';
|
|
} else {
|
|
$default['field'] = '*';
|
|
}
|
|
$sql = "SELECT {$default[ 'field' ]} FROM `{$this->table}`";
|
|
|
|
$where = '1';
|
|
if ( ! empty( $data ) && is_array( $data ) ) {
|
|
foreach ( $data as $f => $v ) {
|
|
$s = is_array( $v ) ? ' IN ' : '=';
|
|
if ( is_array( $v ) ) {
|
|
$v = "'" . implode( "','", $v ) . "'";
|
|
$v = "($v)";
|
|
} else {
|
|
$v = "'$v'";
|
|
}
|
|
$data[ $f ] = sprintf( '`%s`%s%s', $f, $s, $v );
|
|
}
|
|
$where = implode( ' AND ', $data );
|
|
$sql .= ' WHERE ' . $where;
|
|
}
|
|
|
|
$sql .= sprintf( ' ORDER BY `%s` %s LIMIT %d,%d;', $default['order_by'], $default['order'], $default['offset'], $default['count'] );
|
|
if ( ! empty( $default['sql'] ) ) {
|
|
$replacer = $replace = array();
|
|
$replace[0] = '{table}';
|
|
$replacer[0] = $this->table;
|
|
$replace[1] = '{where}';
|
|
$replacer[1] = $where;
|
|
|
|
foreach ( $default as $key => $value ) {
|
|
$i = count( $replace );
|
|
|
|
$replace[ $i ] = '{' . $key . '}';
|
|
$replacer[ $i ] = $value;
|
|
}
|
|
|
|
$sql = str_replace( $replace, $replacer, $default['sql'] );
|
|
}
|
|
global $wpdb;
|
|
$products = $wpdb->get_results( $sql, ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
|
|
if ( empty( $products ) ) {
|
|
return array();
|
|
}
|
|
if ( $default['external'] ) {
|
|
foreach ( $products as $k => $product ) {
|
|
$product_data = $this->product_data( $product['variation_id'], $product['product_id'] );
|
|
if ( $product_data ) {
|
|
$product['product_id'] = $product_data->is_type( 'variation' ) ? $product_data->get_parent_id() : $product_data->get_id();
|
|
$product['variation_id'] = $product_data->is_type( 'variation' ) ? $product_data->get_id() : 0;
|
|
}
|
|
$product['data'] = $product_data;
|
|
$products[ $k ] = $product;
|
|
}
|
|
}
|
|
|
|
return $products;
|
|
}
|
|
|
|
/**
|
|
* Get Analytics
|
|
*
|
|
* @param integer $wishlist_id If exist wishlist object, you can put 0.
|
|
*
|
|
* @return array
|
|
* @global wpdb $wpdb
|
|
*/
|
|
function get_wishlist( $wishlist_id = 0 ) {
|
|
$wishlist_id = absint( $wishlist_id );
|
|
if ( empty( $wishlist_id ) ) {
|
|
$wishlist_id = $this->wishlist_id();
|
|
}
|
|
global $wpdb;
|
|
|
|
if ( empty( $wishlist_id ) ) {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`visite`, `visite_author` FROM `$this->table` WHERE `product_id`=%d AND `variation_id`=%d;", 0, 0 ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
} else {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`visite`, `visite_author` FROM `$this->table` WHERE `wishlist_id`=%d AND `product_id`=%d AND `variation_id`=%d;", $wishlist_id, 0, 0 ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
}
|
|
if ( empty( $analytics ) ) {
|
|
return array();
|
|
}
|
|
foreach ( $analytics as $key => $analytic ) {
|
|
foreach ( $analytic as $field => $value ) {
|
|
$analytic[ $field ] = absint( $value );
|
|
}
|
|
$analytics[ $key ] = $analytic;
|
|
}
|
|
|
|
return $analytics;
|
|
}
|
|
|
|
/**
|
|
* Get Analytics Product
|
|
*
|
|
* @param int $wishlist_id If exist wishlist object, you can put 0.
|
|
* @param int $product_id Product id.
|
|
* @param int $variation_id Product variation id.
|
|
*
|
|
* @return array
|
|
* @global wpdb $wpdb
|
|
*/
|
|
function get_product( $wishlist_id = 0, $product_id = 0, $variation_id = 0 ) {
|
|
|
|
$wishlist_id = absint( $wishlist_id );
|
|
if ( empty( $wishlist_id ) ) {
|
|
$wishlist_id = $this->wishlist_id();
|
|
}
|
|
$wishlist_id = absint( $wishlist_id );
|
|
$product_id = absint( $product_id );
|
|
$variation_id = absint( $variation_id );
|
|
if ( ! empty( $product_id ) || ! empty( $variation_id ) ) {
|
|
$product_data = $this->product_data( $product_id, $variation_id );
|
|
if ( $product_data ) {
|
|
$product_id = $product_data->is_type( 'variation' ) ? $product_data->get_parent_id() : $product_data->get_id();
|
|
$variation_id = $product_data->is_type( 'variation' ) ? $product_data->get_id() : 0;
|
|
} else {
|
|
$product_id = 0;
|
|
$variation_id = 0;
|
|
}
|
|
} else {
|
|
$product_id = 0;
|
|
$variation_id = 0;
|
|
}
|
|
|
|
global $wpdb;
|
|
$analytics = array();
|
|
if ( empty( $product_id ) && empty( $variation_id ) ) {
|
|
if ( empty( $wishlist_id ) ) {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`product_id`,`variation_id`,`sell`, `sell_of_wishlist`, `sell_as_gift` FROM `$this->table` WHERE `product_id`<>%d AND `variation_id`<>%d;", 0, 0 ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
} else {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`product_id`,`variation_id`,`sell`, `sell_of_wishlist`, `sell_as_gift` FROM `$this->table` WHERE `wishlist_id`=%d AND `product_id`<>%d AND `variation_id`<>%d;", $wishlist_id, 0, 0 ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
}
|
|
} else {
|
|
if ( empty( $wishlist_id ) ) {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`product_id`,`variation_id`,`sell`, `sell_of_wishlist`, `sell_as_gift` FROM `$this->table` WHERE `product_id`=%d AND `variation_id`=%d;", $product_id, $variation_id ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
} else {
|
|
$analytics = $wpdb->get_results( $wpdb->prepare( "SELECT `wishlist_id`,`product_id`,`variation_id`,`sell`, `sell_of_wishlist`, `sell_as_gift` FROM `$this->table` WHERE `wishlist_id`=%d AND `product_id`=%d AND `variation_id`=%d;", $wishlist_id, $product_id, $variation_id ), ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
|
|
}
|
|
}
|
|
if ( empty( $analytics ) ) {
|
|
return array();
|
|
}
|
|
|
|
foreach ( $analytics as $key => $analytic ) {
|
|
foreach ( $analytic as $field => $value ) {
|
|
$analytic[ $field ] = absint( $value );
|
|
}
|
|
$analytics[ $key ] = $analytic;
|
|
}
|
|
|
|
return $analytics;
|
|
}
|
|
}
|