Files
medicalalert-web-reloaded/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-global-coupons.php
2024-06-17 16:29:48 -04:00

348 lines
12 KiB
PHP

<?php
/**
* Maintain Global Coupon's record
*
* @author StoreApps
* @since 3.3.0
* @version 1.9.0
*
* @package woocommerce-smart-coupons/includes/
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'WC_SC_Global_Coupons' ) ) {
/**
* Class for handling global coupons
*/
class WC_SC_Global_Coupons {
/**
* Variable to hold instance of WC_SC_Global_Coupons
*
* @var $instance
*/
private static $instance = null;
/**
* Constructor
*/
private function __construct() {
add_action( 'admin_init', array( $this, 'set_global_coupons' ) );
add_action( 'woocommerce_coupon_options_save', array( $this, 'update_global_coupons' ), 99, 2 );
add_action( 'deleted_post', array( $this, 'sc_delete_global_coupons' ) );
add_action( 'trashed_post', array( $this, 'sc_delete_global_coupons' ) );
add_action( 'untrashed_post', array( $this, 'sc_untrash_global_coupons' ) );
add_action( 'future_to_publish', array( $this, 'future_to_publish_global_coupons' ) );
}
/**
* Get single instance of WC_SC_Global_Coupons
*
* @return WC_SC_Global_Coupons Singleton object of WC_SC_Global_Coupons
*/
public static function get_instance() {
// Check if instance is already exists.
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Handle call to functions which is not available in this class
*
* @param string $function_name The function name.
* @param array $arguments Array of arguments passed while calling $function_name.
* @return result of function call
*/
public function __call( $function_name = '', $arguments = array() ) {
global $woocommerce_smart_coupon;
if ( ! is_callable( array( $woocommerce_smart_coupon, $function_name ) ) ) {
return;
}
if ( ! empty( $arguments ) ) {
return call_user_func_array( array( $woocommerce_smart_coupon, $function_name ), $arguments );
} else {
return call_user_func( array( $woocommerce_smart_coupon, $function_name ) );
}
}
/**
* Set global coupons in options table for faster fetching
*/
public function set_global_coupons() {
global $wpdb;
$global_coupon_option_name = 'sc_display_global_coupons';
$global_coupons = $this->sc_get_option( $global_coupon_option_name );
$current_sc_version = get_option( 'sa_sc_db_version', '' ); // code for updating the db - for autoload related fix.
if ( false === $global_coupons ) {
$wpdb->query( $wpdb->prepare( 'SET SESSION group_concat_max_len=%d', 999999 ) ); // phpcs:ignore
$wpdb->delete( $wpdb->prefix . 'options', array( 'option_name' => $global_coupon_option_name ) ); // WPCS: cache ok, db call ok.
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"REPLACE INTO {$wpdb->prefix}options (option_name, option_value, autoload)
SELECT %s,
IFNULL(GROUP_CONCAT(p.id SEPARATOR ','), ''),
%s
FROM {$wpdb->prefix}posts AS p
JOIN {$wpdb->prefix}postmeta AS pm
ON(pm.post_id = p.ID
AND p.post_type = %s
AND p.post_status = %s
AND pm.meta_key = %s
AND pm.meta_value = %s)
",
$global_coupon_option_name,
'no',
'shop_coupon',
'publish',
'sc_is_visible_storewide',
'yes'
)
);
if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) {
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"UPDATE {$wpdb->prefix}options
SET option_value = (SELECT IFNULL(GROUP_CONCAT(DISTINCT pm.post_id SEPARATOR ','), '')
FROM {$wpdb->prefix}postmeta AS pm
WHERE ( ( pm.meta_key = %s AND CAST(pm.meta_value AS CHAR) = %s )
OR NOT EXISTS( SELECT 1 FROM {$wpdb->prefix}postmeta AS pm1 WHERE pm1.meta_key = %s AND pm.post_id = pm1.post_id ) )
AND FIND_IN_SET(pm.post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 )
WHERE option_name = %s",
'customer_email',
'a:0:{}',
'customer_email',
$global_coupon_option_name,
$global_coupon_option_name
)
);
if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) {
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"UPDATE {$wpdb->prefix}options
SET option_value = (SELECT IFNULL(GROUP_CONCAT(post_id SEPARATOR ','), '')
FROM {$wpdb->prefix}postmeta
WHERE meta_key = %s
AND CAST(meta_value AS CHAR) != %s
AND FIND_IN_SET(post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 )
WHERE option_name = %s",
'auto_generate_coupon',
'yes',
$global_coupon_option_name,
$global_coupon_option_name
)
);
if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) {
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"UPDATE {$wpdb->prefix}options
SET option_value = (SELECT IFNULL(GROUP_CONCAT(post_id SEPARATOR ','), '')
FROM {$wpdb->prefix}postmeta
WHERE meta_key = %s
AND CAST(meta_value AS CHAR) != %s
AND FIND_IN_SET(post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 )
WHERE option_name = %s",
'discount_type',
'smart_coupon',
$global_coupon_option_name,
$global_coupon_option_name
)
);
if ( ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) {
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"UPDATE {$wpdb->prefix}options
SET option_value = (SELECT IFNULL(GROUP_CONCAT(DISTINCT pm_expiry_date.post_id SEPARATOR ','), '')
FROM {$wpdb->prefix}postmeta AS pm_expiry_date
JOIN {$wpdb->prefix}postmeta AS pm_expiry_time
on ( pm_expiry_time.post_id = pm_expiry_date.post_id
AND pm_expiry_date.meta_key = %s
AND pm_expiry_time.meta_key = %s
)
WHERE ( (pm_expiry_date.meta_value IS NULL OR pm_expiry_date.meta_value = '')
OR ( IFNULL(pm_expiry_date.meta_value, 0) + IFNULL(pm_expiry_time.meta_value, 0) ) > %d )
AND FIND_IN_SET(pm_expiry_date.post_id, (SELECT option_value FROM (SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s) as temp )) > 0 )
WHERE option_name = %s",
'date_expires',
'wc_sc_expiry_time',
time(),
$global_coupon_option_name,
$global_coupon_option_name
)
);
$global_coupons = $this->sc_get_option( $global_coupon_option_name );
}
}
}
}
}
if ( ( empty( $current_sc_version ) || version_compare( $current_sc_version, '3.3.6', '<' ) ) && ! empty( $this->sc_get_option( $global_coupon_option_name ) ) ) {
$wpdb->query( // phpcs:ignore
$wpdb->prepare(
"UPDATE {$wpdb->prefix}options
SET autoload = %s
WHERE option_name = %s",
'no',
$global_coupon_option_name
)
);
$current_sc_version = '3.3.6';
update_option( 'sa_sc_db_version', $current_sc_version, 'no' );
}
}
/**
* Function to update list of global coupons
*
* @param int $post_id The post id.
* @param string $action Action.
* @param WC_Coupon $coupon The coupon object.
*/
public function sc_update_global_coupons( $post_id, $action = 'add', $coupon = null ) {
if ( empty( $post_id ) ) {
return;
}
if ( 'shop_coupon' !== $this->get_post_type( $post_id ) ) {
return;
}
$coupon = new WC_Coupon( $post_id );
$coupon_status = ( $this->is_wc_greater_than( '6.1.2' ) && $this->is_callable( $coupon, 'get_status' ) ) ? $coupon->get_status() : get_post_status( $post_id );
if ( $this->is_callable( $coupon, 'get_meta' ) ) {
$customer_email = $coupon->get_email_restrictions();
$sc_is_visible_storewide = $coupon->get_meta( 'sc_is_visible_storewide' );
$auto_generate_coupon = $coupon->get_meta( 'auto_generate_coupon' );
$discount_type = $coupon->get_discount_type();
} else {
$coupon_meta = get_post_meta( $post_id );
$customer_email = ( ! empty( $coupon_meta['customer_email'] ) ) ? $coupon_meta['customer_email'][0] : '';
$sc_is_visible_storewide = ( ! empty( $coupon_meta['sc_is_visible_storewide'] ) ) ? $coupon_meta['sc_is_visible_storewide'][0] : '';
$auto_generate_coupon = ( ! empty( $coupon_meta['auto_generate_coupon'] ) ) ? $coupon_meta['auto_generate_coupon'][0] : '';
$discount_type = ( ! empty( $coupon_meta['discount_type'] ) ) ? $coupon_meta['discount_type'][0] : '';
}
$global_coupons_list = get_option( 'sc_display_global_coupons' );
$global_coupons = ( ! empty( $global_coupons_list ) ) ? explode( ',', $global_coupons_list ) : array();
$key = array_search( (string) $post_id, $global_coupons, true );
if ( ( 'publish' === $coupon_status
&& ( empty( $customer_email ) || serialize( array() ) === $customer_email ) // phpcs:ignore
&& ( ! empty( $sc_is_visible_storewide ) && 'yes' === $sc_is_visible_storewide )
&& ( ! empty( $auto_generate_coupon ) && 'yes' !== $auto_generate_coupon )
&& ( ! empty( $discount_type ) && 'smart_coupon' !== $discount_type ) )
|| ( 'trash' === $coupon_status && 'delete' === $action ) ) {
if ( 'add' === $action && false === $key ) {
$global_coupons[] = $post_id;
} elseif ( 'delete' === $action && false !== $key ) {
unset( $global_coupons[ $key ] );
}
} else {
if ( false !== $key ) {
unset( $global_coupons[ $key ] );
}
}
update_option( 'sc_display_global_coupons', implode( ',', array_unique( $global_coupons ) ), 'no' );
}
/**
* Function to update list of global coupons on trash / delete coupon
*
* @param int $post_id The post id.
*/
public function sc_delete_global_coupons( $post_id ) {
if ( empty( $post_id ) ) {
return;
}
if ( 'shop_coupon' !== $this->get_post_type( $post_id ) ) {
return;
}
$this->sc_update_global_coupons( $post_id, 'delete' );
}
/**
* Function to update list of global coupons on untrash coupon
*
* @param int $post_id The post id.
*/
public function sc_untrash_global_coupons( $post_id ) {
if ( empty( $post_id ) ) {
return;
}
if ( 'shop_coupon' !== $this->get_post_type( $post_id ) ) {
return;
}
$this->sc_update_global_coupons( $post_id );
}
/**
* Update global coupons data for sheduled coupons
*
* @param WP_Post $post The post object.
*/
public function future_to_publish_global_coupons( $post = null ) {
$post_id = ( ! empty( $post->ID ) ) ? $post->ID : 0;
if ( empty( $post ) || empty( $post_id ) ) {
return;
}
if ( 'shop_coupon' !== $post->post_type ) {
return;
}
$this->sc_update_global_coupons( $post_id );
}
/**
* Update global coupons on saving coupon
*
* @param int $post_id The post id.
* @param WC_Coupon $coupon The coupon object.
*/
public function update_global_coupons( $post_id = 0, $coupon = null ) {
if ( empty( $post_id ) ) {
return;
}
if ( is_null( $coupon ) || ! is_a( $coupon, 'WC_Coupon' ) ) {
$coupon = new WC_Coupon( $post_id );
}
$this->sc_update_global_coupons( $post_id, 'add', $coupon );
}
}
}
WC_SC_Global_Coupons::get_instance();