/** * Cart Abandonment * * @package Woocommerce-Cart-Abandonment-Recovery */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Cart abandonment tracking class. */ class Cartflows_Ca_Setting_Functions { /** * Member Variable * * @var object instance */ private static $instance; /** * Initiator */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Constructor function that initializes required actions and hooks. */ public function __construct() { $page = Cartflows_Ca_Helper::get_instance()->sanitize_text_filter( 'page', 'GET' ); if ( WCF_CA_PAGE_NAME === $page ) { // Adding filter to add new button to add custom fields. add_filter( 'mce_buttons', array( $this, 'wcf_filter_mce_button' ) ); add_filter( 'mce_external_plugins', array( $this, 'wcf_filter_mce_plugin' ), 9 ); } // GDPR actions. add_action( 'wp_ajax_cartflows_skip_cart_tracking_gdpr', array( $this, 'skip_cart_tracking_by_gdpr' ) ); add_action( 'wp_ajax_nopriv_cartflows_skip_cart_tracking_gdpr', array( $this, 'skip_cart_tracking_by_gdpr' ) ); // Delete coupons. add_action( 'wp_ajax_wcf_ca_delete_garbage_coupons', array( $this, 'delete_used_and_expired_coupons' ) ); } /** * Register button. * * @param array $buttons mce buttons. * @return mixed */ public function wcf_filter_mce_button( $buttons ) { array_push( $buttons, 'cartflows_ac' ); return $buttons; } /** * Link JS to mce button. * * @param array $plugins mce pluggins. * @return mixed */ public function wcf_filter_mce_plugin( $plugins ) { $file_ext = Cartflows_Ca_Helper::get_instance()->get_js_file_ext(); $plugins['cartflows_ac'] = CARTFLOWS_CA_URL . 'admin/assets/' . $file_ext['folder'] . '/admin-mce.' . $file_ext['file_ext']; return $plugins; } /** * Delete tracked data and set cookie for the user. */ public function skip_cart_tracking_by_gdpr() { check_ajax_referer( 'cartflows_skip_cart_tracking_gdpr', 'security' ); global $wpdb; $cart_abandonment_table = $wpdb->prefix . CARTFLOWS_CA_CART_ABANDONMENT_TABLE; $session_id = WC()->session->get( 'wcf_session_id' ); if ( $session_id ) { $wpdb->delete( $cart_abandonment_table, array( 'session_id' => sanitize_key( $session_id ) ) ); // db call ok; no cache ok. } // Ignoring below rule as it need to replace the already build cookie logic to another logic. Can be update in future scope. setcookie( 'wcf_ca_skip_track_data', 'true', 0, '/' ); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.cookies_setcookie wp_send_json_success(); } /** * Check if transient is set for delete garbage coupons. */ public function delete_used_and_expired_coupons() { $is_ajax_request = wp_doing_ajax(); $is_transient_set = false; global $wpdb; if ( $is_ajax_request ) { if ( ! current_user_can( 'manage_woocommerce' ) ) { wp_send_json_error( __( 'Permission denied.', 'woo-cart-abandonment-recovery' ) ); } check_ajax_referer( 'wcf_ca_delete_garbage_coupons', 'security' ); } else { $is_transient_set = get_transient( 'woocommerce_ca_delete_garbage_coupons' ); } if ( false === $is_transient_set || $is_ajax_request ) { $coupons = $this->delete_garbage_coupons(); $coupon_count = count( $coupons ); if ( $coupon_count ) { $coupons_post_ids = implode( ',', wp_list_pluck( $coupons, 'ID' ) ); // Can't use placeholders for table/column names, it will be wrapped by a single quote (') instead of a backquote (`). $wpdb->query( "DELETE FROM {$wpdb->prefix}postmeta WHERE post_id IN( $coupons_post_ids )" //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared ); // db call ok; no cache ok. $wpdb->query( "DELETE FROM {$wpdb->prefix}posts WHERE ID IN( $coupons_post_ids )" //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared ); // db call ok; no cache ok. } if ( ! $is_ajax_request ) { set_transient( 'woocommerce_ca_delete_garbage_coupons', $coupons, WEEK_IN_SECONDS ); return; } // translators: %1$s: Coupons Deleted, %2$s: Deleted coupons count'. wp_send_json_success( sprintf( __( '%1$s: %2$d', 'woo-cart-abandonment-recovery' ), 'Coupons Deleted', $coupon_count ) ); } } /** * Set transient and delete garbage coupons. */ public function delete_garbage_coupons() { global $wpdb; $coupon_generated_by = WCF_CA_COUPON_GENERATED_BY; $timestamp = time(); $post_type = 'shop_coupon'; $coupons = $wpdb->get_results( $wpdb->prepare( "SELECT ID, coupon_code, usage_limit, total_usaged, expiry_date FROM ( SELECT p.ID, p.post_title AS coupon_code, Max(CASE WHEN pm.meta_key = 'date_expires' AND p.`ID` = pm.`post_id` THEN pm.meta_value END) AS expiry_date, Max(CASE WHEN pm.meta_key = 'usage_limit' AND p.`ID` = pm.`post_id` THEN pm.meta_value END) AS usage_limit, Max(CASE WHEN pm.meta_key = 'usage_count' AND p.`ID` = pm.`post_id` THEN pm.meta_value END) AS total_usaged, Max(CASE WHEN pm.meta_key = 'coupon_generated_by' AND p.`ID` = pm.`post_id` THEN pm.meta_value END) AS coupon_generated_by FROM {$wpdb->prefix}posts AS p INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id WHERE p.`post_type` = %s GROUP BY p.ID ) AS final_res WHERE coupon_generated_by IS NOT NULL AND coupon_generated_by = %s AND ( ( usage_limit = total_usaged ) OR ( expiry_date <= %d AND expiry_date != '') )", $post_type, $coupon_generated_by, $timestamp ) ); // db call ok; no cache ok. return $coupons; } } Cartflows_Ca_Setting_Functions::get_instance(); https://validator.w3.org/feed/docs/rss2.html Portugal: um mosaico de lugares emocionantes e dicas de viagem Discover the Enjoyment of Gambling Enterprise Online genuine Money Casino online Fairspin em Portugal: diretório de entretenimento, promoções, análises de jogadores Wpływ sztucznej inteligencji na kasyna online Онлайн гэмблинг-платформа с возможностью ставок на спорт Better Roulette Sites & Incentives January 2025 Deuces Crazy Web based poker Totally free Instantaneous Gamble Video game Desktop computer Apple’s ios Android Bitcoin Gambling establishment No deposit Added bonus Listing For Get 2024 Vbet Danmark – Jaag op de Winst Test Post for WordPress Test Post for WordPress Online Online Casinos that Approve PayPal: A Comprehensive Guide Best Roulette Internet sites & Incentives January 2025 Лучшее казино: главный портал и азартные возможности Alcoholic Thinking Understanding the Insanity of Alcoholism: How the Alcoholic Thinks Топ доверенных онлайн-казино: как выбрать лучший клуб The Impact of Artificial Intelligence on Casino Operations The Evolution of Casino Gaming: From Traditional to Online Онлайн игровое заведение вне требуемой идентификации в течение года 2025 Современные игорные заведения с выгодными бонусами и вознаграждениями Портативные игорные заведения 2025: азартные автоматы, привилегии и депозиты Казино с упором на бонусы и промоакции Online Kumarhanelerin Yükselişi ve Geleceği The Evolution of Mobile Gaming in Casinos Casino Loyallıq Proqramlarının Təkamülü Современное игорное заведение с выгодными акциями и выигрышами Наилучшие виртуальные казино с многообразием слотов и бонусов Budget For A Non Profit Organization + Template & Example Signbridge-audio To Signal Language Translator Ieee Convention Publication Как Носить Скинни-джинсы Девушкам С Аппетитными Формами Algorithmic Buying And Selling Methods: A Detailed Guide Top Mobile Gambling Enterprises: The Ultimate Guide for Gamblers on the Go Test Post Online Casino Free Rotates: An Overview to Maximizing Your Payouts Рецензия казино: создание аккаунта, акции и денежные ставки pin up Cutting Edge Know-how: Trends That Reshape The World In 2024 Main It Outsourcing Firm In Vietnam Инкогнито онлайн гэмблинг-платформы: Азарт вне подтверждения личности и бумаг. LoneStar Casino promo code: New users get 100K GC + 2 5 free SC Sites Like RealPrize Casino Social Casinos Test Post Топ мобильных казино в 2025 году Best Real Money Online Casino No Deposit Bonuses June 2025 Best Online Casino Sites US Real Money Casinos 2025 THC Detox Calculator Обзор официального сайта онлайн казино Starda Робота: менеджер з продажу туристичних послуг дистанційно Вакансії і робота Mother your children are like birds Робота: менеджер з продажу туристичних послуг дистанційно Вакансії і робота Робота: менеджер з продажу туристичних послуг дистанційно Вакансії і робота Découverte approfondie : Chicken Road et ses secrets – Édition premium française