plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); $this->plugin_url = WP_PLUGIN_URL . '/' . str_replace( basename( __FILE__ ), '' , plugin_basename( __FILE__ ) ); add_action( 'plugins_loaded', array( &$this, 'version_check' ), 10 ); } public function version_check() { global $woocommerce; if ( version_compare( $woocommerce->version, $this->min_woocommerce_version ) >= 0 ) $this->init(); else add_action( 'admin_notices', array( &$this, 'admin_notice' ) ); } public function admin_notice(){ echo '

' . sprintf( __( 'WooCommerce Donations extension requires at least WooCommerce %s in order to function. Please upgrade your WooCommerce.', 'woocommerce'), $this->min_woocommerce_version ) . '

'; } public function init(){ // Setup Product Data add_action( 'the_post', array( &$this, 'setup_product' ), 20 ); // Single Product Display add_action( 'wp_enqueue_scripts', array( &$this, 'donation_style' ) ); add_action( 'wp_footer', array( &$this, 'wp_footer' ), 99999 ); add_filter( 'woocommerce_cart_item_quantity', array( &$this, 'woocommerce_cart_item_quantity' ), 9999, 2 ); add_action( 'woocommerce_before_main_content', array( &$this, 'donation_templates' ) ); // Loop Display add_action( 'woocommerce_after_shop_loop_item_title', array( &$this, 'remove_loop_donation' ), 8 ); add_filter( 'add_to_cart_text', array( &$this, 'add_to_cart_text' ), 10, 1 ); add_filter( 'woocommerce_add_to_cart_url', array( &$this, 'add_to_cart_url' ), 10, 1 ); // Functions for cart actions - ensure they have a priority before addons (10) add_filter( 'woocommerce_is_purchasable', array( &$this, 'is_puchasable' ), 5, 2 ); add_filter( 'woocommerce_add_cart_item_data', array( &$this, 'add_cart_item_data' ), 5, 2 ); add_filter( 'woocommerce_get_cart_item_from_session', array( &$this, 'get_cart_item_from_session' ), 5, 2 ); add_filter( 'woocommerce_add_cart_item', array( &$this, 'add_cart_item' ), 5, 1 ); add_filter( 'woocommerce_add_to_cart_validation', array( &$this, 'validate_add_cart_item' ), 5, 3 ); add_filter( 'wp_enqueue_scripts', array( &$this, 'client_side_validation' ), 5, 3 ); // Settings Link for Plugin page add_filter( 'plugin_action_links', array( &$this, 'add_action_link' ), 9, 2); // Widgets add_action( 'widgets_init', array( &$this, 'ignitewoo_donations_register_widgets' ) ); // require admin class to handle all backend functions if ( is_admin() ) { require_once( dirname( __FILE__ ) . '/admin.php' ); require_once( dirname( __FILE__ ) . '/class-donation-reports.php' ); } $this->num_decimals = ( int ) get_option( 'woocommerce_price_num_decimals' ); } function ignitewoo_donations_register_widgets() { require_once( dirname( __FILE__ ) . '/class-donations-widget.php' ); register_widget( 'IgniteWoo_Widget_Donations_Widget' ); } function setup_product(){ global $product; if ( ! $product ) return; $val = $this->is_donation( $product->id ); $product->donation = ( $val ) ? $val['donation'] : FALSE; $product->suggested = ( $val ) ? $val['suggested'] : FALSE; $product->minimum = ( $val ) ? $val['minimum'] : FALSE; } public function donation_style(){ global $product; if( ! is_product() || 'donation' !== $product ) return; wp_enqueue_style( 'name-your-donation', plugins_url( 'css/donation.css', __FILE__ ) ); } function wp_footer() { global $product; if( !is_product() || empty( $product->donation ) ) return; if ( 'yes' != get_post_meta( $product->id, '_donation', true ) ) return; ?> is_donation( $post->ID ) ) ) return; extract( $attributes ); if ( $suggested ) { add_filter( 'woocommerce_get_price_html', array( &$this, 'filter_suggested_donation'), 10 ); } else { remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 ); } if ( $minimum ) { add_action( 'woocommerce_single_product_summary', array( &$this, 'display_minimum_donation'), 15 ); } add_action( 'woocommerce_before_add_to_cart_button', array( &$this, 'display_donation_input' ) ); } function filter_suggested_donation( $donation ){ if( is_product() ) { global $product; $donation = sprintf( _x( '%s: %s', 'In case you need to change the order of Suggested Donation: $suggested', 'woocommerce', 'woocommerce' ), get_option( 'woocommerce_donation_suggested_text', __('Suggested Price', 'woocommerce' ) ), woocommerce_price( $product->suggested ) ); } return $donation; } function display_minimum_donation(){ woocommerce_get_template( 'single-product/minimum-donation.php', FALSE, FALSE, $this->plugin_path . '/templates/'); } function display_donation_input(){ woocommerce_get_template( 'single-product/donation-input.php', FALSE, FALSE, $this->plugin_path . '/templates/'); } public function donation_input_helper( $donation ) { global $woocommerce; $currency_pos = get_option( 'woocommerce_currency_pos' ); $currency_symbol = get_woocommerce_currency_symbol(); if ( '' != $donation ) { $donation = apply_filters( 'raw_woocommerce_price', ( double ) $donation ); $donation = number_format( $donation, $this->num_decimals, stripslashes( get_option( 'woocommerce_price_decimal_sep' ) ), stripslashes( get_option( 'woocommerce_price_thousand_sep' ) ) ); if ( 'yes' == get_option( 'woocommerce_price_trim_zeros' ) && $this->num_decimals > 0 ) $donation = woocommerce_trim_zeros( $donation); } $input = sprintf( '', $donation); if ( 'yes' == get_option( 'woocommerce_price_include_tax' ) && 'yes' == get_option( 'woocommerce_calc_taxes' ) ) $input .= ' '.$woocommerce->countries->ex_tax_or_vat().''; return $input; } public function remove_loop_donation(){ global $product; if ( ! empty( $product->donation ) ) remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10); } function woocommerce_cart_item_quantity( $product_quantity = '', $cart_item_key = '' ) { global $woocommerce; if ( isset( $woocommerce->cart->cart_contents[$cart_item_key]['product_id'] ) ) { $post_id = $woocommerce->cart->cart_contents[$cart_item_key]['product_id']; if ( 'yes' == get_post_meta( $post_id, '_donation', true ) ) return '1 '; } return $product_quantity; } public function add_to_cart_text( $text ) { global $product; if ( is_archive() && ! empty( $product->donation ) ) { $product->product_type = 'donation'; $text = get_option( 'woocommerce_donation_button_text', __('Set Donation', 'woocommerce' ) ); } return $text; } public function add_to_cart_url( $url ) { global $product; if ( ! is_single( $product->id ) && $this->is_donation( $product->id ) ) { $product->product_type = 'donation'; $url = get_permalink( $product->id ); } return $url; } public function is_puchasable( $purchasable , $product ) { if( $this->is_donation( $product->id) ) { $purchasable = true; } return $purchasable; } public function add_cart_item_data( $cart_item_meta, $product_id ) { global $woocommerce; if( isset( $_POST['donation'] ) ) $cart_item_meta['donation'] = round( floatval( $_POST['donation'] ), $this->num_decimals ); return $cart_item_meta; } function get_cart_item_from_session( $cart_item, $values ) { if ( isset( $values['donation'] ) ) { $cart_item['donation'] = round( floatval( $values['donation'] ), $this->num_decimals ); $cart_item = $this->add_cart_item( $cart_item ); } return $cart_item; } public function add_cart_item( $cart_item ) { if ( $this->is_donation( $cart_item['data']->id) && isset( $cart_item['donation'] ) ) { $cart_item['data']->price = $cart_item['donation']; $cart_data['data']->sale_price = $cart_item['donation']; $cart_data['data']->regular_price = $cart_item['donation']; } return $cart_item; } public function validate_add_cart_item( $passed, $product_id, $qty ) { global $woocommerce; $val = $this->is_donation( $product_id ); if ( ! $val ) return $passed; if ( empty( $_POST['donation'] ) ) $_POST['donation'] = 0; if ( ! is_numeric( $_POST['donation'] ) ) { $passed = false; $woocommerce->add_error( __( 'Please enter a valid number.', 'woocommerce' ) ); } elseif ( floatval( $_POST['donation'] ) < 0 ) { $passed = false; $woocommerce->add_error( sprintf(__( 'You cannot enter a negative value.', 'woocommerce' ), woocommerce_price( $val['minimum'] ) ) ); } elseif ( ! empty( $val[ 'minimum'] ) && floatval( $_POST['donation'] ) < floatval( $val[ 'minimum'] ) ) { $passed = false; $woocommerce->add_error( sprintf(__( 'Please enter at least %s.', 'woocommerce' ), woocommerce_price( $val['minimum'] ) ) ); } return $passed; } public function client_side_validation(){ global $product; if ( !is_product() || 'donation' != $product ) return; $array = array ( 'notnumber' => __( "Please enter a valid number", "woocommerce" ), 'zerocheck' => __( "Are you sure you can't pay anything? Click OK to proceed anyway, or Cancel to go back.", "woocommerce" ) ); if ( $product->minimum ) { $array['notmin'] = sprintf( __( "Please enter at least %s", "woocommerce" ) , woocommerce_price( $product->minimum ) ); $array['min'] = $product->minimum; } wp_enqueue_script( 'donation_validation', plugins_url( 'js/donation-validation.js', __FILE__ ), array( 'jquery' ), '1.0', true ); wp_localize_script( 'donation_validation', 'donation_validation', $array ); } public function add_action_link( $links, $file ) { if ( $file == plugin_basename( __FILE__ ) ) { $settings_link = ''.__('Settings', 'woocommerce').''; array_unshift( $links, $settings_link ); } return $links; } public function is_donation( $id ) { if ( has_term( array( 'simple' ), 'product_type', $id ) && 'yes' == get_post_meta( $id , '_donation', true ) ) { $donation = round( floatval( ( isset( $_POST['donation'] ) ? $_POST['donation'] : '' ) ), $this->num_decimals ); $suggested = get_post_meta( $id , '_suggested_donation', true ) ? round( floatval( get_post_meta( $id , '_suggested_donation', true ) ), $this->num_decimals ) : FALSE; $minimum = get_post_meta( $id , '_min_donation', true ) ? round( floatval( get_post_meta( $id , '_min_donation', true ) ), $this->num_decimals ) : FALSE; return array ( 'donation' => TRUE, 'suggested' => $suggested, 'minimum' => $minimum, ) ; } else { return false; } } } global $WC_Donations; $WC_Donations = new WC_Donations(); ?>