/** * 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 Casino online Fairspin em Portugal: diretório de entretenimento, promoções, análises de jogadores Wpływ sztucznej inteligencji na kasyna online Робота: менеджер з продажу туристичних послуг дистанційно Вакансії і робота 958493691759040325 Топ доверенных онлайн-казино: как выбрать лучший клуб Test Post for WordPress Лучшее казино: главный портал и азартные возможности Онлайн гэмблинг-платформа с возможностью ставок на спорт Découverte approfondie : Chicken Road et ses secrets – Édition premium française 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 Best Roulette Internet sites & Incentives January 2025 Alcoholic Thinking Understanding the Insanity of Alcoholism: How the Alcoholic Thinks The Evolution of Casino Gaming: From Traditional to Online Test Post for WordPress The Impact of Artificial Intelligence on Casino Operations Онлайн игровое заведение вне требуемой идентификации в течение года 2025 Казино с упором на бонусы и промоакции The Evolution of Mobile Gaming in Casinos Современные игорные заведения с выгодными бонусами и вознаграждениями Casino Loyallıq Proqramlarının Təkamülü Online Kumarhanelerin Yükselişi ve Geleceği Портативные игорные заведения 2025: азартные автоматы, привилегии и депозиты Обзор официального сайта онлайн казино Starda Mother your children are like birds Как Носить Скинни-джинсы Девушкам С Аппетитными Формами Online Casino Free Rotates: An Overview to Maximizing Your Payouts Рецензия казино: создание аккаунта, акции и денежные ставки pin up Signbridge-audio To Signal Language Translator Ieee Convention Publication Vbet Danmark – Jaag op de Winst Top Mobile Gambling Enterprises: The Ultimate Guide for Gamblers on the Go Современное игорное заведение с выгодными акциями и выигрышами Наилучшие виртуальные казино с многообразием слотов и бонусов Test Post Test Post Algorithmic Buying And Selling Methods: A Detailed Guide Budget For A Non Profit Organization + Template & Example Cutting Edge Know-how: Trends That Reshape The World In 2024 Main It Outsourcing Firm In Vietnam Инкогнито онлайн гэмблинг-платформы: Азарт вне подтверждения личности и бумаг. Discover the Enjoyment of Gambling Enterprise Online genuine Money LoneStar Casino promo code: New users get 100K GC + 2 5 free SC Online Online Casinos that Approve PayPal: A Comprehensive Guide Робота: менеджер з продажу туристичних послуг дистанційно Вакансії і робота THC Detox Calculator Best Real Money Online Casino No Deposit Bonuses June 2025 Best Online Casino Sites US Real Money Casinos 2025 Топ мобильных казино в 2025 году Sites Like RealPrize Casino Social Casinos