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();
?>