2011-08-10 17:11:11 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* WooCommerce Template
2011-11-24 00:24:24 +00:00
*
2013-08-09 16:11:15 +00:00
* Functions for the templating system .
2011-08-10 17:11:11 +00:00
*
2015-07-20 17:36:12 +00:00
* @ author WooThemes
* @ category Core
* @ package WooCommerce / Functions
2015-10-02 01:45:11 +00:00
* @ version 2.5 . 0
2011-08-10 17:11:11 +00:00
*/
2014-09-20 19:10:45 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2012-10-15 10:57:58 +00:00
2013-08-09 16:11:15 +00:00
/**
* Handle redirects before content is output - hooked into template_redirect so is_page works .
*/
2013-11-25 13:30:20 +00:00
function wc_template_redirect () {
2013-09-12 13:41:02 +00:00
global $wp_query , $wp ;
2013-08-09 16:11:15 +00:00
// When default permalinks are enabled, redirect shop page to post type archive url
2015-12-01 04:02:00 +00:00
if ( ! empty ( $_GET [ 'page_id' ] ) && '' === get_option ( 'permalink_structure' ) && $_GET [ 'page_id' ] == wc_get_page_id ( 'shop' ) ) {
2013-08-09 16:11:15 +00:00
wp_safe_redirect ( get_post_type_archive_link ( 'product' ) );
exit ;
}
// When on the checkout with an empty cart, redirect to cart page
2015-05-14 21:18:53 +00:00
elseif ( is_page ( wc_get_page_id ( 'checkout' ) ) && WC () -> cart -> is_empty () && empty ( $wp -> query_vars [ 'order-pay' ] ) && ! isset ( $wp -> query_vars [ 'order-received' ] ) ) {
2016-03-07 10:31:01 +00:00
wc_add_notice ( __ ( 'Checkout is not available whilst your cart is empty.' , 'woocommerce' ) );
2015-02-15 19:13:22 +00:00
wp_redirect ( wc_get_page_permalink ( 'cart' ) );
2013-08-09 16:11:15 +00:00
exit ;
}
// Logout
2013-08-23 15:41:02 +00:00
elseif ( isset ( $wp -> query_vars [ 'customer-logout' ] ) ) {
2015-02-15 19:13:22 +00:00
wp_redirect ( str_replace ( '&' , '&' , wp_logout_url ( wc_get_page_permalink ( 'myaccount' ) ) ) );
2013-08-09 16:11:15 +00:00
exit ;
}
// Redirect to the product page if we have a single product
2015-12-01 04:02:00 +00:00
elseif ( is_search () && is_post_type_archive ( 'product' ) && apply_filters ( 'woocommerce_redirect_single_search_result' , true ) && 1 === $wp_query -> found_posts ) {
2014-08-19 10:09:29 +00:00
$product = wc_get_product ( $wp_query -> post );
2013-08-09 16:11:15 +00:00
2015-01-19 10:43:43 +00:00
if ( $product && $product -> is_visible () ) {
2013-08-09 16:11:15 +00:00
wp_safe_redirect ( get_permalink ( $product -> id ), 302 );
exit ;
}
}
2013-11-05 21:02:13 +00:00
// Ensure payment gateways are loaded early
elseif ( is_add_payment_method_page () ) {
WC () -> payment_gateways ();
}
2013-09-12 13:41:02 +00:00
// Checkout pages handling
2013-08-09 16:11:15 +00:00
elseif ( is_checkout () ) {
2013-09-12 13:41:02 +00:00
// Buffer the checkout page
2013-08-09 16:11:15 +00:00
ob_start ();
2013-09-12 13:41:02 +00:00
// Ensure gateways and shipping methods are loaded early
WC () -> payment_gateways ();
WC () -> shipping ();
2013-08-09 16:11:15 +00:00
}
}
2014-03-03 13:37:45 +00:00
add_action ( 'template_redirect' , 'wc_template_redirect' );
2013-08-09 16:11:15 +00:00
2015-05-24 23:35:45 +00:00
/**
* When loading sensitive checkout or account pages , send a HTTP header to limit rendering of pages to same origin iframes for security reasons .
*
* Can be disabled with : remove_action ( 'template_redirect' , 'wc_send_frame_options_header' );
*
* @ since 2.3 . 10
*/
function wc_send_frame_options_header () {
if ( is_checkout () || is_account_page () ) {
send_frame_options_header ();
}
}
add_action ( 'template_redirect' , 'wc_send_frame_options_header' );
2016-03-01 16:45:25 +00:00
/**
* No index our endpoints .
* Prevent indexing pages like order - received .
*
* @ since 2.5 . 3
*/
function wc_prevent_endpoint_indexing () {
if ( is_wc_endpoint_url () || isset ( $_GET [ 'download_file' ] ) ) {
@ header ( 'X-Robots-Tag: noindex' );
}
}
add_action ( 'template_redirect' , 'wc_prevent_endpoint_indexing' );
2013-09-12 13:41:02 +00:00
/**
* When the_post is called , put product data into a global .
*
* @ param mixed $post
* @ return WC_Product
*/
function wc_setup_product_data ( $post ) {
unset ( $GLOBALS [ 'product' ] );
if ( is_int ( $post ) )
$post = get_post ( $post );
2013-11-27 16:03:54 +00:00
if ( empty ( $post -> post_type ) || ! in_array ( $post -> post_type , array ( 'product' , 'product_variation' ) ) )
2013-09-12 13:41:02 +00:00
return ;
2014-08-19 10:09:29 +00:00
$GLOBALS [ 'product' ] = wc_get_product ( $post );
2013-09-12 13:41:02 +00:00
return $GLOBALS [ 'product' ];
}
2014-03-03 13:37:45 +00:00
add_action ( 'the_post' , 'wc_setup_product_data' );
2013-09-12 13:41:02 +00:00
2014-03-13 13:07:44 +00:00
if ( ! function_exists ( 'woocommerce_reset_loop' ) ) {
/**
* Reset the loop 's index and columns when we' re done outputting a product loop .
* @ subpackage Loop
*/
function woocommerce_reset_loop () {
2016-02-12 13:30:10 +00:00
$GLOBALS [ 'woocommerce_loop' ] = array (
'loop' => '' ,
'columns' => '' ,
'name' => '' ,
);
2014-03-13 13:07:44 +00:00
}
}
add_filter ( 'loop_end' , 'woocommerce_reset_loop' );
2013-11-25 14:35:10 +00:00
/**
* Products RSS Feed .
*
* @ access public
*/
function wc_products_rss_feed () {
// Product RSS
if ( is_post_type_archive ( 'product' ) || is_singular ( 'product' ) ) {
$feed = get_post_type_archive_feed_link ( 'product' );
2015-08-05 19:17:52 +00:00
echo '<link rel="alternate" type="application/rss+xml" title="' . esc_attr__ ( 'New products' , 'woocommerce' ) . '" href="' . esc_url ( $feed ) . '" />' ;
2013-11-25 14:35:10 +00:00
} elseif ( is_tax ( 'product_cat' ) ) {
$term = get_term_by ( 'slug' , esc_attr ( get_query_var ( 'product_cat' ) ), 'product_cat' );
$feed = add_query_arg ( 'product_cat' , $term -> slug , get_post_type_archive_feed_link ( 'product' ));
2015-08-05 19:18:47 +00:00
echo '<link rel="alternate" type="application/rss+xml" title="' . esc_attr ( sprintf ( __ ( 'New products added to %s' , 'woocommerce' ), $term -> name ) ) . '" href="' . esc_url ( $feed ) . '" />' ;
2013-11-25 14:35:10 +00:00
} elseif ( is_tax ( 'product_tag' ) ) {
$term = get_term_by ( 'slug' , esc_attr ( get_query_var ( 'product_tag' ) ), 'product_tag' );
$feed = add_query_arg ( 'product_tag' , $term -> slug , get_post_type_archive_feed_link ( 'product' ));
2015-01-29 14:33:06 +00:00
echo '<link rel="alternate" type="application/rss+xml" title="' . sprintf ( __ ( 'New products tagged %s' , 'woocommerce' ), urlencode ( $term -> name )) . '" href="' . esc_url ( $feed ) . '" />' ;
2013-11-25 14:35:10 +00:00
}
}
2013-09-12 13:41:02 +00:00
/**
* Output generator tag to aid debugging .
*
* @ access public
*/
2014-03-12 11:53:59 +00:00
function wc_generator_tag ( $gen , $type ) {
switch ( $type ) {
case 'html' :
$gen .= " \n " . '<meta name="generator" content="WooCommerce ' . esc_attr ( WC_VERSION ) . '">' ;
break ;
case 'xhtml' :
$gen .= " \n " . '<meta name="generator" content="WooCommerce ' . esc_attr ( WC_VERSION ) . '" />' ;
break ;
}
return $gen ;
2013-09-12 13:41:02 +00:00
}
2013-08-09 16:11:15 +00:00
/**
2015-11-03 13:31:20 +00:00
* Add body classes for WC pages .
2013-08-09 16:11:15 +00:00
*
* @ param array $classes
* @ return array
*/
function wc_body_class ( $classes ) {
$classes = ( array ) $classes ;
if ( is_woocommerce () ) {
$classes [] = 'woocommerce' ;
$classes [] = 'woocommerce-page' ;
}
elseif ( is_checkout () ) {
$classes [] = 'woocommerce-checkout' ;
$classes [] = 'woocommerce-page' ;
}
elseif ( is_cart () ) {
$classes [] = 'woocommerce-cart' ;
$classes [] = 'woocommerce-page' ;
}
elseif ( is_account_page () ) {
$classes [] = 'woocommerce-account' ;
$classes [] = 'woocommerce-page' ;
}
2014-01-10 17:17:01 +00:00
if ( is_store_notice_showing () ) {
2013-09-05 16:13:57 +00:00
$classes [] = 'woocommerce-demo-store' ;
}
2015-03-17 16:39:44 +00:00
2015-03-16 13:26:22 +00:00
foreach ( WC () -> query -> query_vars as $key => $value ) {
if ( is_wc_endpoint_url ( $key ) ) {
2015-03-17 16:39:44 +00:00
$classes [] = 'woocommerce-' . sanitize_html_class ( $key );
2015-03-16 13:26:22 +00:00
}
}
2013-09-05 16:13:57 +00:00
2013-08-09 16:11:15 +00:00
return array_unique ( $classes );
}
2015-04-10 12:17:30 +00:00
/**
* Display the classes for the product cat div .
*
* @ since 2.4 . 0
* @ param string | array $class One or more classes to add to the class list .
* @ param object $category object Optional .
*/
function wc_product_cat_class ( $class = '' , $category = null ) {
// Separates classes with a single space, collates classes for post DIV
echo 'class="' . esc_attr ( join ( ' ' , wc_get_product_cat_class ( $class , $category ) ) ) . '"' ;
}
2016-02-12 13:30:10 +00:00
/**
* Get classname for loops based on $woocommerce_loop global .
* @ since 2.6 . 0
* @ return string
*/
function wc_get_loop_class () {
global $woocommerce_loop ;
$woocommerce_loop [ 'loop' ] = ! empty ( $woocommerce_loop [ 'loop' ] ) ? $woocommerce_loop [ 'loop' ] + 1 : 1 ;
$woocommerce_loop [ 'columns' ] = ! empty ( $woocommerce_loop [ 'columns' ] ) ? $woocommerce_loop [ 'columns' ] : apply_filters ( 'loop_shop_columns' , 4 );
if ( 0 === ( $woocommerce_loop [ 'loop' ] - 1 ) % $woocommerce_loop [ 'columns' ] || 1 === $woocommerce_loop [ 'columns' ] ) {
return 'first' ;
} elseif ( 0 === $woocommerce_loop [ 'loop' ] % $woocommerce_loop [ 'columns' ] ) {
return 'last' ;
} else {
return '' ;
}
}
2015-04-10 12:17:30 +00:00
/**
* Get the classes for the product cat div .
*
* @ since 2.4 . 0
* @ param string | array $class One or more classes to add to the class list .
* @ param object $category object Optional .
*/
function wc_get_product_cat_class ( $class = '' , $category = null ) {
$classes = is_array ( $class ) ? $class : array_map ( 'trim' , explode ( ' ' , $class ) );
$classes [] = 'product-category' ;
$classes [] = 'product' ;
2016-02-12 13:30:10 +00:00
$classes [] = wc_get_loop_class ();
$classes = apply_filters ( 'product_cat_class' , $classes , $class , $category );
2015-04-10 12:17:30 +00:00
return array_unique ( array_filter ( $classes ) );
}
2013-11-25 14:35:10 +00:00
/**
2015-11-03 13:31:20 +00:00
* Adds extra post classes for products .
2013-11-25 14:35:10 +00:00
*
* @ since 2.1 . 0
* @ param array $classes
* @ param string | array $class
* @ param int $post_id
* @ return array
*/
function wc_product_post_class ( $classes , $class = '' , $post_id = '' ) {
2014-07-28 17:05:36 +00:00
if ( ! $post_id || 'product' !== get_post_type ( $post_id ) ) {
2013-11-25 14:35:10 +00:00
return $classes ;
2014-07-28 17:05:36 +00:00
}
2013-11-25 14:35:10 +00:00
2014-08-19 10:09:29 +00:00
$product = wc_get_product ( $post_id );
2013-11-25 14:35:10 +00:00
if ( $product ) {
2016-02-12 13:30:10 +00:00
$classes [] = wc_get_loop_class ();
$classes [] = $product -> stock_status ;
2013-11-25 14:35:10 +00:00
if ( $product -> is_on_sale () ) {
$classes [] = 'sale' ;
}
if ( $product -> is_featured () ) {
$classes [] = 'featured' ;
}
if ( $product -> is_downloadable () ) {
$classes [] = 'downloadable' ;
}
if ( $product -> is_virtual () ) {
$classes [] = 'virtual' ;
}
if ( $product -> is_sold_individually () ) {
$classes [] = 'sold-individually' ;
}
if ( $product -> is_taxable () ) {
$classes [] = 'taxable' ;
}
if ( $product -> is_shipping_taxable () ) {
$classes [] = 'shipping-taxable' ;
}
if ( $product -> is_purchasable () ) {
$classes [] = 'purchasable' ;
}
2015-06-08 11:20:51 +00:00
if ( $product -> get_type () ) {
$classes [] = " product-type- " . $product -> get_type ();
2013-11-25 14:35:10 +00:00
}
2016-02-12 12:43:24 +00:00
if ( $product -> is_type ( 'variable' ) ) {
if ( $product -> has_default_attributes () ) {
$classes [] = 'has-default-attributes' ;
2013-11-25 14:35:10 +00:00
}
2016-02-12 12:43:24 +00:00
if ( $product -> has_child () ) {
$classes [] = 'has-children' ;
2013-11-25 14:35:10 +00:00
}
}
}
2014-07-28 17:05:36 +00:00
if ( false !== ( $key = array_search ( 'hentry' , $classes ) ) ) {
2014-02-23 11:13:42 +00:00
unset ( $classes [ $key ] );
}
2013-11-25 14:35:10 +00:00
return $classes ;
}
2012-01-06 14:02:34 +00:00
/** Template pages ********************************************************/
2012-04-25 09:51:20 +00:00
if ( ! function_exists ( 'woocommerce_content' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output WooCommerce content .
*
2015-11-03 13:31:20 +00:00
* This function is only used in the optional 'woocommerce.php' template .
* which people can add to their themes to add basic woocommerce support .
2013-02-10 16:06:15 +00:00
* without hooks or modifying core templates .
2012-08-14 15:30:23 +00:00
*
*/
2012-01-06 14:02:34 +00:00
function woocommerce_content () {
2012-08-08 08:58:36 +00:00
2012-07-11 10:23:31 +00:00
if ( is_singular ( 'product' ) ) {
2012-08-08 08:58:36 +00:00
2012-07-11 10:23:31 +00:00
while ( have_posts () ) : the_post ();
2012-08-08 08:58:36 +00:00
2013-11-25 12:45:04 +00:00
wc_get_template_part ( 'content' , 'single-product' );
2012-04-25 09:51:20 +00:00
2012-07-11 10:23:31 +00:00
endwhile ;
2012-04-25 09:51:20 +00:00
2013-04-05 12:01:41 +00:00
} else { ?>
2012-08-08 08:58:36 +00:00
2013-04-05 12:01:41 +00:00
< ? php if ( apply_filters ( 'woocommerce_show_page_title' , true ) ) : ?>
2013-11-25 14:16:26 +00:00
< h1 class = " page-title " >< ? php woocommerce_page_title (); ?> </h1>
2013-04-05 12:01:41 +00:00
< ? php endif ; ?>
2012-08-08 08:58:36 +00:00
2012-08-09 10:30:37 +00:00
< ? php do_action ( 'woocommerce_archive_description' ); ?>
2012-07-19 17:58:41 +00:00
< ? php if ( have_posts () ) : ?>
2012-08-08 08:58:36 +00:00
2012-07-19 17:58:41 +00:00
< ? php do_action ( 'woocommerce_before_shop_loop' ); ?>
2012-08-08 08:58:36 +00:00
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-08-08 08:58:36 +00:00
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_subcategories (); ?>
2012-08-08 08:58:36 +00:00
2012-07-19 17:58:41 +00:00
< ? php while ( have_posts () ) : the_post (); ?>
2012-08-08 08:58:36 +00:00
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-08-08 08:58:36 +00:00
2012-07-19 17:58:41 +00:00
< ? php endwhile ; // end of the loop. ?>
2012-08-08 08:58:36 +00:00
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-08-08 08:58:36 +00:00
2012-07-19 17:58:41 +00:00
< ? php do_action ( 'woocommerce_after_shop_loop' ); ?>
2012-08-08 08:58:36 +00:00
2013-11-25 14:16:26 +00:00
< ? php elseif ( ! woocommerce_product_subcategories ( array ( 'before' => woocommerce_product_loop_start ( false ), 'after' => woocommerce_product_loop_end ( false ) ) ) ) : ?>
2012-08-08 08:58:36 +00:00
2013-11-25 12:45:04 +00:00
< ? php wc_get_template ( 'loop/no-products-found.php' ); ?>
2012-08-08 08:58:36 +00:00
2013-02-10 16:06:15 +00:00
< ? php endif ;
2012-08-08 08:58:36 +00:00
2012-07-11 10:23:31 +00:00
}
2012-01-13 14:17:43 +00:00
}
2012-01-06 14:02:34 +00:00
}
2011-12-11 12:39:35 +00:00
/** Global ****************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_output_content_wrapper' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the start of the page wrapper .
*
*/
2013-11-25 14:35:10 +00:00
function woocommerce_output_content_wrapper () {
2013-11-28 17:23:41 +00:00
wc_get_template ( 'global/wrapper-start.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_output_content_wrapper_end' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the end of the page wrapper .
*
*/
2013-11-25 14:35:10 +00:00
function woocommerce_output_content_wrapper_end () {
2013-11-28 17:23:41 +00:00
wc_get_template ( 'global/wrapper-end.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_get_sidebar' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the shop sidebar template .
*
*/
2013-11-25 14:35:10 +00:00
function woocommerce_get_sidebar () {
2013-11-28 17:23:41 +00:00
wc_get_template ( 'global/sidebar.php' );
2011-12-12 11:35:54 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_demo_store' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Adds a demo store banner to the site if enabled .
2012-08-14 15:30:23 +00:00
*
*/
2013-11-25 14:35:10 +00:00
function woocommerce_demo_store () {
2015-07-16 16:06:12 +00:00
if ( ! is_store_notice_showing () ) {
2012-08-10 09:35:25 +00:00
return ;
2015-07-16 16:06:12 +00:00
}
2012-04-25 09:51:20 +00:00
2012-08-10 09:35:25 +00:00
$notice = get_option ( 'woocommerce_demo_store_notice' );
2015-07-16 19:55:48 +00:00
2015-07-16 16:06:12 +00:00
if ( empty ( $notice ) ) {
2012-08-10 09:35:25 +00:00
$notice = __ ( 'This is a demo store for testing purposes — no orders shall be fulfilled.' , 'woocommerce' );
2015-07-16 16:06:12 +00:00
}
2012-08-10 09:35:25 +00:00
2015-07-16 16:06:12 +00:00
echo apply_filters ( 'woocommerce_demo_store' , '<p class="demo_store">' . wp_kses_post ( $notice ) . '</p>' );
2011-12-12 12:28:07 +00:00
}
}
2011-12-11 01:10:24 +00:00
/** Loop ******************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_page_title' ) ) {
2012-11-04 16:01:40 +00:00
/**
2013-11-25 14:16:26 +00:00
* woocommerce_page_title function .
2012-11-27 16:22:47 +00:00
*
2016-01-06 16:11:09 +00:00
* @ param bool $echo
2013-08-23 13:54:38 +00:00
* @ return string
2012-11-04 16:01:40 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_page_title ( $echo = true ) {
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
if ( is_search () ) {
$page_title = sprintf ( __ ( 'Search Results: “%s”' , 'woocommerce' ), get_search_query () );
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
if ( get_query_var ( 'paged' ) )
$page_title .= sprintf ( __ ( ' – Page %s' , 'woocommerce' ), get_query_var ( 'paged' ) );
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
} elseif ( is_tax () ) {
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
$page_title = single_term_title ( " " , false );
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
} else {
2012-11-27 16:22:47 +00:00
2013-11-25 14:07:22 +00:00
$shop_page_id = wc_get_page_id ( 'shop' );
2013-03-18 12:43:38 +00:00
$page_title = get_the_title ( $shop_page_id );
2012-11-27 16:22:47 +00:00
2012-11-04 16:01:40 +00:00
}
2012-11-27 16:22:47 +00:00
2013-08-23 13:54:38 +00:00
$page_title = apply_filters ( 'woocommerce_page_title' , $page_title );
if ( $echo )
echo $page_title ;
else
return $page_title ;
2012-11-04 16:01:40 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_loop_start' ) ) {
2012-09-30 13:41:07 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the start of a product loop . By default this is a UL .
2012-09-30 13:41:07 +00:00
*
2013-11-27 18:23:46 +00:00
* @ param bool $echo
2013-11-27 18:20:31 +00:00
* @ return string
2012-09-30 13:41:07 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_loop_start ( $echo = true ) {
2012-09-30 13:41:07 +00:00
ob_start ();
2016-02-12 13:30:10 +00:00
$GLOBALS [ 'woocommerce_loop' ][ 'loop' ] = 0 ;
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/loop-start.php' );
2012-09-30 13:41:07 +00:00
if ( $echo )
echo ob_get_clean ();
2012-11-27 16:22:47 +00:00
else
2012-09-30 13:41:07 +00:00
return ob_get_clean ();
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_loop_end' ) ) {
2012-09-30 13:41:07 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the end of a product loop . By default this is a UL .
2012-09-30 13:41:07 +00:00
*
2013-11-27 18:20:31 +00:00
* @ param bool $echo
* @ return string
2012-09-30 13:41:07 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_loop_end ( $echo = true ) {
2012-09-30 13:41:07 +00:00
ob_start ();
2013-02-10 16:06:15 +00:00
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/loop-end.php' );
2013-02-10 16:06:15 +00:00
2012-09-30 13:41:07 +00:00
if ( $echo )
echo ob_get_clean ();
2012-11-27 16:22:47 +00:00
else
2012-09-30 13:41:07 +00:00
return ob_get_clean ();
}
}
2015-07-20 17:10:56 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_product_title' ) ) {
2015-07-20 17:36:12 +00:00
2015-07-20 17:10:56 +00:00
/**
2015-11-03 13:31:20 +00:00
* Show the product title in the product loop . By default this is an H3 .
2015-07-20 17:10:56 +00:00
*/
function woocommerce_template_loop_product_title () {
2015-10-01 16:58:27 +00:00
echo '<h3>' . get_the_title () . '</h3>' ;
2015-07-20 17:10:56 +00:00
}
}
2016-01-19 09:39:53 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_category_title' ) ) {
2015-10-01 14:12:50 +00:00
/**
* Show the subcategory title in the product loop .
*/
2015-10-01 14:28:57 +00:00
function woocommerce_template_loop_category_title ( $category ) {
2015-10-01 14:12:50 +00:00
?>
< h3 >
< ? php
echo $category -> name ;
if ( $category -> count > 0 )
echo apply_filters ( 'woocommerce_subcategory_count_html' , ' <mark class="count">(' . $category -> count . ')</mark>' , $category );
?>
</ h3 >
< ? php
}
}
2015-10-01 14:20:01 +00:00
/**
* Insert the opening anchor tag for products in the loop .
*/
function woocommerce_template_loop_product_link_open () {
2016-03-15 13:44:59 +00:00
echo '<a href="' . get_the_permalink () . '" class="woocommerce-LoopProduct-link">' ;
2015-10-01 13:49:35 +00:00
}
2015-10-01 14:20:01 +00:00
/**
* Insert the opening anchor tag for products in the loop .
*/
function woocommerce_template_loop_product_link_close () {
echo '</a>' ;
2015-10-01 13:49:35 +00:00
}
2015-10-01 14:28:57 +00:00
/**
* Insert the opening anchor tag for categories in the loop .
*/
function woocommerce_template_loop_category_link_open ( $category ) {
2016-02-06 01:00:28 +00:00
echo '<a href="' . get_term_link ( $category , 'product_cat' ) . '">' ;
2015-10-01 14:28:57 +00:00
}
/**
* Insert the opening anchor tag for categories in the loop .
*/
function woocommerce_template_loop_category_link_close () {
echo '</a>' ;
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_taxonomy_archive_description' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Show an archive description on taxonomy archives .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Archives
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_taxonomy_archive_description () {
2015-12-01 04:02:00 +00:00
if ( is_tax ( array ( 'product_cat' , 'product_tag' ) ) && 0 === absint ( get_query_var ( 'paged' ) ) ) {
2015-01-16 12:32:41 +00:00
$description = wc_format_content ( term_description () );
2013-01-03 11:24:23 +00:00
if ( $description ) {
2013-04-19 06:26:18 +00:00
echo '<div class="term-description">' . $description . '</div>' ;
2013-01-03 11:24:23 +00:00
}
2013-01-03 10:19:52 +00:00
}
2012-08-09 10:25:34 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_archive_description' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Show a shop page description on product archives .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Archives
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_archive_description () {
2015-12-01 04:02:00 +00:00
if ( is_post_type_archive ( 'product' ) && 0 === absint ( get_query_var ( 'paged' ) ) ) {
2013-11-25 14:07:22 +00:00
$shop_page = get_post ( wc_get_page_id ( 'shop' ) );
2013-11-18 14:11:40 +00:00
if ( $shop_page ) {
2015-01-16 12:32:41 +00:00
$description = wc_format_content ( $shop_page -> post_content );
2013-11-18 14:11:40 +00:00
if ( $description ) {
echo '<div class="page-description">' . $description . '</div>' ;
}
2013-01-03 11:24:23 +00:00
}
2013-01-03 10:19:52 +00:00
}
2012-08-09 10:25:34 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the add to cart template for the loop .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2014-02-28 21:43:31 +00:00
function woocommerce_template_loop_add_to_cart ( $args = array () ) {
2015-12-04 11:50:32 +00:00
global $product ;
if ( $product ) {
$defaults = array (
'quantity' => 1 ,
'class' => implode ( ' ' , array_filter ( array (
'button' ,
'product_type_' . $product -> product_type ,
$product -> is_purchasable () && $product -> is_in_stock () ? 'add_to_cart_button' : '' ,
$product -> supports ( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : ''
) ) )
);
$args = apply_filters ( 'woocommerce_loop_add_to_cart_args' , wp_parse_args ( $args , $defaults ), $product );
wc_get_template ( 'loop/add-to-cart.php' , $args );
}
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_product_thumbnail' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the product thumbnail for the loop .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_loop_product_thumbnail () {
2013-11-25 14:16:26 +00:00
echo woocommerce_get_product_thumbnail ();
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_price' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the product price for the loop .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_loop_price () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/price.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_loop_rating' ) ) {
2013-01-12 10:53:24 +00:00
/**
2015-11-03 13:31:20 +00:00
* Display the average rating in the loop .
2013-01-12 10:53:24 +00:00
*
* @ subpackage Loop
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_loop_rating () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/rating.php' );
2013-01-12 10:53:24 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_show_product_loop_sale_flash' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the sale flash for the loop .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_show_product_loop_sale_flash () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/sale-flash.php' );
2011-12-11 14:40:25 +00:00
}
}
2013-08-09 16:11:15 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_get_product_schema' ) ) {
2013-08-20 12:52:06 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get a products Schema .
2013-08-20 12:52:06 +00:00
* @ return string
*/
2013-11-25 14:35:10 +00:00
function woocommerce_get_product_schema () {
2014-06-08 20:33:11 +00:00
global $product ;
2013-08-20 12:52:06 +00:00
$schema = " Product " ;
// Downloadable product schema handling
if ( $product -> is_downloadable () ) {
switch ( $product -> download_type ) {
case 'application' :
$schema = " SoftwareApplication " ;
break ;
case 'music' :
$schema = " MusicAlbum " ;
break ;
default :
$schema = " Product " ;
break ;
}
}
return 'http://schema.org/' . $schema ;
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_get_product_thumbnail' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Get the product thumbnail , or the placeholder if not set .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
* @ param string $size ( default : 'shop_catalog' )
2015-06-23 15:46:37 +00:00
* @ param int $deprecated1 Deprecated since WooCommerce 2.0 ( default : 0 )
* @ param int $deprecated2 Deprecated since WooCommerce 2.0 ( default : 0 )
2012-08-14 15:30:23 +00:00
* @ return string
*/
2015-06-23 15:46:37 +00:00
function woocommerce_get_product_thumbnail ( $size = 'shop_catalog' , $deprecated1 = 0 , $deprecated2 = 0 ) {
2012-11-27 15:37:01 +00:00
global $post ;
2016-05-21 15:29:44 +00:00
$size = apply_filters ( 'single_product_archive_thumbnail_size' , 'shop_catalog' );
2011-12-12 11:35:54 +00:00
2014-11-20 00:43:09 +00:00
if ( has_post_thumbnail () ) {
2016-05-03 15:41:51 +00:00
$props = wc_get_product_attachment_props ( get_post_thumbnail_id (), $post );
return get_the_post_thumbnail ( $post -> ID , $size , array (
'title' => $props [ 'title' ],
'alt' => $props [ 'alt' ],
) );
2014-11-20 00:43:09 +00:00
} elseif ( wc_placeholder_img_src () ) {
2013-11-25 13:56:59 +00:00
return wc_placeholder_img ( $size );
2014-11-20 00:43:09 +00:00
}
2011-12-12 11:35:54 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_result_count' ) ) {
2012-08-14 15:30:23 +00:00
/**
2012-10-14 12:06:37 +00:00
* Output the result count text ( Showing x - x of x results ) .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_result_count () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/result-count.php' );
2011-12-11 01:10:24 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_catalog_ordering' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product sorting options .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_catalog_ordering () {
2014-07-30 16:23:24 +00:00
global $wp_query ;
2012-11-27 16:22:47 +00:00
2015-12-01 04:02:00 +00:00
if ( 1 === $wp_query -> found_posts || ! woocommerce_products_will_display () ) {
2014-07-30 16:23:24 +00:00
return ;
}
2014-09-10 08:32:24 +00:00
2014-07-30 16:23:24 +00:00
$orderby = isset ( $_GET [ 'orderby' ] ) ? wc_clean ( $_GET [ 'orderby' ] ) : apply_filters ( 'woocommerce_default_catalog_orderby' , get_option ( 'woocommerce_default_catalog_orderby' ) );
$show_default_orderby = 'menu_order' === apply_filters ( 'woocommerce_default_catalog_orderby' , get_option ( 'woocommerce_default_catalog_orderby' ) );
$catalog_orderby_options = apply_filters ( 'woocommerce_catalog_orderby' , array (
'menu_order' => __ ( 'Default sorting' , 'woocommerce' ),
'popularity' => __ ( 'Sort by popularity' , 'woocommerce' ),
'rating' => __ ( 'Sort by average rating' , 'woocommerce' ),
'date' => __ ( 'Sort by newness' , 'woocommerce' ),
'price' => __ ( 'Sort by price: low to high' , 'woocommerce' ),
'price-desc' => __ ( 'Sort by price: high to low' , 'woocommerce' )
) );
if ( ! $show_default_orderby ) {
unset ( $catalog_orderby_options [ 'menu_order' ] );
}
2015-12-01 04:02:00 +00:00
if ( 'no' === get_option ( 'woocommerce_enable_review_rating' ) ) {
2014-07-30 16:23:24 +00:00
unset ( $catalog_orderby_options [ 'rating' ] );
}
wc_get_template ( 'loop/orderby.php' , array ( 'catalog_orderby_options' => $catalog_orderby_options , 'orderby' => $orderby , 'show_default_orderby' => $show_default_orderby ) );
2011-12-11 01:10:24 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_pagination' ) ) {
2012-10-14 12:06:37 +00:00
/**
* Output the pagination .
*
* @ subpackage Loop
*/
2013-11-25 14:35:10 +00:00
function woocommerce_pagination () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'loop/pagination.php' );
2012-10-14 12:06:37 +00:00
}
}
2011-12-11 01:08:33 +00:00
/** Single Product ********************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_show_product_images' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product image before the single product summary .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_show_product_images () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/product-image.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_show_product_thumbnails' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product thumbnails .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_show_product_thumbnails () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/product-thumbnails.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_output_product_data_tabs' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product tabs .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product / Tabs
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_output_product_data_tabs () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/tabs/tabs.php' );
2012-03-13 12:52:53 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_title' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product title .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_title () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/title.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_rating' ) ) {
2013-10-31 16:26:20 +00:00
/**
* Output the product rating .
*
* @ subpackage Product
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_rating () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/rating.php' );
2013-10-31 16:26:20 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_price' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product price .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_price () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/price.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_excerpt' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product short description ( excerpt ) .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_excerpt () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/short-description.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_meta' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product meta .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_meta () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/meta.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_sharing' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product sharing .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_sharing () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/share.php' );
2011-09-04 00:02:44 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_show_product_sale_flash' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the product sale flash .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_show_product_sale_flash () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/sale-flash.php' );
2011-12-11 14:40:25 +00:00
}
}
2011-09-04 00:02:44 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_template_single_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Trigger the single product add to cart action .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_template_single_add_to_cart () {
2011-12-11 15:20:34 +00:00
global $product ;
2016-02-22 14:41:14 +00:00
do_action ( 'woocommerce_' . $product -> product_type . '_add_to_cart' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_simple_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the simple product add to cart area .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_simple_add_to_cart () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/add-to-cart/simple.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_grouped_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the grouped product add to cart area .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_grouped_add_to_cart () {
2013-09-25 11:35:06 +00:00
global $product ;
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/add-to-cart/grouped.php' , array (
2013-09-25 11:35:06 +00:00
'grouped_product' => $product ,
'grouped_products' => $product -> get_children (),
'quantites_required' => false
) );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_variable_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the variable product add to cart area .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_variable_add_to_cart () {
2012-06-10 09:15:23 +00:00
global $product ;
2012-08-08 08:58:36 +00:00
2012-07-17 14:09:18 +00:00
// Enqueue variation scripts
wp_enqueue_script ( 'wc-add-to-cart-variation' );
2012-08-08 08:58:36 +00:00
2015-07-09 14:58:58 +00:00
// Get Available variations?
2015-09-14 15:54:58 +00:00
$get_variations = sizeof ( $product -> get_children () ) <= apply_filters ( 'woocommerce_ajax_variation_threshold' , 30 , $product );
2015-07-09 14:58:58 +00:00
2012-07-17 14:09:18 +00:00
// Load the template
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/add-to-cart/variable.php' , array (
2015-07-09 14:58:58 +00:00
'available_variations' => $get_variations ? $product -> get_available_variations () : false ,
2015-07-09 14:56:20 +00:00
'attributes' => $product -> get_variation_attributes (),
'selected_attributes' => $product -> get_variation_default_attributes ()
) );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_external_add_to_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the external product add to cart area .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_external_add_to_cart () {
2012-02-26 11:47:49 +00:00
global $product ;
2015-05-05 14:18:01 +00:00
if ( ! $product -> add_to_cart_url () ) {
2013-02-13 09:29:00 +00:00
return ;
2015-05-05 14:18:01 +00:00
}
2012-04-25 09:51:20 +00:00
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/add-to-cart/external.php' , array (
2015-05-05 14:18:01 +00:00
'product_url' => $product -> add_to_cart_url (),
'button_text' => $product -> single_add_to_cart_text ()
) );
2011-11-08 16:15:36 +00:00
}
}
2011-08-10 17:11:11 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_quantity_input' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the quantity input for add to cart forms .
2014-02-13 04:49:30 +00:00
*
2013-11-28 17:23:41 +00:00
* @ param array $args Args for the input
2014-02-13 04:49:30 +00:00
* @ param WC_Product | null $product
2014-11-26 14:19:53 +00:00
* @ param boolean $echo Whether to return or echo | string
2012-08-14 15:30:23 +00:00
*/
2013-11-28 17:23:41 +00:00
function woocommerce_quantity_input ( $args = array (), $product = null , $echo = true ) {
2015-12-04 11:50:32 +00:00
if ( is_null ( $product ) ) {
2013-11-28 17:23:41 +00:00
$product = $GLOBALS [ 'product' ];
2015-12-04 11:50:32 +00:00
}
2012-11-27 16:22:47 +00:00
2011-12-11 14:40:25 +00:00
$defaults = array (
2016-02-26 14:36:53 +00:00
'input_name' => 'quantity' ,
'input_value' => '1' ,
'max_value' => apply_filters ( 'woocommerce_quantity_input_max' , '' , $product ),
'min_value' => apply_filters ( 'woocommerce_quantity_input_min' , '' , $product ),
'step' => apply_filters ( 'woocommerce_quantity_input_step' , '1' , $product ),
'pattern' => apply_filters ( 'woocommerce_quantity_input_pattern' , has_filter ( 'woocommerce_stock_amount' , 'intval' ) ? '[0-9]*' : '' ),
'inputmode' => apply_filters ( 'woocommerce_quantity_input_inputmode' , has_filter ( 'woocommerce_stock_amount' , 'intval' ) ? 'numeric' : '' ),
2011-12-11 14:40:25 +00:00
);
2012-11-19 14:05:03 +00:00
$args = apply_filters ( 'woocommerce_quantity_input_args' , wp_parse_args ( $args , $defaults ), $product );
2012-04-25 09:51:20 +00:00
2015-12-02 10:44:38 +00:00
// Apply sanity to min/max args - min cannot be lower than 0
2015-12-02 15:51:55 +00:00
if ( '' !== $args [ 'min_value' ] && is_numeric ( $args [ 'min_value' ] ) && $args [ 'min_value' ] < 0 ) {
2015-12-02 10:44:38 +00:00
$args [ 'min_value' ] = 0 ; // Cannot be lower than 0
}
// Max cannot be lower than 0 or min
2015-12-02 15:51:55 +00:00
if ( '' !== $args [ 'max_value' ] && is_numeric ( $args [ 'max_value' ] ) ) {
2015-12-02 10:44:38 +00:00
$args [ 'max_value' ] = $args [ 'max_value' ] < 0 ? 0 : $args [ 'max_value' ];
$args [ 'max_value' ] = $args [ 'max_value' ] < $args [ 'min_value' ] ? $args [ 'min_value' ] : $args [ 'max_value' ];
}
2013-11-28 17:23:41 +00:00
ob_start ();
wc_get_template ( 'global/quantity-input.php' , $args );
if ( $echo ) {
echo ob_get_clean ();
} else {
return ob_get_clean ();
}
2011-12-05 19:16:55 +00:00
}
}
2011-08-10 17:11:11 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_description_tab' ) ) {
2012-08-14 15:30:23 +00:00
/**
2013-02-10 17:33:13 +00:00
* Output the description tab content .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product / Tabs
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_description_tab () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/tabs/description.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_additional_information_tab' ) ) {
2012-08-14 15:30:23 +00:00
/**
2013-02-10 17:33:13 +00:00
* Output the attributes tab content .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product / Tabs
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_additional_information_tab () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/tabs/additional-information.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_reviews_tab' ) ) {
2012-08-14 15:30:23 +00:00
/**
2013-02-10 17:33:13 +00:00
* Output the reviews tab content .
2015-04-10 15:07:33 +00:00
* @ deprecated 2.4 . 0 Unused
2012-08-15 18:15:06 +00:00
* @ subpackage Product / Tabs
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_reviews_tab () {
2015-04-10 15:07:33 +00:00
_deprecated_function ( 'woocommerce_product_reviews_tab' , '2.4' , '' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_default_product_tabs' ) ) {
2012-08-14 15:30:23 +00:00
/**
2013-02-10 17:33:13 +00:00
* Add default product tabs to product pages .
2012-08-14 15:30:23 +00:00
*
2013-11-29 18:50:31 +00:00
* @ param array $tabs
* @ return array
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_default_product_tabs ( $tabs = array () ) {
2013-02-10 17:33:13 +00:00
global $product , $post ;
2012-08-14 15:30:23 +00:00
2013-02-10 17:33:13 +00:00
// Description tab - shows product content
2014-01-13 11:39:54 +00:00
if ( $post -> post_content ) {
2013-02-10 17:33:13 +00:00
$tabs [ 'description' ] = array (
'title' => __ ( 'Description' , 'woocommerce' ),
'priority' => 10 ,
2013-11-25 14:16:26 +00:00
'callback' => 'woocommerce_product_description_tab'
2013-02-10 17:33:13 +00:00
);
2014-01-13 11:39:54 +00:00
}
2013-02-10 17:33:13 +00:00
2013-03-03 17:07:31 +00:00
// Additional information tab - shows attributes
2014-01-13 11:39:54 +00:00
if ( $product && ( $product -> has_attributes () || ( $product -> enable_dimensions_display () && ( $product -> has_dimensions () || $product -> has_weight () ) ) ) ) {
2013-02-10 17:33:13 +00:00
$tabs [ 'additional_information' ] = array (
'title' => __ ( 'Additional Information' , 'woocommerce' ),
'priority' => 20 ,
2013-11-25 14:16:26 +00:00
'callback' => 'woocommerce_product_additional_information_tab'
2013-02-10 17:33:13 +00:00
);
2014-01-13 11:39:54 +00:00
}
2013-02-10 17:33:13 +00:00
// Reviews tab - shows comments
2014-01-13 11:39:54 +00:00
if ( comments_open () ) {
2013-02-10 17:33:13 +00:00
$tabs [ 'reviews' ] = array (
2015-02-11 22:55:16 +00:00
'title' => sprintf ( __ ( 'Reviews (%d)' , 'woocommerce' ), $product -> get_review_count () ),
2013-02-10 17:33:13 +00:00
'priority' => 30 ,
'callback' => 'comments_template'
);
2014-01-13 11:39:54 +00:00
}
2013-02-10 17:33:13 +00:00
return $tabs ;
2011-08-10 17:11:11 +00:00
}
}
2013-02-10 17:33:13 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_sort_product_tabs' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Sort tabs by priority .
2012-08-14 15:30:23 +00:00
*
2013-11-28 17:59:09 +00:00
* @ param array $tabs
* @ return array
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_sort_product_tabs ( $tabs = array () ) {
2014-02-13 04:49:30 +00:00
2013-08-27 15:40:21 +00:00
// Make sure the $tabs parameter is an array
if ( ! is_array ( $tabs ) ) {
2013-11-25 14:35:10 +00:00
trigger_error ( " Function woocommerce_sort_product_tabs() expects an array as the first parameter. Defaulting to empty array. " );
2013-08-27 15:40:21 +00:00
$tabs = array ( );
}
2013-02-10 17:33:13 +00:00
// Re-order tabs by priority
if ( ! function_exists ( '_sort_priority_callback' ) ) {
function _sort_priority_callback ( $a , $b ) {
2015-12-01 04:02:00 +00:00
if ( $a [ 'priority' ] === $b [ 'priority' ] )
2013-02-10 17:33:13 +00:00
return 0 ;
return ( $a [ 'priority' ] < $b [ 'priority' ] ) ? - 1 : 1 ;
}
}
uasort ( $tabs , '_sort_priority_callback' );
return $tabs ;
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_comments' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the Review comments template .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2016-01-06 16:11:09 +00:00
* @ param WP_Comment $comment
* @ param array $args
* @ param int $depth
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_comments ( $comment , $args , $depth ) {
2011-12-12 12:28:07 +00:00
$GLOBALS [ 'comment' ] = $comment ;
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/review.php' , array ( 'comment' => $comment , 'args' => $args , 'depth' => $depth ) );
2011-12-12 12:28:07 +00:00
}
}
2011-08-10 17:11:11 +00:00
2016-03-07 15:33:44 +00:00
if ( ! function_exists ( 'woocommerce_review_display_gravatar' ) ) {
/**
* Display the review authors gravatar
*
* @ param array $comment WP_Comment .
* @ return void
*/
function woocommerce_review_display_gravatar ( $comment ) {
echo get_avatar ( $comment , apply_filters ( 'woocommerce_review_gravatar_size' , '60' ), '' );
}
}
if ( ! function_exists ( 'woocommerce_review_display_rating' ) ) {
/**
* Display the reviewers star rating
*
* @ return void
*/
function woocommerce_review_display_rating () {
wc_get_template ( 'single-product/review-rating.php' );
}
}
if ( ! function_exists ( 'woocommerce_review_display_meta' ) ) {
/**
* Display the review authors meta ( name , verified owner , review date )
*
* @ return void
*/
function woocommerce_review_display_meta () {
wc_get_template ( 'single-product/review-meta.php' );
}
}
if ( ! function_exists ( 'woocommerce_review_display_comment_text' ) ) {
/**
* Display the review content
*
* @ return void
*/
function woocommerce_review_display_comment_text () {
echo '<div itemprop="description" class="description">' . comment_text () . '</div>' ;
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_output_related_products' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the related products .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Product
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_output_related_products () {
2013-05-16 12:39:53 +00:00
$args = array (
2015-05-19 17:06:57 +00:00
'posts_per_page' => 4 ,
'columns' => 4 ,
'orderby' => 'rand'
2013-05-16 12:39:53 +00:00
);
2013-11-25 14:16:26 +00:00
woocommerce_related_products ( apply_filters ( 'woocommerce_output_related_products_args' , $args ) );
2011-08-10 17:11:11 +00:00
}
}
2011-11-24 00:24:24 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_related_products' ) ) {
2012-11-27 16:22:47 +00:00
2012-08-14 15:30:23 +00:00
/**
* Output the related products .
2012-11-27 16:22:47 +00:00
*
2013-05-17 06:55:55 +00:00
* @ param array Provided arguments
* @ param bool Columns argument for backwards compat
* @ param bool Order by argument for backwards compat
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_related_products ( $args = array (), $columns = false , $orderby = false ) {
2013-05-17 06:55:55 +00:00
if ( ! is_array ( $args ) ) {
2013-11-01 22:00:09 +00:00
_deprecated_argument ( __FUNCTION__ , '2.1' , __ ( 'Use $args argument as an array instead. Deprecated argument will be removed in WC 2.2.' , 'woocommerce' ) );
2013-05-17 06:55:55 +00:00
$argsvalue = $args ;
$args = array (
'posts_per_page' => $argsvalue ,
'columns' => $columns ,
'orderby' => $orderby ,
);
}
2013-05-16 12:39:53 +00:00
$defaults = array (
'posts_per_page' => 2 ,
2013-05-17 06:55:55 +00:00
'columns' => 2 ,
'orderby' => 'rand'
2013-05-16 12:39:53 +00:00
);
$args = wp_parse_args ( $args , $defaults );
2013-11-25 12:45:04 +00:00
wc_get_template ( 'single-product/related.php' , $args );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_upsell_display' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output product up sells .
2012-11-27 16:22:47 +00:00
*
2012-09-21 15:47:57 +00:00
* @ param int $posts_per_page ( default : - 1 )
2015-09-21 20:30:37 +00:00
* @ param int $columns ( default : 4 )
2012-09-21 15:47:57 +00:00
* @ param string $orderby ( default : 'rand' )
2012-08-14 15:30:23 +00:00
*/
2015-05-19 17:06:57 +00:00
function woocommerce_upsell_display ( $posts_per_page = '-1' , $columns = 4 , $orderby = 'rand' ) {
2015-09-21 20:30:37 +00:00
$args = apply_filters ( 'woocommerce_upsell_display_args' , array (
'posts_per_page' => $posts_per_page ,
'orderby' => apply_filters ( 'woocommerce_upsells_orderby' , $orderby ),
'columns' => $columns
) );
wc_get_template ( 'single-product/up-sells.php' , $args );
2011-12-12 12:28:07 +00:00
}
}
2011-12-11 14:40:25 +00:00
/** Cart ******************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_shipping_calculator' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the cart shipping calculator .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Cart
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_shipping_calculator () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'cart/shipping-calculator.php' );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_cart_totals' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the cart totals .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Cart
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_cart_totals () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'cart/cart-totals.php' );
2011-09-11 16:42:50 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_cross_sell_display' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the cart cross - sells .
*
2016-01-06 16:11:09 +00:00
* @ param int $posts_per_page ( default : 2 )
* @ param int $columns ( default : 2 )
* @ param string $orderby ( default : 'rand' )
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_cross_sell_display ( $posts_per_page = 2 , $columns = 2 , $orderby = 'rand' ) {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'cart/cross-sells.php' , array (
2013-06-05 16:29:06 +00:00
'posts_per_page' => $posts_per_page ,
'orderby' => $orderby ,
'columns' => $columns
) );
2011-12-12 12:28:07 +00:00
}
}
2014-10-06 11:33:36 +00:00
if ( ! function_exists ( 'woocommerce_button_proceed_to_checkout' ) ) {
/**
* Output the proceed to checkout button .
*
* @ subpackage Cart
*/
function woocommerce_button_proceed_to_checkout () {
2015-05-28 10:48:33 +00:00
wc_get_template ( 'cart/proceed-to-checkout-button.php' );
2014-10-06 11:33:36 +00:00
}
}
2012-07-25 17:59:12 +00:00
/** Mini-Cart *************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_mini_cart' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the Mini - cart - used by cart widget .
2012-08-14 15:30:23 +00:00
*
2016-01-06 16:11:09 +00:00
* @ param array $args
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_mini_cart ( $args = array () ) {
2012-08-08 08:58:36 +00:00
2012-07-25 17:59:12 +00:00
$defaults = array (
'list_class' => ''
);
$args = wp_parse_args ( $args , $defaults );
2012-08-08 08:58:36 +00:00
2013-11-25 12:45:04 +00:00
wc_get_template ( 'cart/mini-cart.php' , $args );
2012-07-25 17:59:12 +00:00
}
}
2011-12-11 14:40:25 +00:00
/** Login *****************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_login_form' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the WooCommerce Login Form .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Forms
2016-01-06 16:11:09 +00:00
* @ param array $args
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_login_form ( $args = array () ) {
2012-02-03 16:17:35 +00:00
2011-12-12 12:28:07 +00:00
$defaults = array (
2013-02-25 10:17:16 +00:00
'message' => '' ,
'redirect' => '' ,
'hidden' => false
2011-12-12 12:28:07 +00:00
);
2011-11-24 00:24:24 +00:00
2012-04-25 09:51:20 +00:00
$args = wp_parse_args ( $args , $defaults );
2013-11-28 17:23:41 +00:00
wc_get_template ( 'global/form-login.php' , $args );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_checkout_login_form' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the WooCommerce Checkout Login Form .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Checkout
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_checkout_login_form () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'checkout/form-login.php' , array ( 'checkout' => WC () -> checkout () ) );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_breadcrumb' ) ) {
2012-08-14 15:30:23 +00:00
/**
2015-11-03 13:31:20 +00:00
* Output the WooCommerce Breadcrumb .
2016-01-06 16:11:09 +00:00
*
* @ param array $args
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_breadcrumb ( $args = array () ) {
2014-12-05 13:42:19 +00:00
$args = wp_parse_args ( $args , apply_filters ( 'woocommerce_breadcrumb_defaults' , array (
2015-02-16 16:21:48 +00:00
'delimiter' => ' / ' ,
2013-11-18 12:53:45 +00:00
'wrap_before' => '<nav class="woocommerce-breadcrumb" ' . ( is_single () ? 'itemprop="breadcrumb"' : '' ) . '>' ,
2013-01-03 11:54:07 +00:00
'wrap_after' => '</nav>' ,
2012-12-28 16:06:56 +00:00
'before' => '' ,
'after' => '' ,
2014-12-05 13:42:19 +00:00
'home' => _x ( 'Home' , 'breadcrumb' , 'woocommerce' )
) ) );
2011-11-24 00:24:24 +00:00
2014-12-05 13:42:19 +00:00
$breadcrumbs = new WC_Breadcrumb ();
if ( $args [ 'home' ] ) {
2015-02-12 20:34:40 +00:00
$breadcrumbs -> add_crumb ( $args [ 'home' ], apply_filters ( 'woocommerce_breadcrumb_home_url' , home_url () ) );
2014-12-05 13:42:19 +00:00
}
$args [ 'breadcrumb' ] = $breadcrumbs -> generate ();
2011-11-24 00:24:24 +00:00
2013-11-28 17:23:41 +00:00
wc_get_template ( 'global/breadcrumb.php' , $args );
2011-08-10 17:11:11 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_order_review' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the Order review table for the checkout .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Checkout
2012-08-14 15:30:23 +00:00
*/
2014-11-26 14:19:53 +00:00
function woocommerce_order_review ( $deprecated = false ) {
wc_get_template ( 'checkout/review-order.php' , array ( 'checkout' => WC () -> checkout () ) );
}
}
if ( ! function_exists ( 'woocommerce_checkout_payment' ) ) {
/**
2015-11-03 13:31:20 +00:00
* Output the Payment Methods on the checkout .
2014-11-26 14:19:53 +00:00
*
* @ subpackage Checkout
*/
function woocommerce_checkout_payment () {
if ( WC () -> cart -> needs_payment () ) {
$available_gateways = WC () -> payment_gateways () -> get_available_payment_gateways ();
WC () -> payment_gateways () -> set_current_gateway ( $available_gateways );
} else {
$available_gateways = array ();
}
wc_get_template ( 'checkout/payment.php' , array (
'checkout' => WC () -> checkout (),
'available_gateways' => WC () -> payment_gateways () -> get_available_payment_gateways (),
'order_button_text' => apply_filters ( 'woocommerce_order_button_text' , __ ( 'Place order' , 'woocommerce' ) )
) );
2011-12-11 15:40:17 +00:00
}
2011-09-04 00:02:44 +00:00
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_checkout_coupon_form' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Output the Coupon form for the checkout .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Checkout
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_checkout_coupon_form () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'checkout/form-coupon.php' , array ( 'checkout' => WC () -> checkout () ) );
2011-12-19 17:10:53 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_products_will_display' ) ) {
2012-10-14 12:06:37 +00:00
/**
2015-11-14 15:44:15 +00:00
* Check if we will be showing products or not ( and not sub - categories only ) .
2012-10-14 12:06:37 +00:00
* @ subpackage Loop
2013-11-27 18:20:31 +00:00
* @ return bool
2012-10-14 12:06:37 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_products_will_display () {
2015-11-14 15:44:15 +00:00
global $wpdb ;
2015-10-06 13:09:59 +00:00
if ( is_shop () ) {
return 'subcategories' !== get_option ( 'woocommerce_shop_page_display' ) || is_search ();
}
2012-11-27 16:22:47 +00:00
2015-10-06 13:09:59 +00:00
if ( ! is_product_taxonomy () ) {
2012-10-14 12:06:37 +00:00
return false ;
2015-10-06 13:09:59 +00:00
}
2012-11-27 16:22:47 +00:00
2015-10-06 13:09:59 +00:00
if ( is_search () || is_filtered () || is_paged () ) {
2012-10-14 12:06:37 +00:00
return true ;
2015-10-06 13:09:59 +00:00
}
2012-11-27 16:22:47 +00:00
2012-11-08 18:05:18 +00:00
$term = get_queried_object ();
2012-11-27 16:22:47 +00:00
if ( is_product_category () ) {
2012-11-08 18:05:18 +00:00
switch ( get_woocommerce_term_meta ( $term -> term_id , 'display_type' , true ) ) {
2014-02-26 11:43:33 +00:00
case 'subcategories' :
// Nothing - we want to continue to see if there are products/subcats
break ;
2012-11-08 18:05:18 +00:00
case 'products' :
case 'both' :
return true ;
break ;
2014-02-26 11:43:33 +00:00
default :
// Default - no setting
2015-11-14 15:44:15 +00:00
if ( get_option ( 'woocommerce_category_archive_display' ) != 'subcategories' ) {
2012-11-08 18:05:18 +00:00
return true ;
2015-11-14 15:44:15 +00:00
}
2012-11-08 18:05:18 +00:00
break ;
}
}
2012-11-27 16:22:47 +00:00
2014-02-26 11:43:33 +00:00
// Begin subcategory logic
2015-11-14 15:44:15 +00:00
if ( empty ( $term -> term_id ) || empty ( $term -> taxonomy ) ) {
2014-02-06 09:21:47 +00:00
return true ;
}
2015-11-14 15:44:15 +00:00
$transient_name = 'wc_products_will_display_' . $term -> term_id . '_' . WC_Cache_Helper :: get_transient_version ( 'product_query' );
2014-07-03 11:59:54 +00:00
if ( false === ( $products_will_display = get_transient ( $transient_name ) ) ) {
2015-11-14 15:44:15 +00:00
$has_children = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT term_id FROM { $wpdb -> term_taxonomy } WHERE parent = %d AND taxonomy = %s " , $term -> term_id , $term -> taxonomy ) );
2014-02-06 09:21:47 +00:00
if ( $has_children ) {
2014-02-26 11:43:33 +00:00
// Check terms have products inside - parents first. If products are found inside, subcats will be shown instead of products so we can return false.
2015-11-14 15:44:15 +00:00
if ( sizeof ( get_objects_in_term ( $has_children , $term -> taxonomy ) ) > 0 ) {
2014-02-26 11:43:33 +00:00
$products_will_display = false ;
2014-02-06 09:21:47 +00:00
} else {
// If we get here, the parents were empty so we're forced to check children
2016-02-18 20:16:19 +00:00
foreach ( $has_children as $term_id ) {
$children = get_term_children ( $term_id , $term -> taxonomy );
2014-02-06 09:21:47 +00:00
2015-11-14 15:44:15 +00:00
if ( sizeof ( get_objects_in_term ( $children , $term -> taxonomy ) ) > 0 ) {
2014-02-26 11:43:33 +00:00
$products_will_display = false ;
2014-02-06 09:21:47 +00:00
break ;
}
}
}
2012-10-14 12:06:37 +00:00
} else {
2014-02-06 09:21:47 +00:00
$products_will_display = true ;
2012-10-14 12:06:37 +00:00
}
}
2014-02-06 09:21:47 +00:00
2015-02-24 12:02:56 +00:00
set_transient ( $transient_name , $products_will_display , DAY_IN_SECONDS * 30 );
2014-02-06 09:21:47 +00:00
return $products_will_display ;
2012-10-14 12:06:37 +00:00
}
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_product_subcategories' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Display product sub categories as thumbnails .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2013-11-27 18:20:31 +00:00
* @ param array $args
2014-09-07 23:37:55 +00:00
* @ return null | boolean
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_product_subcategories ( $args = array () ) {
2013-09-12 13:41:02 +00:00
global $wp_query ;
2012-08-08 08:58:36 +00:00
2012-07-11 12:50:24 +00:00
$defaults = array (
2014-05-28 16:25:33 +00:00
'before' => '' ,
'after' => '' ,
2012-07-19 18:34:49 +00:00
'force_display' => false
2012-07-11 12:50:24 +00:00
);
2012-04-25 09:51:20 +00:00
2012-07-11 12:50:24 +00:00
$args = wp_parse_args ( $args , $defaults );
2012-08-08 08:58:36 +00:00
2012-07-11 14:13:06 +00:00
extract ( $args );
2012-08-08 08:58:36 +00:00
2012-07-19 18:34:49 +00:00
// Main query only
2014-05-28 16:25:33 +00:00
if ( ! is_main_query () && ! $force_display ) {
return ;
}
2012-08-08 08:58:36 +00:00
2012-10-14 12:06:37 +00:00
// Don't show when filtering, searching or when on page > 1 and ensure we're on a product archive
2014-05-28 16:25:33 +00:00
if ( is_search () || is_filtered () || is_paged () || ( ! is_product_category () && ! is_shop () ) ) {
return ;
}
2012-11-27 16:22:47 +00:00
2012-10-14 12:06:37 +00:00
// Check categories are enabled
2015-12-01 04:02:00 +00:00
if ( is_shop () && '' === get_option ( 'woocommerce_shop_page_display' ) ) {
2014-05-28 16:25:33 +00:00
return ;
}
2012-11-27 16:22:47 +00:00
2012-07-11 12:50:24 +00:00
// Find the category + category parent, if applicable
2012-10-14 12:06:37 +00:00
$term = get_queried_object ();
$parent_id = empty ( $term -> term_id ) ? 0 : $term -> term_id ;
2012-11-27 16:22:47 +00:00
2012-11-08 18:05:18 +00:00
if ( is_product_category () ) {
$display_type = get_woocommerce_term_meta ( $term -> term_id , 'display_type' , true );
2012-11-27 16:22:47 +00:00
2012-11-08 18:05:18 +00:00
switch ( $display_type ) {
case 'products' :
return ;
break ;
case '' :
2015-12-01 04:02:00 +00:00
if ( '' === get_option ( 'woocommerce_category_archive_display' ) ) {
2012-11-08 18:05:18 +00:00
return ;
2014-05-28 16:25:33 +00:00
}
2012-11-08 18:05:18 +00:00
break ;
}
}
2012-04-25 09:51:20 +00:00
// NOTE: using child_of instead of parent - this is not ideal but due to a WP bug ( http://core.trac.wordpress.org/ticket/15626 ) pad_counts won't work
2014-10-08 14:19:54 +00:00
$product_categories = get_categories ( apply_filters ( 'woocommerce_product_subcategories_args' , array (
2014-10-06 10:41:29 +00:00
'parent' => $parent_id ,
'menu_order' => 'ASC' ,
'hide_empty' => 0 ,
'hierarchical' => 1 ,
'taxonomy' => 'product_cat' ,
'pad_counts' => 1
2014-10-08 14:19:54 +00:00
) ) );
if ( ! apply_filters ( 'woocommerce_product_subcategories_hide_empty' , false ) ) {
$product_categories = wp_list_filter ( $product_categories , array ( 'count' => 0 ), 'NOT' );
}
2012-08-08 08:58:36 +00:00
2012-04-25 09:51:20 +00:00
if ( $product_categories ) {
2014-05-28 16:25:33 +00:00
echo $before ;
2012-08-08 08:58:36 +00:00
2012-07-11 12:50:24 +00:00
foreach ( $product_categories as $category ) {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'content-product_cat.php' , array (
2012-07-11 12:50:24 +00:00
'category' => $category
2012-04-25 09:51:20 +00:00
) );
}
2014-05-28 16:25:33 +00:00
// If we are hiding products disable the loop and pagination
2012-11-08 18:05:18 +00:00
if ( is_product_category () ) {
$display_type = get_woocommerce_term_meta ( $term -> term_id , 'display_type' , true );
2012-11-27 16:22:47 +00:00
2012-11-08 18:05:18 +00:00
switch ( $display_type ) {
case 'subcategories' :
2014-05-28 16:25:33 +00:00
$wp_query -> post_count = 0 ;
2012-11-08 18:05:18 +00:00
$wp_query -> max_num_pages = 0 ;
break ;
case '' :
2015-12-01 04:02:00 +00:00
if ( 'subcategories' === get_option ( 'woocommerce_category_archive_display' ) ) {
2014-05-28 16:25:33 +00:00
$wp_query -> post_count = 0 ;
2012-11-08 18:05:18 +00:00
$wp_query -> max_num_pages = 0 ;
}
break ;
}
}
2014-05-28 16:25:33 +00:00
2015-12-01 04:02:00 +00:00
if ( is_shop () && 'subcategories' === get_option ( 'woocommerce_shop_page_display' ) ) {
2014-05-28 16:25:33 +00:00
$wp_query -> post_count = 0 ;
2012-11-08 18:05:18 +00:00
$wp_query -> max_num_pages = 0 ;
}
2012-11-27 16:22:47 +00:00
2013-01-31 15:23:37 +00:00
echo $after ;
2014-06-03 10:04:06 +00:00
2015-05-19 16:49:34 +00:00
return true ;
}
2011-12-11 15:40:17 +00:00
}
2011-10-07 19:27:10 +00:00
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_subcategory_thumbnail' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Show subcategory thumbnails .
*
* @ param mixed $category
2012-08-15 18:15:06 +00:00
* @ subpackage Loop
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_subcategory_thumbnail ( $category ) {
2016-05-21 15:23:35 +00:00
$small_thumbnail_size = apply_filters ( 'subcategory_archive_thumbnail_size' , 'shop_catalog' );
2013-09-12 13:41:02 +00:00
$dimensions = wc_get_image_size ( $small_thumbnail_size );
2012-11-27 15:37:01 +00:00
$thumbnail_id = get_woocommerce_term_meta ( $category -> term_id , 'thumbnail_id' , true );
2012-04-25 09:51:20 +00:00
if ( $thumbnail_id ) {
$image = wp_get_attachment_image_src ( $thumbnail_id , $small_thumbnail_size );
2011-12-11 15:40:17 +00:00
$image = $image [ 0 ];
2012-04-25 09:51:20 +00:00
} else {
2013-11-25 13:56:59 +00:00
$image = wc_placeholder_img_src ();
2012-04-25 09:51:20 +00:00
}
2014-02-17 10:48:43 +00:00
if ( $image ) {
// Prevent esc_url from breaking spaces in urls for image embeds
// Ref: http://core.trac.wordpress.org/ticket/23605
$image = str_replace ( ' ' , '%20' , $image );
echo '<img src="' . esc_url ( $image ) . '" alt="' . esc_attr ( $category -> name ) . '" width="' . esc_attr ( $dimensions [ 'width' ] ) . '" height="' . esc_attr ( $dimensions [ 'height' ] ) . '" />' ;
}
2011-12-11 15:40:17 +00:00
}
2011-10-07 19:27:10 +00:00
}
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_order_details_table' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Displays order details in a table .
*
* @ param mixed $order_id
2012-08-15 18:15:06 +00:00
* @ subpackage Orders
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_order_details_table ( $order_id ) {
2012-04-25 09:51:20 +00:00
if ( ! $order_id ) return ;
2012-02-03 16:17:35 +00:00
2013-11-25 12:45:04 +00:00
wc_get_template ( 'order/order-details.php' , array (
2012-02-03 16:17:35 +00:00
'order_id' => $order_id
2012-04-25 09:51:20 +00:00
) );
}
2011-12-21 16:03:45 +00:00
}
2013-06-05 10:13:36 +00:00
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_order_again_button' ) ) {
2013-06-05 10:13:36 +00:00
/**
* Display an 'order again' button on the view order page .
*
* @ param object $order
* @ subpackage Orders
*/
2013-11-25 14:35:10 +00:00
function woocommerce_order_again_button ( $order ) {
2014-11-12 10:44:26 +00:00
if ( ! $order || ! $order -> has_status ( 'completed' ) || ! is_user_logged_in () ) {
2013-06-05 10:13:36 +00:00
return ;
2014-05-30 16:16:22 +00:00
}
2014-11-12 15:33:00 +00:00
wc_get_template ( 'order/order-again.php' , array (
'order' => $order
) );
2013-06-05 10:13:36 +00:00
}
}
2011-12-21 16:03:45 +00:00
/** Forms ****************************************************************/
2013-11-25 14:35:10 +00:00
if ( ! function_exists ( 'woocommerce_form_field' ) ) {
2012-08-14 15:30:23 +00:00
/**
* Outputs a checkout / address form field .
*
2012-08-15 18:15:06 +00:00
* @ subpackage Forms
2015-02-12 09:50:17 +00:00
* @ param string $key
2012-08-14 15:30:23 +00:00
* @ param mixed $args
2013-03-10 13:17:15 +00:00
* @ param string $value ( default : null )
2014-02-13 04:49:30 +00:00
* @ todo This function needs to be broken up in smaller pieces
2012-08-14 15:30:23 +00:00
*/
2013-11-25 14:35:10 +00:00
function woocommerce_form_field ( $key , $args , $value = null ) {
2011-12-21 16:03:45 +00:00
$defaults = array (
2012-12-10 14:50:49 +00:00
'type' => 'text' ,
'label' => '' ,
2014-02-14 23:19:49 +00:00
'description' => '' ,
2012-12-10 14:50:49 +00:00
'placeholder' => '' ,
'maxlength' => false ,
'required' => false ,
2015-12-24 19:54:34 +00:00
'autocomplete' => false ,
2014-09-10 09:39:31 +00:00
'id' => $key ,
2012-12-10 14:50:49 +00:00
'class' => array (),
'label_class' => array (),
2013-11-12 21:14:14 +00:00
'input_class' => array (),
2012-12-10 14:50:49 +00:00
'return' => false ,
'options' => array (),
'custom_attributes' => array (),
2013-03-03 14:51:25 +00:00
'validate' => array (),
2014-09-10 08:32:24 +00:00
'default' => '' ,
2011-12-21 16:03:45 +00:00
);
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
$args = wp_parse_args ( $args , $defaults );
2015-02-12 10:42:43 +00:00
$args = apply_filters ( 'woocommerce_form_field_args' , $args , $key , $value );
2012-04-25 09:51:20 +00:00
2012-12-10 14:50:49 +00:00
if ( $args [ 'required' ] ) {
$args [ 'class' ][] = 'validate-required' ;
$required = ' <abbr class="required" title="' . esc_attr__ ( 'required' , 'woocommerce' ) . '">*</abbr>' ;
} else {
$required = '' ;
}
2012-09-10 22:06:44 +00:00
$args [ 'maxlength' ] = ( $args [ 'maxlength' ] ) ? 'maxlength="' . absint ( $args [ 'maxlength' ] ) . '"' : '' ;
2012-11-27 16:22:47 +00:00
2015-12-24 19:54:34 +00:00
$args [ 'autocomplete' ] = ( $args [ 'autocomplete' ] ) ? 'autocomplete="' . esc_attr ( $args [ 'autocomplete' ] ) . '"' : '' ;
2014-12-01 12:13:41 +00:00
if ( is_string ( $args [ 'label_class' ] ) ) {
2013-08-13 16:26:21 +00:00
$args [ 'label_class' ] = array ( $args [ 'label_class' ] );
2014-12-01 12:13:41 +00:00
}
2013-08-13 16:26:21 +00:00
2014-12-01 12:13:41 +00:00
if ( is_null ( $value ) ) {
2013-03-10 13:17:15 +00:00
$value = $args [ 'default' ];
2014-12-01 12:13:41 +00:00
}
2013-03-03 14:51:25 +00:00
2012-11-19 15:05:23 +00:00
// Custom attribute handling
$custom_attributes = array ();
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
if ( ! empty ( $args [ 'custom_attributes' ] ) && is_array ( $args [ 'custom_attributes' ] ) ) {
foreach ( $args [ 'custom_attributes' ] as $attribute => $attribute_value ) {
2013-02-26 11:51:12 +00:00
$custom_attributes [] = esc_attr ( $attribute ) . '="' . esc_attr ( $attribute_value ) . '"' ;
2014-12-01 12:13:41 +00:00
}
}
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
if ( ! empty ( $args [ 'validate' ] ) ) {
foreach ( $args [ 'validate' ] as $validate ) {
2012-12-10 14:50:49 +00:00
$args [ 'class' ][] = 'validate-' . $validate ;
2014-12-01 12:13:41 +00:00
}
}
2012-12-10 14:50:49 +00:00
2015-07-03 19:37:47 +00:00
$field = '' ;
$label_id = $args [ 'id' ];
$field_container = '<p class="form-row %1$s" id="%2$s">%3$s</p>' ;
2012-04-25 09:51:20 +00:00
switch ( $args [ 'type' ] ) {
2014-12-01 12:13:41 +00:00
case 'country' :
2012-11-27 16:22:47 +00:00
2015-12-01 04:02:00 +00:00
$countries = 'shipping_country' === $key ? WC () -> countries -> get_shipping_countries () : WC () -> countries -> get_allowed_countries ();
2013-08-02 15:54:28 +00:00
2015-12-01 04:02:00 +00:00
if ( 1 === sizeof ( $countries ) ) {
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
$field .= '<strong>' . current ( array_values ( $countries ) ) . '</strong>' ;
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
$field .= '<input type="hidden" name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" value="' . current ( array_keys ( $countries ) ) . '" ' . implode ( ' ' , $custom_attributes ) . ' class="country_to_state" />' ;
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
} else {
2012-04-25 09:51:20 +00:00
2015-12-24 19:54:34 +00:00
$field = '<select name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" ' . $args [ 'autocomplete' ] . ' class="country_to_state country_select ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" ' . implode ( ' ' , $custom_attributes ) . '>'
2014-12-01 12:13:41 +00:00
. '<option value="">' . __ ( 'Select a country…' , 'woocommerce' ) . '</option>' ;
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
foreach ( $countries as $ckey => $cvalue ) {
2016-01-27 11:19:38 +00:00
$field .= '<option value="' . esc_attr ( $ckey ) . '" ' . selected ( $value , $ckey , false ) . '>' . __ ( $cvalue , 'woocommerce' ) . '</option>' ;
2014-12-01 12:13:41 +00:00
}
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
$field .= '</select>' ;
2012-11-27 16:22:47 +00:00
2015-08-05 19:17:52 +00:00
$field .= '<noscript><input type="submit" name="woocommerce_checkout_update_totals" value="' . esc_attr__ ( 'Update country' , 'woocommerce' ) . '" /></noscript>' ;
2012-11-27 16:22:47 +00:00
2014-12-01 12:13:41 +00:00
}
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'state' :
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
/* Get Country */
2015-12-01 04:02:00 +00:00
$country_key = 'billing_state' === $key ? 'billing_country' : 'shipping_country' ;
2014-12-01 12:13:41 +00:00
$current_cc = WC () -> checkout -> get_value ( $country_key );
$states = WC () -> countries -> get_states ( $current_cc );
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
if ( is_array ( $states ) && empty ( $states ) ) {
2012-08-08 08:58:36 +00:00
2015-07-03 19:37:47 +00:00
$field_container = '<p class="form-row %1$s" id="%2$s" style="display: none">%3$s</p>' ;
2013-01-03 12:34:31 +00:00
2014-12-01 12:13:41 +00:00
$field .= '<input type="hidden" class="hidden" name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" value="" ' . implode ( ' ' , $custom_attributes ) . ' placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" />' ;
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
} elseif ( is_array ( $states ) ) {
2012-08-08 08:58:36 +00:00
2015-12-24 19:54:34 +00:00
$field .= '<select name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" class="state_select ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" ' . implode ( ' ' , $custom_attributes ) . ' data-placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" ' . $args [ 'autocomplete' ] . ' >
2014-12-01 12:13:41 +00:00
< option value = " " > '.__( ' Select a state & hellip ; ', ' woocommerce ' ) .' </ option > ' ;
2012-08-08 08:58:36 +00:00
2014-12-01 12:13:41 +00:00
foreach ( $states as $ckey => $cvalue ) {
$field .= '<option value="' . esc_attr ( $ckey ) . '" ' . selected ( $value , $ckey , false ) . '>' . __ ( $cvalue , 'woocommerce' ) . '</option>' ;
}
2012-08-08 08:58:36 +00:00
2014-12-01 12:13:41 +00:00
$field .= '</select>' ;
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
} else {
2012-08-08 08:58:36 +00:00
2015-12-24 19:54:34 +00:00
$field .= '<input type="text" class="input-text ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" value="' . esc_attr ( $value ) . '" placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" ' . $args [ 'autocomplete' ] . ' name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" ' . implode ( ' ' , $custom_attributes ) . ' />' ;
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
}
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'textarea' :
2012-04-25 09:51:20 +00:00
2015-12-24 19:54:34 +00:00
$field .= '<textarea name="' . esc_attr ( $key ) . '" class="input-text ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" ' . $args [ 'maxlength' ] . ' ' . $args [ 'autocomplete' ] . ' ' . ( empty ( $args [ 'custom_attributes' ][ 'rows' ] ) ? ' rows="2"' : '' ) . ( empty ( $args [ 'custom_attributes' ][ 'cols' ] ) ? ' cols="5"' : '' ) . implode ( ' ' , $custom_attributes ) . '>' . esc_textarea ( $value ) . '</textarea>' ;
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'checkbox' :
2012-04-25 09:51:20 +00:00
2015-07-03 19:37:47 +00:00
$field = '<label class="checkbox ' . implode ( ' ' , $args [ 'label_class' ] ) . '" ' . implode ( ' ' , $custom_attributes ) . ' >
2015-02-10 15:41:34 +00:00
< input type = " ' . esc_attr( $args['type'] ) . ' " class = " input-checkbox ' . esc_attr( implode( ' ', $args['input_class'] ) ) .' " name = " ' . esc_attr( $key ) . ' " id = " ' . esc_attr( $args['id'] ) . ' " value = " 1 " '.checked( $value, 1, false ) .' /> '
2014-12-01 12:13:41 +00:00
. $args [ 'label' ] . $required . '</label>' ;
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'password' :
case 'text' :
2015-03-27 11:48:25 +00:00
case 'email' :
2015-04-01 16:36:58 +00:00
case 'tel' :
2015-12-07 16:28:10 +00:00
case 'number' :
2015-04-01 16:36:58 +00:00
2015-12-24 19:54:34 +00:00
$field .= '<input type="' . esc_attr ( $args [ 'type' ] ) . '" class="input-text ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" ' . $args [ 'maxlength' ] . ' ' . $args [ 'autocomplete' ] . ' value="' . esc_attr ( $value ) . '" ' . implode ( ' ' , $custom_attributes ) . ' />' ;
2015-04-01 16:36:58 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'select' :
2012-04-25 09:51:20 +00:00
2015-02-11 16:30:52 +00:00
$options = $field = '' ;
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
if ( ! empty ( $args [ 'options' ] ) ) {
2015-03-03 11:43:41 +00:00
foreach ( $args [ 'options' ] as $option_key => $option_text ) {
2015-12-01 04:02:00 +00:00
if ( '' === $option_key ) {
2015-03-03 11:43:41 +00:00
// If we have a blank option, select2 needs a placeholder
if ( empty ( $args [ 'placeholder' ] ) ) {
$args [ 'placeholder' ] = $option_text ? $option_text : __ ( 'Choose an option' , 'woocommerce' );
}
$custom_attributes [] = 'data-allow_clear="true"' ;
}
2014-12-01 12:13:41 +00:00
$options .= '<option value="' . esc_attr ( $option_key ) . '" ' . selected ( $value , $option_key , false ) . '>' . esc_attr ( $option_text ) . '</option>' ;
2015-03-03 11:43:41 +00:00
}
2012-04-25 09:51:20 +00:00
2015-12-24 19:54:34 +00:00
$field .= '<select name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '" class="select ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" ' . implode ( ' ' , $custom_attributes ) . ' data-placeholder="' . esc_attr ( $args [ 'placeholder' ] ) . '" ' . $args [ 'autocomplete' ] . ' >
2014-12-01 12:13:41 +00:00
' . $options . '
</ select > ' ;
}
2012-04-25 09:51:20 +00:00
2014-12-01 12:13:41 +00:00
break ;
case 'radio' :
2014-06-03 10:04:06 +00:00
2015-07-03 19:37:47 +00:00
$label_id = current ( array_keys ( $args [ 'options' ] ) );
2014-06-03 10:04:06 +00:00
2014-12-01 12:13:41 +00:00
if ( ! empty ( $args [ 'options' ] ) ) {
foreach ( $args [ 'options' ] as $option_key => $option_text ) {
2015-02-10 15:41:34 +00:00
$field .= '<input type="radio" class="input-radio ' . esc_attr ( implode ( ' ' , $args [ 'input_class' ] ) ) . '" value="' . esc_attr ( $option_key ) . '" name="' . esc_attr ( $key ) . '" id="' . esc_attr ( $args [ 'id' ] ) . '_' . esc_attr ( $option_key ) . '"' . checked ( $value , $option_key , false ) . ' />' ;
2014-12-01 12:13:41 +00:00
$field .= '<label for="' . esc_attr ( $args [ 'id' ] ) . '_' . esc_attr ( $option_key ) . '" class="radio ' . implode ( ' ' , $args [ 'label_class' ] ) . '">' . $option_text . '</label>' ;
}
2014-06-03 10:04:06 +00:00
}
2014-12-01 12:13:41 +00:00
break ;
2015-07-03 19:37:47 +00:00
}
2012-04-25 09:51:20 +00:00
2015-07-03 19:37:47 +00:00
if ( ! empty ( $field ) ) {
$field_html = '' ;
2012-04-25 09:51:20 +00:00
2015-07-03 19:37:47 +00:00
if ( $args [ 'label' ] && 'checkbox' != $args [ 'type' ] ) {
$field_html .= '<label for="' . esc_attr ( $label_id ) . '" class="' . esc_attr ( implode ( ' ' , $args [ 'label_class' ] ) ) . '">' . $args [ 'label' ] . $required . '</label>' ;
}
$field_html .= $field ;
if ( $args [ 'description' ] ) {
2015-09-07 12:26:41 +00:00
$field_html .= '<span class="description">' . esc_html ( $args [ 'description' ] ) . '</span>' ;
2015-07-03 19:37:47 +00:00
}
$container_class = 'form-row ' . esc_attr ( implode ( ' ' , $args [ 'class' ] ) );
$container_id = esc_attr ( $args [ 'id' ] ) . '_field' ;
$after = ! empty ( $args [ 'clear' ] ) ? '<div class="clear"></div>' : '' ;
$field = sprintf ( $field_container , $container_class , $container_id , $field_html ) . $after ;
2012-04-25 09:51:20 +00:00
}
2012-02-15 17:57:12 +00:00
2015-02-12 09:54:29 +00:00
$field = apply_filters ( 'woocommerce_form_field_' . $args [ 'type' ], $field , $key , $args , $value );
2014-12-01 12:13:41 +00:00
if ( $args [ 'return' ] ) {
return $field ;
} else {
echo $field ;
}
2011-12-21 16:03:45 +00:00
}
2012-03-12 17:23:04 +00:00
}
2012-04-16 13:32:58 +00:00
2012-08-14 15:30:23 +00:00
if ( ! function_exists ( 'get_product_search_form' ) ) {
/**
2014-10-13 13:42:07 +00:00
* Display product search form .
2014-10-10 11:48:02 +00:00
*
2015-11-03 13:31:20 +00:00
* Will first attempt to locate the product - searchform . php file in either the child or .
* the parent , then load it . If it doesn ' t exist , then the default search form .
2014-10-10 11:48:02 +00:00
* will be displayed .
*
* The default searchform uses html5 .
2012-08-14 15:30:23 +00:00
*
2012-08-15 18:15:06 +00:00
* @ subpackage Forms
2012-08-14 15:30:23 +00:00
* @ param bool $echo ( default : true )
2013-11-29 18:50:31 +00:00
* @ return string
2012-08-14 15:30:23 +00:00
*/
function get_product_search_form ( $echo = true ) {
2014-10-10 11:48:02 +00:00
ob_start ();
2012-08-14 15:30:23 +00:00
2014-10-10 11:48:02 +00:00
do_action ( 'pre_get_product_search_form' );
2012-04-16 13:32:58 +00:00
2014-10-10 11:48:02 +00:00
wc_get_template ( 'product-searchform.php' );
$form = apply_filters ( 'get_product_search_form' , ob_get_clean () );
if ( $echo ) {
echo $form ;
} else {
return $form ;
}
2012-04-16 13:32:58 +00:00
}
2013-02-06 23:57:57 +00:00
}
2015-04-22 15:27:12 +00:00
if ( ! function_exists ( 'woocommerce_output_auth_header' ) ) {
/**
* Output the Auth header .
*/
function woocommerce_output_auth_header () {
wc_get_template ( 'auth/header.php' );
}
}
if ( ! function_exists ( 'woocommerce_output_auth_footer' ) ) {
/**
* Output the Auth footer .
*/
function woocommerce_output_auth_footer () {
wc_get_template ( 'auth/footer.php' );
}
}
2015-07-27 15:42:22 +00:00
2015-07-28 09:32:28 +00:00
if ( ! function_exists ( 'woocommerce_single_variation' ) ) {
/**
* Output placeholders for the single variation .
*/
function woocommerce_single_variation () {
2015-12-04 13:26:44 +00:00
echo '<div class="woocommerce-variation single_variation"></div>' ;
2015-07-28 09:32:28 +00:00
}
}
if ( ! function_exists ( 'woocommerce_single_variation_add_to_cart_button' ) ) {
/**
* Output the add to cart button for variations .
*/
function woocommerce_single_variation_add_to_cart_button () {
2015-10-28 13:09:34 +00:00
wc_get_template ( 'single-product/add-to-cart/variation-add-to-cart-button.php' );
2015-07-28 09:32:28 +00:00
}
}
2015-07-27 15:42:22 +00:00
if ( ! function_exists ( 'wc_dropdown_variation_attribute_options' ) ) {
/**
* Output a list of variation attributes for use in the cart forms .
*
* @ param array $args
* @ since 2.4 . 0
*/
function wc_dropdown_variation_attribute_options ( $args = array () ) {
2015-09-02 11:39:23 +00:00
$args = wp_parse_args ( apply_filters ( 'woocommerce_dropdown_variation_attribute_options_args' , $args ), array (
2015-07-27 15:42:22 +00:00
'options' => false ,
'attribute' => false ,
'product' => false ,
'selected' => false ,
'name' => '' ,
'id' => '' ,
2015-08-11 11:17:52 +00:00
'class' => '' ,
2015-07-27 15:42:22 +00:00
'show_option_none' => __ ( 'Choose an option' , 'woocommerce' )
) );
2015-07-27 16:48:28 +00:00
$options = $args [ 'options' ];
$product = $args [ 'product' ];
$attribute = $args [ 'attribute' ];
$name = $args [ 'name' ] ? $args [ 'name' ] : 'attribute_' . sanitize_title ( $attribute );
$id = $args [ 'id' ] ? $args [ 'id' ] : sanitize_title ( $attribute );
2015-08-11 11:17:52 +00:00
$class = $args [ 'class' ];
2015-07-27 15:42:22 +00:00
if ( empty ( $options ) && ! empty ( $product ) && ! empty ( $attribute ) ) {
$attributes = $product -> get_variation_attributes ();
$options = $attributes [ $attribute ];
}
2016-01-04 15:31:43 +00:00
$html = '<select id="' . esc_attr ( $id ) . '" class="' . esc_attr ( $class ) . '" name="' . esc_attr ( $name ) . '" data-attribute_name="attribute_' . esc_attr ( sanitize_title ( $attribute ) ) . '">' ;
2015-07-27 15:42:22 +00:00
2015-07-27 16:48:28 +00:00
if ( $args [ 'show_option_none' ] ) {
2016-01-04 15:31:43 +00:00
$html .= '<option value="">' . esc_html ( $args [ 'show_option_none' ] ) . '</option>' ;
2015-07-27 15:42:22 +00:00
}
if ( ! empty ( $options ) ) {
if ( $product && taxonomy_exists ( $attribute ) ) {
// Get terms if this is a taxonomy - ordered. We need the names too.
$terms = wc_get_product_terms ( $product -> id , $attribute , array ( 'fields' => 'all' ) );
foreach ( $terms as $term ) {
if ( in_array ( $term -> slug , $options ) ) {
2016-01-04 15:31:43 +00:00
$html .= '<option value="' . esc_attr ( $term -> slug ) . '" ' . selected ( sanitize_title ( $args [ 'selected' ] ), $term -> slug , false ) . '>' . esc_html ( apply_filters ( 'woocommerce_variation_option_name' , $term -> name ) ) . '</option>' ;
2015-07-27 15:42:22 +00:00
}
}
} else {
foreach ( $options as $option ) {
// This handles < 2.4.0 bw compatibility where text attributes were not sanitized.
2015-07-27 16:48:28 +00:00
$selected = sanitize_title ( $args [ 'selected' ] ) === $args [ 'selected' ] ? selected ( $args [ 'selected' ], sanitize_title ( $option ), false ) : selected ( $args [ 'selected' ], $option , false );
2016-01-04 15:31:43 +00:00
$html .= '<option value="' . esc_attr ( $option ) . '" ' . $selected . '>' . esc_html ( apply_filters ( 'woocommerce_variation_option_name' , $option ) ) . '</option>' ;
2015-07-27 15:42:22 +00:00
}
}
}
2015-07-27 15:50:55 +00:00
2016-01-04 15:31:43 +00:00
$html .= '</select>' ;
2016-01-23 20:03:47 +00:00
echo apply_filters ( 'woocommerce_dropdown_variation_attribute_options_html' , $html , $args );
2015-07-27 15:42:22 +00:00
}
2016-01-14 20:35:31 +00:00
}
2016-01-19 21:02:26 +00:00
if ( ! function_exists ( 'woocommerce_account_orders' ) ) {
/**
* My Account > Orders template .
2016-01-20 15:46:59 +00:00
*
* @ param int $current_page Current page number .
2016-01-19 21:02:26 +00:00
*/
2016-01-20 15:46:59 +00:00
function woocommerce_account_orders ( $current_page ) {
2016-03-09 13:25:36 +00:00
$current_page = empty ( $current_page ) ? 1 : absint ( $current_page );
2016-03-09 16:11:05 +00:00
$customer_orders = wc_get_orders ( apply_filters ( 'woocommerce_my_account_my_orders_query' , array ( 'customer' => get_current_user_id (), 'page' => $current_page , 'paginate' => true ) ) );
2016-01-20 15:46:59 +00:00
2016-04-11 21:03:09 +00:00
wc_get_template (
'myaccount/orders.php' ,
array (
'current_page' => absint ( $current_page ),
'customer_orders' => $customer_orders ,
'has_orders' => 0 < $customer_orders -> total ,
)
);
2016-01-19 21:02:26 +00:00
}
}
2016-01-14 20:35:31 +00:00
if ( ! function_exists ( 'woocommerce_account_view_order' ) ) {
/**
2016-01-19 21:02:26 +00:00
* My Account > View order template .
2016-01-14 20:35:31 +00:00
*
* @ param int $order_id Order ID .
*/
function woocommerce_account_view_order ( $order_id ) {
WC_Shortcode_My_Account :: view_order ( absint ( $order_id ) );
}
}
2016-01-19 21:02:26 +00:00
if ( ! function_exists ( 'woocommerce_account_downloads' ) ) {
/**
* My Account > Downloads template .
*/
function woocommerce_account_downloads () {
wc_get_template ( 'myaccount/downloads.php' );
}
}
2016-01-14 20:35:31 +00:00
if ( ! function_exists ( 'woocommerce_account_edit_address' ) ) {
/**
2016-01-19 21:02:26 +00:00
* My Account > Edit address template .
2016-01-14 20:35:31 +00:00
*
* @ param string $type Address type .
*/
function woocommerce_account_edit_address ( $type ) {
$type = wc_edit_address_i18n ( sanitize_title ( $type ), true );
WC_Shortcode_My_Account :: edit_address ( $type );
}
}
2016-01-20 20:13:17 +00:00
if ( ! function_exists ( 'woocommerce_account_payment_methods' ) ) {
/**
* My Account > Downloads template .
*/
function woocommerce_account_payment_methods () {
wc_get_template ( 'myaccount/payment-methods.php' );
}
}
2016-01-14 20:35:31 +00:00
if ( ! function_exists ( 'woocommerce_account_add_payment_method' ) ) {
/**
2016-01-19 21:02:26 +00:00
* My Account > Add payment method template .
2016-01-14 20:35:31 +00:00
*/
function woocommerce_account_add_payment_method () {
WC_Shortcode_My_Account :: add_payment_method ();
}
2015-07-27 15:42:22 +00:00
}
2016-01-20 20:13:17 +00:00
if ( ! function_exists ( 'woocommerce_account_edit_account' ) ) {
/**
* My Account > Edit account template .
*/
function woocommerce_account_edit_account () {
WC_Shortcode_My_Account :: edit_account ();
}
}