2011-08-10 17:11:11 +00:00
< ? php
/**
2011-12-11 00:33:28 +00:00
* WooCommerce Functions
2011-08-10 17:11:11 +00:00
*
2011-12-11 00:33:28 +00:00
* Hooked - in functions for WooCommerce related events on the front - end .
2011-08-10 17:11:11 +00:00
*
* @ package WooCommerce
2011-09-04 00:02:44 +00:00
* @ category Actions
2011-08-10 17:11:11 +00:00
* @ author WooThemes
*/
2011-11-26 20:33:15 +00:00
/**
2011-12-09 19:55:09 +00:00
* When default permalinks are enabled , redirect shop page to post type archive url
**/
function woocommerce_shop_page_archive_redirect () {
if ( isset ( $_GET [ 'page_id' ]) && get_option ( 'permalink_structure' ) == " " && $_GET [ 'page_id' ] == get_option ( 'woocommerce_shop_page_id' ) ) :
wp_safe_redirect ( get_post_type_archive_link ( 'product' ) );
exit ;
endif ;
}
2011-11-26 20:33:15 +00:00
2011-12-09 19:55:09 +00:00
/**
* Fix active class in nav for shop page
**/
function woocommerce_nav_menu_item_classes ( $menu_items , $args ) {
2011-11-26 20:33:15 +00:00
2011-12-09 19:55:09 +00:00
if ( ! is_woocommerce ()) return $menu_items ;
$shop_page = ( int ) get_option ( 'woocommerce_shop_page_id' );
$page_for_posts = ( int ) get_option ( 'page_for_posts' );
foreach ( ( array ) $menu_items as $key => $menu_item ) :
$classes = ( array ) $menu_item -> classes ;
// Unset active class for blog page
if ( $page_for_posts == $menu_item -> object_id ) :
$menu_items [ $key ] -> current = false ;
unset ( $classes [ array_search ( 'current_page_parent' , $classes ) ] );
unset ( $classes [ array_search ( 'current-menu-item' , $classes ) ] );
// Set active state if this is the shop page link
elseif ( is_shop () && $shop_page == $menu_item -> object_id ) :
$menu_items [ $key ] -> current = true ;
$classes [] = 'current-menu-item' ;
$classes [] = 'current_page_item' ;
endif ;
$menu_items [ $key ] -> classes = array_unique ( $classes );
endforeach ;
return $menu_items ;
}
/**
* Detect frontpage shop and fix pagination on static front page
**/
function woocommerce_front_page_archive_paging_fix () {
if ( is_front_page () && is_page ( get_option ( 'woocommerce_shop_page_id' ) )) :
2011-11-26 20:33:15 +00:00
2011-12-09 19:55:09 +00:00
if ( get_query_var ( 'paged' )) :
$paged = get_query_var ( 'paged' );
else :
$paged = ( get_query_var ( 'page' )) ? get_query_var ( 'page' ) : 1 ;
endif ;
query_posts ( array ( 'page_id' => get_option ( 'woocommerce_shop_page_id' ), 'is_paged' => true , 'paged' => $paged ) );
2011-11-26 20:33:15 +00:00
2011-12-09 19:55:09 +00:00
define ( 'SHOP_IS_ON_FRONT' , true );
2011-11-26 20:33:15 +00:00
endif ;
}
2011-09-20 16:43:09 +00:00
/**
2011-12-09 19:55:09 +00:00
* Front page archive / shop template applied to main loop
2011-09-20 16:43:09 +00:00
*/
2011-12-09 19:55:09 +00:00
function woocommerce_front_page_archive ( $query ) {
global $paged , $woocommerce , $wp_the_query , $wp_query ;
if ( defined ( 'SHOP_IS_ON_FRONT' ) ) :
wp_reset_query ();
// Only apply to front_page
if ( $query === $wp_the_query ) :
if ( get_query_var ( 'paged' )) :
$paged = get_query_var ( 'paged' );
else :
$paged = ( get_query_var ( 'page' )) ? get_query_var ( 'page' ) : 1 ;
endif ;
// Filter the query
add_filter ( 'parse_query' , array ( & $woocommerce -> query , 'parse_query' ) );
// Query the products
$wp_query -> query ( array ( 'page_id' => '' , 'p' => '' , 'post_type' => 'product' , 'paged' => $paged ) );
// get products in view (for use by widgets)
$woocommerce -> query -> get_products_in_view ();
// Remove the query manipulation
remove_filter ( 'parse_query' , array ( & $woocommerce -> query , 'parse_query' ) );
remove_action ( 'loop_start' , 'woocommerce_front_page_archive' , 1 );
endif ;
endif ;
}
/**
* Fix active class in wp_list_pages for shop page
*
* Suggested by jessor - https :// github . com / woothemes / woocommerce / issues / 177
**/
function woocommerce_list_pages ( $pages ){
global $post ;
if ( is_woocommerce () || is_cart () || is_checkout () || is_page ( get_option ( 'woocommerce_thanks_page_id' ))) {
$pages = str_replace ( 'current_page_parent' , '' , $pages ); // remove current_page_parent class from any item
$shop_page = 'page-item-' . get_option ( 'woocommerce_shop_page_id' ); // find shop_page_id through woocommerce options
if ( is_shop ()) :
$pages = str_replace ( $shop_page , $shop_page . ' current_page_item' , $pages ); // add current_page_item class to shop page
else :
$pages = str_replace ( $shop_page , $shop_page . ' current_page_parent' , $pages ); // add current_page_parent class to shop page
endif ;
}
return $pages ;
}
/**
* Add logout link to my account menu
**/
function woocommerce_nav_menu_items ( $items , $args ) {
if ( get_option ( 'woocommerce_menu_logout_link' ) == 'yes' && strstr ( $items , get_permalink ( get_option ( 'woocommerce_myaccount_page_id' ))) && is_user_logged_in () ) :
$items .= '<li><a href="' . wp_logout_url () . '">' . __ ( 'Logout' , 'woothemes' ) . '</a></li>' ;
endif ;
return $items ;
}
2011-09-20 16:43:09 +00:00
2011-12-09 19:55:09 +00:00
/**
* Update catalog ordering if posted
*/
2011-09-20 16:43:09 +00:00
function woocommerce_update_catalog_ordering () {
2011-10-04 09:32:42 +00:00
if ( isset ( $_POST [ 'catalog_orderby' ]) && $_POST [ 'catalog_orderby' ] != '' ) $_SESSION [ 'orderby' ] = $_POST [ 'catalog_orderby' ];
2011-09-20 16:43:09 +00:00
}
2011-08-15 16:48:24 +00:00
/**
* Increase coupon usage count
*/
function woocommerce_increase_coupon_counts () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
2011-11-06 13:45:18 +00:00
if ( $applied_coupons = $woocommerce -> cart -> get_applied_coupons ()) foreach ( $applied_coupons as $code ) :
2011-09-06 11:11:22 +00:00
$coupon = & new woocommerce_coupon ( $code );
$coupon -> inc_usage_count ();
2011-08-15 16:48:24 +00:00
endforeach ;
}
2011-08-10 17:11:11 +00:00
/**
* Remove from cart / update
**/
function woocommerce_update_cart_action () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
2011-08-10 17:11:11 +00:00
// Remove from cart
2011-11-06 13:45:18 +00:00
if ( isset ( $_GET [ 'remove_item' ]) && $_GET [ 'remove_item' ] && $woocommerce -> verify_nonce ( 'cart' , '_GET' )) :
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
$woocommerce -> cart -> set_quantity ( $_GET [ 'remove_item' ], 0 );
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
$woocommerce -> add_message ( __ ( 'Cart updated.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
2011-11-27 01:24:57 +00:00
if ( wp_get_referer () ) :
wp_safe_redirect ( wp_get_referer () );
2011-08-10 17:11:11 +00:00
exit ;
endif ;
// Update Cart
2011-09-06 11:11:22 +00:00
elseif ( isset ( $_POST [ 'update_cart' ]) && $_POST [ 'update_cart' ] && $woocommerce -> verify_nonce ( 'cart' )) :
2011-08-10 17:11:11 +00:00
$cart_totals = $_POST [ 'cart' ];
2011-11-06 13:45:18 +00:00
if ( sizeof ( $woocommerce -> cart -> get_cart ()) > 0 ) :
foreach ( $woocommerce -> cart -> get_cart () as $cart_item_key => $values ) :
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
if ( isset ( $cart_totals [ $cart_item_key ][ 'qty' ])) $woocommerce -> cart -> set_quantity ( $cart_item_key , $cart_totals [ $cart_item_key ][ 'qty' ] );
2011-08-10 17:11:11 +00:00
endforeach ;
endif ;
2011-09-06 11:11:22 +00:00
$woocommerce -> add_message ( __ ( 'Cart updated.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
endif ;
}
/**
* Add to cart
**/
function woocommerce_add_to_cart_action ( $url = false ) {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
if ( empty ( $_GET [ 'add-to-cart' ]) || ! $woocommerce -> verify_nonce ( 'add_to_cart' , '_GET' )) return ;
2011-08-22 14:10:22 +00:00
if ( is_numeric ( $_GET [ 'add-to-cart' ])) :
//single product
$quantity = ( isset ( $_POST [ 'quantity' ])) ? ( int ) $_POST [ 'quantity' ] : 1 ;
2011-08-30 11:24:28 +00:00
// Add to the cart
2011-09-06 11:11:22 +00:00
if ( $woocommerce -> cart -> add_to_cart ( $_GET [ 'add-to-cart' ], $quantity )) :
2011-11-27 01:24:57 +00:00
woocommerce_add_to_cart_message ();
2011-08-22 14:10:22 +00:00
endif ;
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
elseif ( $_GET [ 'add-to-cart' ] == 'variation' ) :
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
// Variation add to cart
if ( empty ( $_POST [ 'variation_id' ]) || ! is_numeric ( $_POST [ 'variation_id' ])) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Please choose product options…' , 'woothemes' ) );
2011-08-22 14:10:22 +00:00
wp_safe_redirect ( get_permalink ( $_GET [ 'product' ]));
exit ;
else :
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
$product_id = ( int ) $_GET [ 'product' ];
$variation_id = ( int ) $_POST [ 'variation_id' ];
$quantity = ( isset ( $_POST [ 'quantity' ])) ? ( int ) $_POST [ 'quantity' ] : 1 ;
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
$attributes = ( array ) maybe_unserialize ( get_post_meta ( $product_id , 'product_attributes' , true ));
$variations = array ();
$all_variations_set = true ;
foreach ( $attributes as $attribute ) :
2011-09-10 20:21:44 +00:00
if ( ! $attribute [ 'is_variation' ] ) continue ;
2011-08-10 17:11:11 +00:00
2011-09-11 13:28:15 +00:00
$taxonomy = 'attribute_' . sanitize_title ( $attribute [ 'name' ]);
2011-08-22 14:10:22 +00:00
if ( ! empty ( $_POST [ $taxonomy ])) :
2011-10-22 18:38:22 +00:00
// Get value from post data
$value = esc_attr ( stripslashes ( $_POST [ $taxonomy ]));
2011-10-16 20:56:18 +00:00
// Use name so it looks nicer in the cart widget/order page etc - instead of a sanitized string
2011-10-22 18:38:22 +00:00
$variations [ esc_attr ( $attribute [ 'name' ])] = $value ;
2011-08-22 14:10:22 +00:00
else :
$all_variations_set = false ;
endif ;
endforeach ;
if ( $all_variations_set && $variation_id > 0 ) :
// Add to cart
2011-11-06 13:45:18 +00:00
if ( $woocommerce -> cart -> add_to_cart ( $product_id , $quantity , $variation_id , $variations )) :
2011-11-27 01:24:57 +00:00
woocommerce_add_to_cart_message ();
2011-08-10 17:11:11 +00:00
endif ;
2011-08-22 14:10:22 +00:00
else :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Please choose product options…' , 'woothemes' ) );
2011-08-22 14:10:22 +00:00
wp_redirect ( get_permalink ( $_GET [ 'product' ]));
exit ;
endif ;
endif ;
elseif ( $_GET [ 'add-to-cart' ] == 'group' ) :
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
// Group add to cart
if ( isset ( $_POST [ 'quantity' ]) && is_array ( $_POST [ 'quantity' ])) :
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
$total_quantity = 0 ;
foreach ( $_POST [ 'quantity' ] as $item => $quantity ) :
if ( $quantity > 0 ) :
2011-09-06 11:11:22 +00:00
if ( $woocommerce -> cart -> add_to_cart ( $item , $quantity )) :
2011-11-27 01:24:57 +00:00
woocommerce_add_to_cart_message ();
2011-08-10 17:11:11 +00:00
endif ;
2011-08-22 14:10:22 +00:00
$total_quantity = $total_quantity + $quantity ;
2011-08-10 17:11:11 +00:00
endif ;
2011-08-22 14:10:22 +00:00
endforeach ;
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
if ( $total_quantity == 0 ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Please choose a quantity…' , 'woothemes' ) );
2011-08-22 14:10:22 +00:00
endif ;
2011-08-10 17:11:11 +00:00
2011-08-22 14:10:22 +00:00
elseif ( $_GET [ 'product' ]) :
/* Link on product pages */
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Please choose a product…' , 'woothemes' ) );
2011-08-22 14:10:22 +00:00
wp_redirect ( get_permalink ( $_GET [ 'product' ] ) );
2011-08-18 23:14:35 +00:00
exit ;
2011-08-22 14:10:22 +00:00
endif ;
2011-08-10 17:11:11 +00:00
endif ;
2011-08-22 14:10:22 +00:00
$url = apply_filters ( 'add_to_cart_redirect' , $url );
// If has custom URL redirect there
if ( $url ) {
wp_safe_redirect ( $url );
exit ;
}
// Redirect to cart option
2011-09-06 11:11:22 +00:00
elseif ( get_option ( 'woocommerce_cart_redirect_after_add' ) == 'yes' && $woocommerce -> error_count () == 0 ) {
wp_safe_redirect ( $woocommerce -> cart -> get_cart_url () );
2011-08-22 14:10:22 +00:00
exit ;
}
// Otherwise redirect to where they came
2011-11-27 01:24:57 +00:00
elseif ( wp_get_referer () ) {
wp_safe_redirect ( wp_get_referer () );
2011-08-22 14:10:22 +00:00
exit ;
}
// If all else fails redirect to root
else {
wp_safe_redirect ( home_url ());
exit ;
}
2011-08-10 17:11:11 +00:00
}
2011-11-27 01:24:57 +00:00
/**
* Add to cart messages
**/
function woocommerce_add_to_cart_message () {
global $woocommerce ;
// Output success messages
if ( get_option ( 'woocommerce_cart_redirect_after_add' ) == 'yes' ) :
$return_to = ( wp_get_referer ()) ? wp_get_referer () : home_url ();
$woocommerce -> add_message ( sprintf ( __ ( '<a href="%s" class="button">Continue Shopping →</a> Product successfully added to your cart.' , 'woothemes' ), $return_to ));
else :
$woocommerce -> add_message ( sprintf ( __ ( '<a href="%s" class="button">View Cart →</a> Product successfully added to your cart.' , 'woothemes' ), $woocommerce -> cart -> get_cart_url ()) );
endif ;
}
2011-08-10 17:11:11 +00:00
/**
2011-12-09 19:55:09 +00:00
* Clear cart after payment
2011-08-10 17:11:11 +00:00
**/
2011-12-09 19:55:09 +00:00
function woocommerce_clear_cart_after_payment () {
2011-09-09 10:54:46 +00:00
global $woocommerce ;
2011-08-10 17:11:11 +00:00
if ( is_page ( get_option ( 'woocommerce_thanks_page_id' ))) :
if ( isset ( $_GET [ 'order' ])) $order_id = $_GET [ 'order' ]; else $order_id = 0 ;
if ( isset ( $_GET [ 'key' ])) $order_key = $_GET [ 'key' ]; else $order_key = '' ;
if ( $order_id > 0 ) :
$order = & new woocommerce_order ( $order_id );
if ( $order -> order_key == $order_key ) :
2011-09-23 12:21:37 +00:00
2011-09-06 11:11:22 +00:00
$woocommerce -> cart -> empty_cart ();
2011-09-23 12:21:37 +00:00
unset ( $_SESSION [ 'order_awaiting_payment' ]);
2011-08-10 17:11:11 +00:00
endif ;
endif ;
endif ;
if ( isset ( $_SESSION [ 'order_awaiting_payment' ]) && $_SESSION [ 'order_awaiting_payment' ] > 0 ) :
$order = & new woocommerce_order ( $_SESSION [ 'order_awaiting_payment' ]);
2011-09-23 12:21:37 +00:00
if ( $order -> id > 0 && $order -> status !== 'pending' ) :
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
$woocommerce -> cart -> empty_cart ();
2011-08-10 17:11:11 +00:00
unset ( $_SESSION [ 'order_awaiting_payment' ]);
endif ;
endif ;
}
/**
* Process the login form
**/
function woocommerce_process_login () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
2011-08-10 17:11:11 +00:00
if ( isset ( $_POST [ 'login' ]) && $_POST [ 'login' ]) :
2011-09-06 11:11:22 +00:00
$woocommerce -> verify_nonce ( 'login' );
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
if ( ! isset ( $_POST [ 'username' ]) || empty ( $_POST [ 'username' ]) ) $woocommerce -> add_error ( __ ( 'Username is required.' , 'woothemes' ) );
if ( ! isset ( $_POST [ 'password' ]) || empty ( $_POST [ 'password' ]) ) $woocommerce -> add_error ( __ ( 'Password is required.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
2011-09-06 11:11:22 +00:00
if ( $woocommerce -> error_count () == 0 ) :
2011-08-10 17:11:11 +00:00
$creds = array ();
$creds [ 'user_login' ] = $_POST [ 'username' ];
$creds [ 'user_password' ] = $_POST [ 'password' ];
$creds [ 'remember' ] = true ;
$secure_cookie = is_ssl () ? true : false ;
$user = wp_signon ( $creds , $secure_cookie );
if ( is_wp_error ( $user ) ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( $user -> get_error_message () );
2011-08-10 17:11:11 +00:00
else :
2011-11-27 01:24:57 +00:00
if ( wp_get_referer () ) :
wp_safe_redirect ( wp_get_referer () );
2011-08-10 17:11:11 +00:00
exit ;
2011-10-24 11:54:06 +00:00
endif ;
2011-08-10 17:11:11 +00:00
wp_redirect ( get_permalink ( get_option ( 'woocommerce_myaccount_page_id' )));
exit ;
endif ;
endif ;
endif ;
}
2011-11-14 16:46:11 +00:00
/**
* Process the registration form
**/
function woocommerce_process_registration () {
global $woocommerce ;
if ( isset ( $_POST [ 'register' ]) && $_POST [ 'register' ]) :
$woocommerce -> verify_nonce ( 'register' );
// Get fields
$sanitized_user_login = ( isset ( $_POST [ 'username' ])) ? sanitize_user ( trim ( $_POST [ 'username' ])) : '' ;
$user_email = ( isset ( $_POST [ 'email' ])) ? esc_attr ( trim ( $_POST [ 'email' ])) : '' ;
$password = ( isset ( $_POST [ 'password' ])) ? esc_attr ( trim ( $_POST [ 'password' ])) : '' ;
$password2 = ( isset ( $_POST [ 'password2' ])) ? esc_attr ( trim ( $_POST [ 'password2' ])) : '' ;
$user_email = apply_filters ( 'user_registration_email' , $user_email );
// Check the username
if ( $sanitized_user_login == '' ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: Please enter a username.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
} elseif ( ! validate_username ( $_POST [ 'username' ] ) ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: This username is invalid because it uses illegal characters. Please enter a valid username.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
$sanitized_user_login = '' ;
} elseif ( username_exists ( $sanitized_user_login ) ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: This username is already registered, please choose another one.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
}
// Check the e-mail address
if ( $user_email == '' ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: Please type your e-mail address.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
} elseif ( ! is_email ( $user_email ) ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: The email address isn’t correct.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
$user_email = '' ;
} elseif ( email_exists ( $user_email ) ) {
2011-12-06 17:04:50 +00:00
$woocommerce -> add_error ( __ ( '<strong>ERROR</strong>: This email is already registered, please choose another one.' , 'woothemes' ) );
2011-11-14 16:46:11 +00:00
}
// Password
if ( ! $password ) $woocommerce -> add_error ( __ ( 'Password is required.' , 'woothemes' ) );
if ( ! $password2 ) $woocommerce -> add_error ( __ ( 'Re-enter your password.' , 'woothemes' ) );
if ( $password != $password2 ) $woocommerce -> add_error ( __ ( 'Passwords do not match.' , 'woothemes' ) );
// Spam trap
if ( isset ( $_POST [ 'email_2' ]) && $_POST [ 'email_2' ]) $woocommerce -> add_error ( __ ( 'Anti-spam field was filled in.' , 'woothemes' ) );
if ( $woocommerce -> error_count () == 0 ) :
$reg_errors = new WP_Error ();
do_action ( 'register_post' , $sanitized_user_login , $user_email , $reg_errors );
$reg_errors = apply_filters ( 'registration_errors' , $reg_errors , $sanitized_user_login , $user_email );
// if there are no errors, let's create the user account
if ( ! $reg_errors -> get_error_code () ) :
$user_id = wp_create_user ( $sanitized_user_login , $password , $user_email );
if ( ! $user_id ) {
$woocommerce -> add_error ( sprintf ( __ ( '<strong>ERROR</strong>: Couldn’t register you... please contact the <a href="mailto:%s">webmaster</a> !' , 'woothemes' ), get_option ( 'admin_email' )));
return ;
}
// Change role
wp_update_user ( array ( 'ID' => $user_id , 'role' => 'customer' ) ) ;
2011-12-10 17:28:32 +00:00
// send the user a confirmation and their login details
$mailer = $woocommerce -> mailer ();
$mailer -> customer_new_account ( $user_id , $password );
2011-11-14 16:46:11 +00:00
// set the WP login cookie
$secure_cookie = is_ssl () ? true : false ;
wp_set_auth_cookie ( $user_id , true , $secure_cookie );
// Redirect
2011-11-27 01:24:57 +00:00
if ( wp_get_referer () ) :
wp_safe_redirect ( wp_get_referer () );
2011-11-14 16:46:11 +00:00
exit ;
endif ;
wp_redirect ( get_permalink ( get_option ( 'woocommerce_myaccount_page_id' )));
exit ;
else :
$woocommerce -> add_error ( $reg_errors -> get_error_message () );
return ;
endif ;
endif ;
endif ;
}
2011-08-10 17:11:11 +00:00
/**
2011-12-09 19:55:09 +00:00
* Cancel a pending order
2011-08-10 17:11:11 +00:00
**/
function woocommerce_cancel_order () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
2011-08-10 17:11:11 +00:00
if ( isset ( $_GET [ 'cancel_order' ]) && isset ( $_GET [ 'order' ]) && isset ( $_GET [ 'order_id' ]) ) :
$order_key = urldecode ( $_GET [ 'order' ] );
$order_id = ( int ) $_GET [ 'order_id' ];
$order = & new woocommerce_order ( $order_id );
2011-09-22 19:50:58 +00:00
if ( $order -> id == $order_id && $order -> order_key == $order_key && in_array ( $order -> status , array ( 'pending' , 'failed' )) && $woocommerce -> verify_nonce ( 'cancel_order' , '_GET' )) :
2011-08-10 17:11:11 +00:00
// Cancel the order + restore stock
$order -> cancel_order ( __ ( 'Order cancelled by customer.' , 'woothemes' ) );
// Message
2011-09-06 11:11:22 +00:00
$woocommerce -> add_message ( __ ( 'Your order was cancelled.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
elseif ( $order -> status != 'pending' ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Your order is no longer pending and could not be cancelled. Please contact us if you need assistance.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
else :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'Invalid order.' , 'woothemes' ) );
2011-08-10 17:11:11 +00:00
endif ;
2011-09-06 11:11:22 +00:00
wp_safe_redirect ( $woocommerce -> cart -> get_cart_url ());
2011-08-10 17:11:11 +00:00
exit ;
endif ;
}
/**
* Download a file - hook into init function
**/
function woocommerce_download_product () {
if ( isset ( $_GET [ 'download_file' ]) && isset ( $_GET [ 'order' ]) && isset ( $_GET [ 'email' ]) ) :
2011-08-16 14:06:08 +00:00
2011-08-10 17:11:11 +00:00
global $wpdb ;
$download_file = ( int ) urldecode ( $_GET [ 'download_file' ]);
2011-11-16 12:15:41 +00:00
$order_key = urldecode ( $_GET [ 'order' ] );
2011-08-10 17:11:11 +00:00
$email = urldecode ( $_GET [ 'email' ] );
2011-11-16 12:15:41 +00:00
if ( ! is_email ( $email )) :
wp_die ( sprintf ( __ ( 'Invalid email address. <a href="%s">Go to homepage →</a>' , 'woothemes' ), home_url ()) );
endif ;
2011-08-10 17:11:11 +00:00
2011-11-16 12:15:41 +00:00
$download_result = $wpdb -> get_row ( $wpdb -> prepare ( "
SELECT order_id , downloads_remaining
2011-08-10 17:11:11 +00:00
FROM " . $wpdb->prefix . " woocommerce_downloadable_product_permissions
2011-10-05 16:22:38 +00:00
WHERE user_email = % s
AND order_key = % s
AND product_id = % s
2011-11-16 12:15:41 +00:00
; " , $email , $order_key , $download_file ) );
if ( ! $download_result ) :
wp_die ( sprintf ( __ ( 'Invalid download. <a href="%s">Go to homepage →</a>' , 'woothemes' ), home_url ()) );
exit ;
endif ;
$order_id = $download_result -> order_id ;
$downloads_remaining = $download_result -> downloads_remaining ;
if ( $order_id ) :
$order = & new woocommerce_order ( $order_id );
2011-12-12 17:39:31 +00:00
if ( $order -> status != 'completed' && $order -> status != 'processing' && $order -> status != 'publish' ) :
2011-11-16 12:15:41 +00:00
wp_die ( sprintf ( __ ( 'Invalid order. <a href="%s">Go to homepage →</a>' , 'woothemes' ), home_url ()) );
exit ;
endif ;
endif ;
2011-08-10 17:11:11 +00:00
if ( $downloads_remaining == '0' ) :
wp_die ( sprintf ( __ ( 'Sorry, you have reached your download limit for this file. <a href="%s">Go to homepage →</a>' , 'woothemes' ), home_url ()) );
else :
if ( $downloads_remaining > 0 ) :
$wpdb -> update ( $wpdb -> prefix . " woocommerce_downloadable_product_permissions " , array (
'downloads_remaining' => $downloads_remaining - 1 ,
), array (
'user_email' => $email ,
2011-11-16 12:15:41 +00:00
'order_key' => $order_key ,
2011-08-10 17:11:11 +00:00
'product_id' => $download_file
), array ( '%d' ), array ( '%s' , '%s' , '%d' ) );
endif ;
2011-08-16 14:06:08 +00:00
// Get the downloads URL and try to replace the url with a path
$file_path = get_post_meta ( $download_file , 'file_path' , true );
2011-11-09 23:06:17 +00:00
if ( ! $file_path ) exit ;
2011-12-07 21:26:53 +00:00
$file_download_method = apply_filters ( 'woocommerce_file_download_method' , get_option ( 'woocommerce_file_download_method' ), $download_file );
if ( $file_download_method == 'redirect' ) :
header ( 'Location: ' . $file_path );
exit ;
endif ;
2011-12-15 11:21:06 +00:00
// Get URLS with https
$site_url = site_url ();
$network_url = network_admin_url ();
if ( is_ssl ()) :
$site_url = str_replace ( 'https:' , 'http:' , $site_url );
$network_url = str_replace ( 'https:' , 'http:' , $network_url );
endif ;
2011-12-07 19:25:35 +00:00
if ( ! is_multisite ()) :
2011-12-15 11:21:06 +00:00
$file_path = str_replace ( trailingslashit ( $site_url ), ABSPATH , $file_path );
2011-12-03 17:00:05 +00:00
else :
2011-12-07 19:25:35 +00:00
$upload_dir = wp_upload_dir ();
// Try to replace network url
2011-12-15 11:21:06 +00:00
$file_path = str_replace ( trailingslashit ( $network_url ), ABSPATH , $file_path );
2011-12-07 19:25:35 +00:00
// Now try to replace upload URL
$file_path = str_replace ( $upload_dir [ 'baseurl' ], $upload_dir [ 'basedir' ], $file_path );
2011-12-03 17:00:05 +00:00
endif ;
2011-08-16 14:06:08 +00:00
// See if its local or remote
if ( strstr ( $file_path , 'http:' ) || strstr ( $file_path , 'https:' ) || strstr ( $file_path , 'ftp:' )) :
$remote_file = true ;
else :
$remote_file = false ;
$file_path = realpath ( $file_path );
endif ;
// Download the file
$file_extension = strtolower ( substr ( strrchr ( $file_path , " . " ), 1 ));
2011-08-10 17:11:11 +00:00
switch ( $file_extension ) :
case " pdf " : $ctype = " application/pdf " ; break ;
case " exe " : $ctype = " application/octet-stream " ; break ;
case " zip " : $ctype = " application/zip " ; break ;
case " doc " : $ctype = " application/msword " ; break ;
case " xls " : $ctype = " application/vnd.ms-excel " ; break ;
case " ppt " : $ctype = " application/vnd.ms-powerpoint " ; break ;
case " gif " : $ctype = " image/gif " ; break ;
case " png " : $ctype = " image/png " ; break ;
case " jpe " : case " jpeg " : case " jpg " : $ctype = " image/jpg " ; break ;
default : $ctype = " application/force-download " ;
endswitch ;
2011-11-07 21:52:04 +00:00
2011-12-07 21:26:53 +00:00
if ( $file_download_method == 'xsendfile' ) :
2011-11-07 21:52:04 +00:00
header ( " X-Accel-Redirect: $file_path " );
header ( " X-Sendfile: $file_path " );
header ( " Content-Type: $ctype " );
header ( " Content-Disposition: attachment; filename= \" " . basename ( $file_path ) . " \" ; " );
exit ;
2011-08-10 17:11:11 +00:00
2011-11-07 21:52:04 +00:00
endif ;
2011-12-09 19:55:09 +00:00
/**
* readfile_chunked
*
* Reads file in chunks so big downloads are possible without changing PHP . INI - http :// codeigniter . com / wiki / Download_helper_for_large_files /
*
* @ access public
* @ param string file
* @ param boolean return bytes of file
* @ return void
*/
if ( ! function_exists ( 'readfile_chunked' )) {
function readfile_chunked ( $file , $retbytes = TRUE ) {
$chunksize = 1 * ( 1024 * 1024 );
$buffer = '' ;
$cnt = 0 ;
$handle = fopen ( $file , 'r' );
if ( $handle === FALSE ) return FALSE ;
while ( ! feof ( $handle )) :
$buffer = fread ( $handle , $chunksize );
echo $buffer ;
ob_flush ();
flush ();
if ( $retbytes ) $cnt += strlen ( $buffer );
endwhile ;
$status = fclose ( $handle );
if ( $retbytes AND $status ) return $cnt ;
return $status ;
}
}
2011-09-11 15:24:13 +00:00
@ session_write_close ();
if ( function_exists ( 'apache_setenv' )) @ apache_setenv ( 'no-gzip' , 1 );
2011-08-16 14:06:08 +00:00
@ ini_set ( 'zlib.output_compression' , 'Off' );
2011-08-10 17:11:11 +00:00
@ set_time_limit ( 0 );
@ set_magic_quotes_runtime ( 0 );
@ ob_end_clean ();
2011-10-06 10:46:19 +00:00
if ( ob_get_level ()) @ ob_end_clean (); // Zip corruption fix
2011-08-10 17:11:11 +00:00
header ( " Pragma: no-cache " );
header ( " Expires: 0 " );
header ( " Cache-Control: must-revalidate, post-check=0, pre-check=0 " );
header ( " Robots: none " );
header ( " Content-Type: " . $ctype . " " );
header ( " Content-Description: File Transfer " );
2011-11-07 21:52:04 +00:00
header ( " Content-Disposition: attachment; filename= \" " . basename ( $file_path ) . " \" ; " );
2011-08-10 17:11:11 +00:00
header ( " Content-Transfer-Encoding: binary " );
2011-08-16 14:06:08 +00:00
if ( $size = @ filesize ( $file_path )) header ( " Content-Length: " . $size );
2011-10-06 10:46:19 +00:00
2011-08-16 14:06:08 +00:00
// Serve it
if ( $remote_file ) :
2011-09-13 09:07:42 +00:00
@ readfile_chunked ( " $file_path " ) or header ( 'Location: ' . $file_path );
2011-08-16 14:06:08 +00:00
else :
2011-09-13 09:07:42 +00:00
@ readfile_chunked ( " $file_path " ) or wp_die ( sprintf ( __ ( 'File not found. <a href="%s">Go to homepage →</a>' , 'woothemes' ), home_url ()) );
2011-08-16 14:06:08 +00:00
endif ;
exit ;
2011-08-10 17:11:11 +00:00
endif ;
endif ;
}
2011-09-19 10:02:36 +00:00
/**
* Google Analytics standard tracking
**/
function woocommerce_google_tracking () {
global $woocommerce ;
if ( ! get_option ( 'woocommerce_ga_standard_tracking_enabled' )) return ;
2011-11-15 15:55:33 +00:00
if ( is_admin ()) return ; // Don't track admin
2011-09-19 10:02:36 +00:00
$tracking_id = get_option ( 'woocommerce_ga_id' );
if ( ! $tracking_id ) return ;
$loggedin = ( is_user_logged_in ()) ? 'yes' : 'no' ;
if ( is_user_logged_in ()) :
$user_id = get_current_user_id ();
$current_user = get_user_by ( 'id' , $user_id );
$username = $current_user -> user_login ;
else :
$user_id = '' ;
$username = __ ( 'Guest' , 'woothemes' );
endif ;
?>
< script type = " text/javascript " >
var _gaq = _gaq || [];
_gaq . push (
[ '_setAccount' , '<?php echo $tracking_id; ?>' ],
[ '_setCustomVar' , 1 , 'logged-in' , '<?php echo $loggedin; ?>' , 1 ],
[ '_setCustomVar' , 2 , 'user-id' , '<?php echo $user_id; ?>' , 1 ],
[ '_setCustomVar' , 3 , 'username' , '<?php echo $username; ?>' , 1 ],
[ '_trackPageview' ]
);
( function () {
var ga = document . createElement ( 'script' ); ga . type = 'text/javascript' ; ga . async = true ;
ga . src = ( 'https:' == document . location . protocol ? 'https://ssl' : 'http://www' ) + '.google-analytics.com/ga.js' ;
var s = document . getElementsByTagName ( 'script' )[ 0 ]; s . parentNode . insertBefore ( ga , s );
})();
</ script >
< ? php
}
/**
* Google Analytics eCommerce tracking
**/
function woocommerce_ecommerce_tracking ( $order_id ) {
global $woocommerce ;
if ( ! get_option ( 'woocommerce_ga_ecommerce_tracking_enabled' )) return ;
2011-11-15 15:55:33 +00:00
if ( is_admin ()) return ; // Don't track admin
2011-09-19 10:02:36 +00:00
$tracking_id = get_option ( 'woocommerce_ga_id' );
if ( ! $tracking_id ) return ;
// Doing eCommerce tracking so unhook standard tracking from the footer
remove_action ( 'wp_footer' , 'woocommerce_google_tracking' );
// Get the order and output tracking code
$order = & new woocommerce_order ( $order_id );
$loggedin = ( is_user_logged_in ()) ? 'yes' : 'no' ;
if ( is_user_logged_in ()) :
$user_id = get_current_user_id ();
$current_user = get_user_by ( 'id' , $user_id );
$username = $current_user -> user_login ;
else :
$user_id = '' ;
$username = __ ( 'Guest' , 'woothemes' );
endif ;
?>
< script type = " text/javascript " >
var _gaq = _gaq || [];
_gaq . push (
[ '_setAccount' , '<?php echo $tracking_id; ?>' ],
[ '_setCustomVar' , 1 , 'logged-in' , '<?php echo $loggedin; ?>' , 1 ],
[ '_setCustomVar' , 2 , 'user-id' , '<?php echo $user_id; ?>' , 1 ],
[ '_setCustomVar' , 3 , 'username' , '<?php echo $username; ?>' , 1 ],
[ '_trackPageview' ]
);
_gaq . push ([ '_addTrans' ,
'<?php echo $order_id; ?>' , // order ID - required
'<?php bloginfo(' name '); ?>' , // affiliation or store name
'<?php echo $order->order_total; ?>' , // total - required
'<?php echo $order->order_tax; ?>' , // tax
'<?php echo $order->order_shipping; ?>' , // shipping
'<?php echo $order->billing_city; ?>' , // city
'<?php echo $order->billing_state; ?>' , // state or province
'<?php echo $order->billing_country; ?>' // country
]);
// Order items
< ? php if ( $order -> items ) foreach ( $order -> items as $item ) : $_product = $order -> get_product_from_item ( $item ); ?>
_gaq . push ([ '_addItem' ,
'<?php echo $order_id; ?>' , // order ID - required
'<?php echo $_product->sku; ?>' , // SKU/code - required
'<?php echo $item[' name ']; ?>' , // product name
2011-11-06 15:45:22 +00:00
'<?php if (isset($_product->variation_data)) echo woocommerce_get_formatted_variation( $_product->variation_data, true ); ?>' , // category or variation
2011-09-19 10:02:36 +00:00
'<?php echo $item[' cost ']; ?>' , // unit price - required
'<?php echo $item[' qty ']; ?>' // quantity - required
]);
< ? php endforeach ; ?>
_gaq . push ([ '_trackTrans' ]); // submits transaction to the Analytics servers
( function () {
var ga = document . createElement ( 'script' ); ga . type = 'text/javascript' ; ga . async = true ;
ga . src = ( 'https:' == document . location . protocol ? 'https://ssl' : 'http://www' ) + '.google-analytics.com/ga.js' ;
var s = document . getElementsByTagName ( 'script' )[ 0 ]; s . parentNode . insertBefore ( ga , s );
})();
</ script >
< ? php
2011-09-30 21:11:42 +00:00
}
2011-10-31 01:03:51 +00:00
2011-12-11 13:59:36 +00:00
/**
* ecommerce tracking with piwik
*/
function woocommerce_ecommerce_tracking_piwik ( $order_id ) {
global $woocommerce ;
2011-12-19 00:13:41 +00:00
if ( is_admin ()) return ; // Don't track admin
// Call the Piwik ecommerce function if WP-Piwik is configured to add tracking codes to the page
$wp_piwik_global_settings = get_option ( 'wp-piwik_global-settings' );
if ( ! isset ( $wp_piwik_global_settings [ 'add_tracking_code' ]) || ! $wp_piwik_global_settings [ 'add_tracking_code' ]) return ;
2011-12-11 13:59:36 +00:00
// Remove WP-Piwik from wp_footer and run it here instead, to get Piwik
// loaded *before* we do our ecommerce tracking calls
remove_action ( 'wp_footer' , array ( $GLOBALS [ 'wp_piwik' ], 'footer' ));
$GLOBALS [ 'wp_piwik' ] -> footer ();
// Get the order and output tracking code
$order = & new woocommerce_order ( $order_id );
?>
< script type = " text/javascript " >
try {
// Add order items
< ? php if ( $order -> items ) foreach ( $order -> items as $item ) : $_product = $order -> get_product_from_item ( $item ); ?>
piwikTracker . addEcommerceItem (
" <?php echo $_product->sku ; ?> " , // (required) SKU: Product unique identifier
" <?php echo $item['name'] ; ?> " , // (optional) Product name
" <?php if (isset( $_product->variation_data )) echo woocommerce_get_formatted_variation( $_product->variation_data , true ); ?> " , // (optional) Product category. You can also specify an array of up to 5 categories eg. ["Books", "New releases", "Biography"]
< ? php echo $item [ 'cost' ]; ?> , // (recommended) Product price
< ? php echo $item [ 'qty' ]; ?> // (optional, default to 1) Product quantity
);
< ? php endforeach ; ?>
// Track order
piwikTracker . trackEcommerceOrder (
" <?php echo $order_id ; ?> " , // (required) Unique Order ID
< ? php echo $order -> order_total ; ?> , // (required) Order Revenue grand total (includes tax, shipping, and subtracted discount)
false , // (optional) Order sub total (excludes shipping)
< ? php echo $order -> order_tax ; ?> , // (optional) Tax amount
< ? php echo $order -> order_shipping ; ?> , // (optional) Shipping amount
false // (optional) Discount offered (set to false for unspecified parameter)
);
} catch ( err ) {}
</ script >
< ? php
}
2011-10-31 01:03:51 +00:00
/* Products RSS Feed */
function woocommerce_products_rss_feed () {
// Product RSS
if ( is_post_type_archive ( 'product' ) || is_singular ( 'product' ) ) :
$feed = get_post_type_archive_feed_link ( 'product' );
echo '<link rel="alternate" type="application/rss+xml" title="' . __ ( 'New products' , 'woothemes' ) . '" href="' . $feed . '" />' ;
elseif ( is_tax ( 'product_cat' ) ) :
$term = get_term_by ( 'slug' , get_query_var ( 'product_cat' ), 'product_cat' );
$feed = add_query_arg ( 'product_cat' , $term -> slug , get_post_type_archive_feed_link ( 'product' ));
echo '<link rel="alternate" type="application/rss+xml" title="' . sprintf ( __ ( 'New products added to %s' , 'woothemes' ), urlencode ( $term -> name )) . '" href="' . $feed . '" />' ;
elseif ( is_tax ( 'product_tag' ) ) :
$term = get_term_by ( 'slug' , get_query_var ( 'product_tag' ), 'product_tag' );
$feed = add_query_arg ( 'product_tag' , $term -> slug , get_post_type_archive_feed_link ( 'product' ));
echo '<link rel="alternate" type="application/rss+xml" title="' . sprintf ( __ ( 'New products tagged %s' , 'woothemes' ), urlencode ( $term -> name )) . '" href="' . $feed . '" />' ;
endif ;
2011-12-09 19:55:09 +00:00
}
/**
* Rating field for comments
**/
function woocommerce_add_comment_rating ( $comment_id ) {
if ( isset ( $_POST [ 'rating' ]) ) :
global $post ;
if ( ! $_POST [ 'rating' ] || $_POST [ 'rating' ] > 5 || $_POST [ 'rating' ] < 0 ) $_POST [ 'rating' ] = 5 ;
add_comment_meta ( $comment_id , 'rating' , esc_attr ( $_POST [ 'rating' ]), true );
delete_transient ( esc_attr ( $post -> ID ) . '_woocommerce_average_rating' );
endif ;
}
function woocommerce_check_comment_rating ( $comment_data ) {
global $woocommerce ;
// If posting a comment (not trackback etc) and not logged in
if ( isset ( $_POST [ 'rating' ]) && ! $woocommerce -> verify_nonce ( 'comment_rating' ) )
wp_die ( __ ( 'You have taken too long. Please go back and refresh the page.' , 'woothemes' ) );
elseif ( isset ( $_POST [ 'rating' ]) && empty ( $_POST [ 'rating' ]) && $comment_data [ 'comment_type' ] == '' ) {
wp_die ( __ ( 'Please rate the product.' , " woothemes " ) );
exit ;
}
return $comment_data ;
2011-12-11 13:59:36 +00:00
}