2012-12-31 18:25:09 +00:00
< ? php
/**
* WC_Shortcodes class .
*
* @ class WC_Shortcodes
2013-10-23 11:55:40 +00:00
* @ version 2.1 . 0
2012-12-31 18:25:09 +00:00
* @ package WooCommerce / Classes
2013-02-20 17:14:46 +00:00
* @ category Class
2012-12-31 18:25:09 +00:00
* @ author WooThemes
*/
class WC_Shortcodes {
2013-10-23 11:55:40 +00:00
/**
* Init shortcodes
*/
2013-11-01 21:15:52 +00:00
public static function init () {
2013-10-23 13:55:18 +00:00
// Define shortcodes
$shortcodes = array (
'product' => __CLASS__ . '::product' ,
'product_page' => __CLASS__ . '::product_page' ,
'product_category' => __CLASS__ . '::product_category' ,
'product_categories' => __CLASS__ . '::product_categories' ,
'add_to_cart' => __CLASS__ . '::product_add_to_cart' ,
'add_to_cart_url' => __CLASS__ . '::product_add_to_cart_url' ,
'products' => __CLASS__ . '::products' ,
'recent_products' => __CLASS__ . '::recent_products' ,
'sale_products' => __CLASS__ . '::sale_products' ,
'best_selling_products' => __CLASS__ . '::best_selling_products' ,
'top_rated_products' => __CLASS__ . '::top_rated_products' ,
'featured_products' => __CLASS__ . '::featured_products' ,
'product_attribute' => __CLASS__ . '::product_attribute' ,
'related_products' => __CLASS__ . '::related_products' ,
'shop_messages' => __CLASS__ . '::shop_messages' ,
'woocommerce_order_tracking' => __CLASS__ . '::order_tracking' ,
'woocommerce_cart' => __CLASS__ . '::cart' ,
'woocommerce_checkout' => __CLASS__ . '::checkout' ,
'woocommerce_my_account' => __CLASS__ . '::my_account' ,
);
2013-12-29 13:54:55 +00:00
foreach ( $shortcodes as $shortcode => $function ) {
2013-10-23 13:55:18 +00:00
add_shortcode ( apply_filters ( " { $shortcode } _shortcode_tag " , $shortcode ), $function );
2013-12-29 13:54:55 +00:00
}
2013-10-23 13:55:18 +00:00
// Alias for pre 2.1 compatibility
add_shortcode ( 'woocommerce_messages' , __CLASS__ . '::shop_messages' );
2012-12-31 18:25:09 +00:00
}
2013-08-09 16:11:15 +00:00
/**
* Shortcode Wrapper
*
* @ param mixed $function
* @ param array $atts ( default : array ())
* @ return string
*/
public static function shortcode_wrapper (
$function ,
2013-12-29 13:54:55 +00:00
$atts = array (),
2013-08-09 16:11:15 +00:00
$wrapper = array (
2013-12-29 13:54:55 +00:00
'class' => 'woocommerce' ,
2013-08-09 16:11:15 +00:00
'before' => null ,
2013-12-29 13:54:55 +00:00
'after' => null
2013-08-09 16:11:15 +00:00
)
2013-10-23 11:55:40 +00:00
) {
2013-08-09 16:11:15 +00:00
ob_start ();
2013-11-20 19:11:59 +00:00
$before = empty ( $wrapper [ 'before' ] ) ? '<div class="' . esc_attr ( $wrapper [ 'class' ] ) . '">' : $wrapper [ 'before' ];
2013-08-09 16:11:15 +00:00
$after = empty ( $wrapper [ 'after' ] ) ? '</div>' : $wrapper [ 'after' ];
echo $before ;
call_user_func ( $function , $atts );
echo $after ;
return ob_get_clean ();
}
2012-12-31 18:25:09 +00:00
/**
* Cart page shortcode .
*
* @ access public
* @ param mixed $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function cart ( $atts ) {
return self :: shortcode_wrapper ( array ( 'WC_Shortcode_Cart' , 'output' ), $atts );
2012-12-31 18:25:09 +00:00
}
/**
* Checkout page shortcode .
*
* @ access public
* @ param mixed $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function checkout ( $atts ) {
return self :: shortcode_wrapper ( array ( 'WC_Shortcode_Checkout' , 'output' ), $atts );
2012-12-31 18:25:09 +00:00
}
/**
* Order tracking page shortcode .
*
* @ access public
* @ param mixed $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function order_tracking ( $atts ) {
return self :: shortcode_wrapper ( array ( 'WC_Shortcode_Order_Tracking' , 'output' ), $atts );
2012-12-31 18:25:09 +00:00
}
/**
* Cart shortcode .
*
* @ access public
* @ param mixed $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function my_account ( $atts ) {
return self :: shortcode_wrapper ( array ( 'WC_Shortcode_My_Account' , 'output' ), $atts );
2012-12-31 18:25:09 +00:00
}
/**
* List products in a category shortcode
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-12-29 13:54:55 +00:00
public static function product_category ( $atts ) {
2013-08-09 16:11:15 +00:00
global $woocommerce_loop ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( empty ( $atts ) ) return '' ;
2012-12-31 18:25:09 +00:00
extract ( shortcode_atts ( array (
'per_page' => '12' ,
'columns' => '4' ,
2013-12-29 13:41:48 +00:00
'orderby' => 'title' ,
'order' => 'desc' ,
'category' => '' ,
'operator' => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
2012-12-31 18:25:09 +00:00
), $atts ) );
2013-11-29 09:15:58 +00:00
if ( ! $category ) return '' ;
2012-12-31 18:25:09 +00:00
// Default ordering args
2013-08-09 16:11:15 +00:00
$ordering_args = WC () -> query -> get_catalog_ordering_args ( $orderby , $order );
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
$args = array (
2012-12-31 18:25:09 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
'ignore_sticky_posts' => 1 ,
'orderby' => $ordering_args [ 'orderby' ],
'order' => $ordering_args [ 'order' ],
'posts_per_page' => $per_page ,
'meta_query' => array (
array (
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
)
),
'tax_query' => array (
2013-12-29 13:41:48 +00:00
array (
'taxonomy' => 'product_cat' ,
2013-07-30 14:03:39 +00:00
'terms' => array ( esc_attr ( $category ) ),
2012-12-31 18:25:09 +00:00
'field' => 'slug' ,
2013-07-30 14:03:39 +00:00
'operator' => $operator
2012-12-31 18:25:09 +00:00
)
2013-12-29 13:41:48 +00:00
)
2012-12-31 18:25:09 +00:00
);
if ( isset ( $ordering_args [ 'meta_key' ] ) ) {
2013-12-29 13:41:48 +00:00
$args [ 'meta_key' ] = $ordering_args [ 'meta_key' ];
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* List all ( or limited ) product categories
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function product_categories ( $atts ) {
2012-12-31 18:25:09 +00:00
global $woocommerce_loop ;
2013-12-29 13:54:55 +00:00
extract ( shortcode_atts ( array (
2012-12-31 18:25:09 +00:00
'number' => null ,
'orderby' => 'name' ,
'order' => 'ASC' ,
'columns' => '4' ,
'hide_empty' => 1 ,
'parent' => ''
2013-12-29 13:54:55 +00:00
), $atts ) );
2012-12-31 18:25:09 +00:00
if ( isset ( $atts [ 'ids' ] ) ) {
$ids = explode ( ',' , $atts [ 'ids' ] );
2013-12-29 13:41:48 +00:00
$ids = array_map ( 'trim' , $ids );
2012-12-31 18:25:09 +00:00
} else {
$ids = array ();
}
$hide_empty = ( $hide_empty == true || $hide_empty == 1 ) ? 1 : 0 ;
2013-02-08 16:30:39 +00:00
// get terms and workaround WP bug with parents/pad counts
2013-12-29 13:41:48 +00:00
$args = array (
'orderby' => $orderby ,
'order' => $order ,
'hide_empty' => $hide_empty ,
2012-12-31 18:25:09 +00:00
'include' => $ids ,
2013-02-08 16:30:39 +00:00
'pad_counts' => true ,
'child_of' => $parent
2012-12-31 18:25:09 +00:00
);
2013-12-29 13:41:48 +00:00
$product_categories = get_terms ( 'product_cat' , $args );
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
if ( $parent !== " " ) {
2013-12-29 13:41:48 +00:00
$product_categories = wp_list_filter ( $product_categories , array ( 'parent' => $parent ) );
2013-12-29 13:54:55 +00:00
}
2013-02-08 16:30:39 +00:00
2013-12-29 13:54:55 +00:00
if ( $number ) {
2013-12-29 13:41:48 +00:00
$product_categories = array_slice ( $product_categories , 0 , $number );
2013-12-29 13:54:55 +00:00
}
2013-02-08 16:30:39 +00:00
2013-12-29 13:41:48 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
// Reset loop/columns globals when starting a new loop
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'loop' ] = $woocommerce_loop [ 'column' ] = '' ;
2013-12-29 13:41:48 +00:00
if ( $product_categories ) {
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
woocommerce_product_loop_start ();
2012-12-31 18:25:09 +00:00
foreach ( $product_categories as $category ) {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'content-product_cat.php' , array (
2012-12-31 18:25:09 +00:00
'category' => $category
) );
}
2013-11-25 14:16:26 +00:00
woocommerce_product_loop_end ();
2012-12-31 18:25:09 +00:00
}
2013-11-25 14:16:26 +00:00
woocommerce_reset_loop ();
2012-12-31 18:25:09 +00:00
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* Recent Products shortcode
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function recent_products ( $atts ) {
2013-08-09 16:11:15 +00:00
global $woocommerce_loop ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
extract ( shortcode_atts ( array (
2012-12-31 18:25:09 +00:00
'per_page' => '12' ,
'columns' => '4' ,
2013-12-29 13:54:55 +00:00
'orderby' => 'date' ,
'order' => 'desc'
), $atts ) );
2012-12-31 18:25:09 +00:00
2013-08-09 16:11:15 +00:00
$meta_query = WC () -> query -> get_meta_query ();
2013-01-10 16:02:04 +00:00
2012-12-31 18:25:09 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
2012-12-31 18:25:09 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'posts_per_page' => $per_page ,
'orderby' => $orderby ,
'order' => $order ,
'meta_query' => $meta_query
2012-12-31 18:25:09 +00:00
);
ob_start ();
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* List multiple products shortcode
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function products ( $atts ) {
2012-12-31 18:25:09 +00:00
global $woocommerce_loop ;
2013-12-29 13:54:55 +00:00
if ( empty ( $atts ) ) return '' ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
extract ( shortcode_atts ( array (
2012-12-31 18:25:09 +00:00
'columns' => '4' ,
2013-12-29 13:41:48 +00:00
'orderby' => 'title' ,
'order' => 'asc'
2013-12-29 13:54:55 +00:00
), $atts ) );
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
2012-12-31 18:25:09 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'orderby' => $orderby ,
'order' => $order ,
'posts_per_page' => - 1 ,
'meta_query' => array (
2012-12-31 18:25:09 +00:00
array (
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
)
)
);
2013-12-29 13:54:55 +00:00
if ( isset ( $atts [ 'skus' ] ) ) {
$skus = explode ( ',' , $atts [ 'skus' ] );
$skus = array_map ( 'trim' , $skus );
2013-12-29 13:41:48 +00:00
$args [ 'meta_query' ][] = array (
'key' => '_sku' ,
'value' => $skus ,
'compare' => 'IN'
);
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
if ( isset ( $atts [ 'ids' ] ) ) {
$ids = explode ( ',' , $atts [ 'ids' ] );
$ids = array_map ( 'trim' , $ids );
2013-12-29 13:41:48 +00:00
$args [ 'post__in' ] = $ids ;
2012-12-31 18:25:09 +00:00
}
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
2013-03-03 17:07:31 +00:00
* Display a single product
2012-12-31 18:25:09 +00:00
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function product ( $atts ) {
2013-12-29 13:54:55 +00:00
if ( empty ( $atts ) ) return '' ;
2013-12-29 13:41:48 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'posts_per_page' => 1 ,
'no_found_rows' => 1 ,
'post_status' => 'publish' ,
'meta_query' => array (
2012-12-31 18:25:09 +00:00
array (
2013-12-29 13:54:55 +00:00
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
2012-12-31 18:25:09 +00:00
)
)
2013-12-29 13:41:48 +00:00
);
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
if ( isset ( $atts [ 'sku' ] ) ) {
2013-12-29 13:41:48 +00:00
$args [ 'meta_query' ][] = array (
2013-12-29 13:54:55 +00:00
'key' => '_sku' ,
'value' => $atts [ 'sku' ],
'compare' => '='
2013-12-29 13:41:48 +00:00
);
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
if ( isset ( $atts [ 'id' ] ) ) {
2013-12-29 13:41:48 +00:00
$args [ 'p' ] = $atts [ 'id' ];
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-01-29 13:01:09 +00:00
return '<div class="woocommerce">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
2013-03-03 17:07:31 +00:00
* Display a single product price + cart button
2012-12-31 18:25:09 +00:00
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function product_add_to_cart ( $atts ) {
2013-12-29 13:41:48 +00:00
global $wpdb , $post ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( empty ( $atts ) ) return '' ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
extract ( shortcode_atts ( array (
2013-11-18 14:37:27 +00:00
'id' => '' ,
'sku' => '' ,
'style' => 'border:4px solid #ccc; padding: 12px;' ,
'show_price' => 'true'
), $atts ) );
2013-12-29 13:41:48 +00:00
if ( ! empty ( $id ) ) {
$product_data = get_post ( $id );
2013-11-18 14:37:27 +00:00
} elseif ( ! empty ( $sku ) ) {
$product_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1 " , $sku ) );
2012-12-31 18:25:09 +00:00
$product_data = get_post ( $product_id );
} else {
2013-11-29 09:15:58 +00:00
return '' ;
2012-12-31 18:25:09 +00:00
}
2013-09-25 11:35:06 +00:00
$product = wc_setup_product_data ( $product_data );
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
if ( ! $product ) {
2013-11-29 09:15:58 +00:00
return '' ;
2013-12-29 13:54:55 +00:00
}
2013-11-27 16:03:54 +00:00
2013-09-25 11:35:06 +00:00
ob_start ();
?>
2013-11-18 14:37:27 +00:00
< p class = " product woocommerce " style = " <?php echo $style ; ?> " >
2012-12-31 18:25:09 +00:00
2013-11-18 14:37:27 +00:00
< ? php if ( $show_price == 'true' ) : ?>
< ? php echo $product -> get_price_html (); ?>
< ? php endif ; ?>
2012-12-31 18:25:09 +00:00
2013-11-25 14:16:26 +00:00
< ? php woocommerce_template_loop_add_to_cart (); ?>
2012-12-31 18:25:09 +00:00
2013-09-25 11:35:06 +00:00
</ p >< ? php
2013-02-20 18:10:03 +00:00
2013-09-26 14:11:28 +00:00
// Restore Product global in case this is shown inside a product post
wc_setup_product_data ( $post );
2012-12-31 18:25:09 +00:00
2013-09-25 11:35:06 +00:00
return ob_get_clean ();
2012-12-31 18:25:09 +00:00
}
/**
* Get the add to cart URL for a product
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function product_add_to_cart_url ( $atts ) {
2013-12-29 13:41:48 +00:00
global $wpdb ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( empty ( $atts ) ) return '' ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( isset ( $atts [ 'id' ] ) ) {
$product_data = get_post ( $atts [ 'id' ] );
2012-12-31 18:25:09 +00:00
} elseif ( isset ( $atts [ 'sku' ] ) ) {
$product_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1 " , $atts [ 'sku' ] ) );
$product_data = get_post ( $product_id );
} else {
2013-11-29 09:15:58 +00:00
return '' ;
2012-12-31 18:25:09 +00:00
}
2013-12-29 13:54:55 +00:00
if ( 'product' !== $product_data -> post_type ) {
2013-11-29 09:15:58 +00:00
return '' ;
2013-12-29 13:54:55 +00:00
}
2012-12-31 18:25:09 +00:00
$_product = get_product ( $product_data );
return esc_url ( $_product -> add_to_cart_url () );
}
/**
* List all products on sale
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-12-29 13:54:55 +00:00
public static function sale_products ( $atts ) {
2013-12-29 13:41:48 +00:00
global $woocommerce_loop ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
extract ( shortcode_atts ( array (
'per_page' => '12' ,
'columns' => '4' ,
'orderby' => 'title' ,
'order' => 'asc'
2013-12-29 13:54:55 +00:00
), $atts ) );
2012-12-31 18:25:09 +00:00
// Get products on sale
2013-11-25 13:56:59 +00:00
$product_ids_on_sale = wc_get_product_ids_on_sale ();
2012-12-31 18:25:09 +00:00
2013-12-29 13:54:55 +00:00
$meta_query = array ();
2013-08-09 16:11:15 +00:00
$meta_query [] = WC () -> query -> visibility_meta_query ();
2013-12-29 13:41:48 +00:00
$meta_query [] = WC () -> query -> stock_status_meta_query ();
$meta_query = array_filter ( $meta_query );
2012-12-31 18:25:09 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'posts_per_page' => $per_page ,
'orderby' => $orderby ,
'order' => $order ,
'no_found_rows' => 1 ,
'post_status' => 'publish' ,
'post_type' => 'product' ,
'meta_query' => $meta_query ,
'post__in' => array_merge ( array ( 0 ), $product_ids_on_sale )
2012-12-31 18:25:09 +00:00
);
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* List best selling products on sale
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-12-29 13:54:55 +00:00
public static function best_selling_products ( $atts ) {
2013-12-29 13:41:48 +00:00
global $woocommerce_loop ;
extract ( shortcode_atts ( array (
'per_page' => '12' ,
'columns' => '4'
2013-12-29 13:54:55 +00:00
), $atts ) );
2013-12-29 13:41:48 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
2013-12-29 13:41:48 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'posts_per_page' => $per_page ,
'meta_key' => 'total_sales' ,
'orderby' => 'meta_value_num' ,
'meta_query' => array (
2013-12-29 13:41:48 +00:00
array (
2013-12-29 13:54:55 +00:00
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
2013-12-29 13:41:48 +00:00
)
)
);
ob_start ();
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* List top rated products on sale
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-12-29 13:54:55 +00:00
public static function top_rated_products ( $atts ) {
2013-12-29 13:41:48 +00:00
global $woocommerce_loop ;
extract ( shortcode_atts ( array (
'per_page' => '12' ,
'columns' => '4' ,
'orderby' => 'title' ,
'order' => 'asc'
), $atts ) );
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
2013-12-29 13:41:48 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'orderby' => $orderby ,
'order' => $order ,
'posts_per_page' => $per_page ,
'meta_query' => array (
2013-12-29 13:41:48 +00:00
array (
2013-12-29 13:54:55 +00:00
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
2013-12-29 13:41:48 +00:00
)
)
);
ob_start ();
add_filter ( 'posts_clauses' , array ( __CLASS__ , 'order_by_rating_post_clauses' ) );
2012-12-31 18:25:09 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
2013-12-29 13:40:43 +00:00
remove_filter ( 'posts_clauses' , array ( __CLASS__ , 'order_by_rating_post_clauses' ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* Output featured products
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function featured_products ( $atts ) {
2012-12-31 18:25:09 +00:00
global $woocommerce_loop ;
2013-12-29 13:54:55 +00:00
extract ( shortcode_atts ( array (
2012-12-31 18:25:09 +00:00
'per_page' => '12' ,
'columns' => '4' ,
2013-12-29 13:54:55 +00:00
'orderby' => 'date' ,
'order' => 'desc'
), $atts ) );
2012-12-31 18:25:09 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'post_type' => 'product' ,
'post_status' => 'publish' ,
2012-12-31 18:25:09 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'posts_per_page' => $per_page ,
'orderby' => $orderby ,
'order' => $order ,
'meta_query' => array (
2012-12-31 18:25:09 +00:00
array (
2013-12-29 13:54:55 +00:00
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
2012-12-31 18:25:09 +00:00
),
array (
2013-12-29 13:54:55 +00:00
'key' => '_featured' ,
'value' => 'yes'
2012-12-31 18:25:09 +00:00
)
)
);
ob_start ();
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2012-12-31 18:25:09 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2012-12-31 18:25:09 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2012-12-31 18:25:09 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2012-12-31 18:25:09 +00:00
< ? php endif ;
wp_reset_postdata ();
2013-08-19 14:12:17 +00:00
return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* Show a single product page
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 13:55:18 +00:00
public static function product_page ( $atts ) {
2013-12-29 13:41:48 +00:00
if ( empty ( $atts ) ) return '' ;
2012-12-31 18:25:09 +00:00
2013-11-29 09:15:58 +00:00
if ( ! isset ( $atts [ 'id' ] ) && ! isset ( $atts [ 'sku' ] ) ) return '' ;
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
$args = array (
2013-12-29 13:54:55 +00:00
'posts_per_page' => 1 ,
'post_type' => 'product' ,
'post_status' => 'publish' ,
2013-12-29 13:41:48 +00:00
'ignore_sticky_posts' => 1 ,
2013-12-29 13:54:55 +00:00
'no_found_rows' => 1
2013-12-29 13:41:48 +00:00
);
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( isset ( $atts [ 'sku' ] ) ) {
$args [ 'meta_query' ][] = array (
'key' => '_sku' ,
'value' => $atts [ 'sku' ],
'compare' => '='
);
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
if ( isset ( $atts [ 'id' ] ) ) {
$args [ 'p' ] = $atts [ 'id' ];
}
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
$single_product = new WP_Query ( $args );
2012-12-31 18:25:09 +00:00
2013-12-29 13:41:48 +00:00
ob_start ();
2012-12-31 18:25:09 +00:00
while ( $single_product -> have_posts () ) : $single_product -> the_post (); wp_enqueue_script ( 'wc-single-product' ); ?>
< div class = " single-product " >
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'single-product' ); ?>
2012-12-31 18:25:09 +00:00
</ div >
< ? php endwhile ; // end of the loop.
wp_reset_postdata ();
2013-01-29 13:01:09 +00:00
return '<div class="woocommerce">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* Show messages
*
* @ access public
* @ return string
*/
2013-10-23 13:55:18 +00:00
public static function shop_messages () {
2012-12-31 18:25:09 +00:00
ob_start ();
2013-11-13 04:34:55 +00:00
wc_print_notices ();
2012-12-31 18:25:09 +00:00
2013-10-17 14:29:49 +00:00
return '<div class="woocommerce">' . ob_get_clean () . '</div>' ;
2012-12-31 18:25:09 +00:00
}
/**
* woocommerce_order_by_rating_post_clauses function .
*
* @ access public
2013-11-27 09:03:47 +00:00
* @ param array $args
* @ return array
2012-12-31 18:25:09 +00:00
*/
2013-10-23 11:55:40 +00:00
public static function order_by_rating_post_clauses ( $args ) {
2012-12-31 18:25:09 +00:00
global $wpdb ;
$args [ 'where' ] .= " AND $wpdb->commentmeta .meta_key = 'rating' " ;
$args [ 'join' ] .= "
LEFT JOIN $wpdb -> comments ON ( $wpdb -> posts . ID = $wpdb -> comments . comment_post_ID )
LEFT JOIN $wpdb -> commentmeta ON ( $wpdb -> comments . comment_ID = $wpdb -> commentmeta . comment_id )
" ;
$args [ 'orderby' ] = " $wpdb->commentmeta .meta_value DESC " ;
$args [ 'groupby' ] = " $wpdb->posts .ID " ;
return $args ;
}
2013-03-03 14:51:25 +00:00
/**
* List products with an attribute shortcode
* Example [ product_attribute attribute = 'color' filter = 'black' ]
*
* @ access public
* @ param array $atts
* @ return string
*/
2013-10-23 11:55:40 +00:00
public static function product_attribute ( $atts ) {
2013-03-03 14:51:25 +00:00
global $woocommerce_loop ;
extract ( shortcode_atts ( array (
2013-03-10 13:30:48 +00:00
'per_page' => '12' ,
'columns' => '4' ,
'orderby' => 'title' ,
'order' => 'asc' ,
'attribute' => '' ,
2013-12-29 13:41:48 +00:00
'filter' => ''
2013-03-10 13:30:48 +00:00
), $atts ) );
2013-03-03 14:51:25 +00:00
2013-03-10 13:30:48 +00:00
$attribute = strstr ( $attribute , 'pa_' ) ? sanitize_title ( $attribute ) : 'pa_' . sanitize_title ( $attribute );
2013-03-03 14:51:25 +00:00
2013-03-10 13:30:48 +00:00
$args = array (
'post_type' => 'product' ,
'post_status' => 'publish' ,
'ignore_sticky_posts' => 1 ,
'posts_per_page' => $per_page ,
'orderby' => $orderby ,
'order' => $order ,
'meta_query' => array (
2013-03-03 14:51:25 +00:00
array (
2013-03-10 13:30:48 +00:00
'key' => '_visibility' ,
'value' => array ( 'catalog' , 'visible' ),
'compare' => 'IN'
2013-03-03 14:51:25 +00:00
)
),
'tax_query' => array (
array (
'taxonomy' => $attribute ,
2013-08-17 00:09:22 +00:00
'terms' => array_map ( 'sanitize_title' , explode ( " , " , $filter ) ),
2013-03-03 14:51:25 +00:00
'field' => 'slug'
)
)
);
2013-03-10 13:30:48 +00:00
ob_start ();
2013-03-03 14:51:25 +00:00
2013-06-09 16:26:57 +00:00
$products = new WP_Query ( apply_filters ( 'woocommerce_shortcode_products_query' , $args , $atts ) );
2013-03-03 14:51:25 +00:00
$woocommerce_loop [ 'columns' ] = $columns ;
if ( $products -> have_posts () ) : ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_start (); ?>
2013-03-03 14:51:25 +00:00
< ? php while ( $products -> have_posts () ) : $products -> the_post (); ?>
2013-11-25 12:45:04 +00:00
< ? php wc_get_template_part ( 'content' , 'product' ); ?>
2013-03-03 14:51:25 +00:00
< ? php endwhile ; // end of the loop. ?>
2013-11-25 14:16:26 +00:00
< ? php woocommerce_product_loop_end (); ?>
2013-03-03 14:51:25 +00:00
< ? php endif ;
2013-03-10 13:30:48 +00:00
wp_reset_postdata ();
2013-03-03 14:51:25 +00:00
2013-03-10 13:30:48 +00:00
return '<div class="woocommerce">' . ob_get_clean () . '</div>' ;
2013-03-03 14:51:25 +00:00
}
2013-04-15 07:36:30 +00:00
2013-11-28 17:59:09 +00:00
/**
* @ param array $atts
* @ return string
*/
2013-10-23 13:55:18 +00:00
public static function related_products ( $atts ) {
2013-05-31 15:13:14 +00:00
2013-05-16 12:39:53 +00:00
$atts = shortcode_atts ( array (
2013-05-17 06:55:55 +00:00
'posts_per_page' => '2' ,
'columns' => '2' ,
'orderby' => 'rand' ,
2013-12-29 13:54:55 +00:00
), $atts );
2013-05-16 12:39:53 +00:00
2013-05-17 06:55:55 +00:00
if ( isset ( $atts [ 'per_page' ] ) ) {
2013-05-21 10:04:28 +00:00
_deprecated_argument ( __CLASS__ . '->' . __FUNCTION__ , '2.1' , __ ( 'Use $args["posts_per_page"] instead. Deprecated argument will be removed in WC 2.2.' , 'woocommerce' ) );
2013-05-17 06:55:55 +00:00
$atts [ 'posts_per_page' ] = $atts [ 'per_page' ];
unset ( $atts [ 'per_page' ] );
}
2013-04-15 07:36:30 +00:00
ob_start ();
2013-11-25 14:16:26 +00:00
woocommerce_related_products ( $atts );
2013-04-15 07:36:30 +00:00
return ob_get_clean ();
}
2013-11-02 22:12:50 +00:00
}