Refined the way in which tabs are added to products

This commit is contained in:
Mike Jolley 2013-02-10 17:33:13 +00:00
parent 55d2237d9f
commit 3e5b4141f6
11 changed files with 123 additions and 180 deletions

View File

@ -212,6 +212,8 @@ Yes you can! Join in on our [GitHub repository](http://github.com/woothemes/wooc
* Templating - Replaced Fancybox with prettyPhoto
* Templating - loop-shop which was depricated is now gone for good.
* Templating - Renamed empty.php to cart-empty.php to make clearer.
* Templating - Renamed sorting.php to orderby.php to better reflect contained hooks and code.
* Templating - Product tabs rewritten - new filter to define tab titles, priorities, and display callbacks.
* Tweak - Sorting uses GET to make it cache friendly
* Tweak - Optimised class loading (autoload). Reduced memory consumption.

View File

@ -4,23 +4,37 @@
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
* @version 2.0.0
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
// Get tabs
ob_start();
do_action('woocommerce_product_tabs');
$tabs = trim( ob_get_clean() );
/**
* Filter tabs and allow third parties to add their own
*
* Each tab is an array containing title, callback and priority. See @woocommerce_default_product_tabs()
*/
$tabs = apply_filters( 'woocommerce_product_tabs', array() );
if ( ! empty( $tabs ) ) : ?>
<div class="woocommerce-tabs">
<ul class="tabs">
<?php echo $tabs; ?>
<?php foreach ( $tabs as $key => $tab ) : ?>
<li class="<?php echo $key ?>_tab">
<a href="#tab-<?php echo $key ?>"><?php echo apply_filters( 'woocommerce_product_' . $key . '_tab_title', $tab['title'], $key ) ?></a>
</li>
<?php endforeach; ?>
</ul>
<?php do_action('woocommerce_product_tab_panels'); ?>
<?php foreach ( $tabs as $key => $tab ) : ?>
<div class="panel entry-content" id="tab-<?php echo $key ?>">
<?php call_user_func( $tab['callback'], $key, $tab ) ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>

View File

@ -0,0 +1,19 @@
<?php
/**
* Additonal Information tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 2.0.0
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $woocommerce, $post, $product;
$heading = apply_filters( 'woocommerce_product_additional_information_heading', __( 'Additional Information', 'woocommerce' ) );
?>
<h2><?php echo $heading; ?></h2>
<?php $product->list_attributes(); ?>

View File

@ -1,29 +0,0 @@
<?php
/**
* Attributes tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $woocommerce, $post, $product;
$show_attr = ( get_option( 'woocommerce_enable_dimension_product_attributes' ) == 'yes' ? true : false );
if ( $product->has_attributes() || ( $show_attr && $product->has_dimensions() ) || ( $show_attr && $product->has_weight() ) ) {
?>
<div class="panel entry-content" id="tab-attributes">
<?php $heading = apply_filters('woocommerce_product_additional_information_heading', __( 'Additional Information', 'woocommerce' )); ?>
<h2><?php echo $heading; ?></h2>
<?php $product->list_attributes(); ?>
</div>
<?php
}
?>

View File

@ -4,21 +4,16 @@
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
* @version 2.0.0
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $woocommerce, $post;
if ( $post->post_content ) : ?>
<div class="panel entry-content" id="tab-description">
$heading = esc_html( apply_filters('woocommerce_product_description_heading', __( 'Product Description', 'woocommerce' ) ) );
?>
<?php $heading = esc_html( apply_filters('woocommerce_product_description_heading', __( 'Product Description', 'woocommerce' ) ) ); ?>
<h2><?php echo $heading; ?></h2>
<h2><?php echo $heading; ?></h2>
<?php the_content(); ?>
</div>
<?php endif; ?>
<?php the_content(); ?>

View File

@ -1,20 +0,0 @@
<?php
/**
* Reviews tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $woocommerce, $post;
if ( comments_open() ) : ?>
<div class="panel entry-content" id="tab-reviews">
<?php comments_template(); ?>
</div>
<?php endif; ?>

View File

@ -1,22 +0,0 @@
<?php
/**
* Attributes tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $product;
$show_attr = ( get_option( 'woocommerce_enable_dimension_product_attributes' ) == 'yes' ? true : false );
if ( $product->has_attributes() || ( $show_attr && $product->has_dimensions() ) || ( $show_attr && $product->has_weight() ) ) {
?>
<li class="attributes_tab"><a href="#tab-attributes"><?php echo apply_filters('woocommerce_product_additional_information_tab_title', __( 'Additional Information', 'woocommerce' )); ?></a></li>
<?php
}
?>

View File

@ -1,16 +0,0 @@
<?php
/**
* Description tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $post;
if ( $post->post_content ) : ?>
<li class="description_tab"><a href="#tab-description"><?php echo apply_filters('woocommerce_product_description_tab_title', __( 'Description', 'woocommerce' )) ?></a></li>
<?php endif; ?>

View File

@ -1,14 +0,0 @@
<?php
/**
* Reviews tab
*
* @author WooThemes
* @package WooCommerce/Templates
* @version 1.6.4
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if ( comments_open() ) : ?>
<li class="reviews_tab"><a href="#tab-reviews"><?php echo apply_filters('woocommerce_reviews_tab_title', __( 'Reviews', 'woocommerce' )) ?><?php echo comments_number(' (0)', ' (1)', ' (%)'); ?></a></li>
<?php endif; ?>

View File

@ -155,20 +155,9 @@ if ( ! is_admin() || defined('DOING_AJAX') ) {
/**
* Product page tabs
*
* @see woocommerce_product_description_tab()
* @see woocommerce_product_attributes_tab()
* @see woocommerce_product_reviews_tab()
* @see woocommerce_product_description_panel()
* @see woocommerce_product_attributes_panel()
* @see woocommerce_product_reviews_panel()
*/
add_action( 'woocommerce_product_tabs', 'woocommerce_product_description_tab', 10 );
add_action( 'woocommerce_product_tabs', 'woocommerce_product_attributes_tab', 20 );
add_action( 'woocommerce_product_tabs', 'woocommerce_product_reviews_tab', 30 );
add_action( 'woocommerce_product_tab_panels', 'woocommerce_product_description_panel', 10 );
add_action( 'woocommerce_product_tab_panels', 'woocommerce_product_attributes_panel', 20 );
add_action( 'woocommerce_product_tab_panels', 'woocommerce_product_reviews_panel', 30 );
add_filter( 'woocommerce_product_tabs', 'woocommerce_default_product_tabs' );
add_filter( 'woocommerce_product_tabs', 'woocommerce_sort_product_tabs', 99 );
/**
* Checkout

View File

@ -445,7 +445,7 @@ if ( ! function_exists( 'woocommerce_catalog_ordering' ) ) {
$orderby = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
woocommerce_get_template( 'loop/sorting.php', array( 'orderby' => $orderby ) );
woocommerce_get_template( 'loop/orderby.php', array( 'orderby' => $orderby ) );
}
}
@ -695,46 +695,6 @@ if ( ! function_exists( 'woocommerce_quantity_input' ) ) {
if ( ! function_exists( 'woocommerce_product_description_tab' ) ) {
/**
* Output the description tab.
*
* @access public
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_description_tab() {
woocommerce_get_template( 'single-product/tabs/tab-description.php' );
}
}
if ( ! function_exists( 'woocommerce_product_attributes_tab' ) ) {
/**
* Output the attributes tab.
*
* @access public
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_attributes_tab() {
woocommerce_get_template( 'single-product/tabs/tab-attributes.php' );
}
}
if ( ! function_exists( 'woocommerce_product_reviews_tab' ) ) {
/**
* Output the reviews tab.
*
* @access public
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_reviews_tab() {
woocommerce_get_template( 'single-product/tabs/tab-reviews.php' );
}
}
if ( ! function_exists( 'woocommerce_product_description_panel' ) ) {
/**
* Output the description tab content.
*
@ -742,11 +702,11 @@ if ( ! function_exists( 'woocommerce_product_description_panel' ) ) {
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_description_panel() {
function woocommerce_product_description_tab() {
woocommerce_get_template( 'single-product/tabs/description.php' );
}
}
if ( ! function_exists( 'woocommerce_product_attributes_panel' ) ) {
if ( ! function_exists( 'woocommerce_product_additional_information_tab' ) ) {
/**
* Output the attributes tab content.
@ -755,11 +715,11 @@ if ( ! function_exists( 'woocommerce_product_attributes_panel' ) ) {
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_attributes_panel() {
woocommerce_get_template( 'single-product/tabs/attributes.php' );
function woocommerce_product_additional_information_tab() {
woocommerce_get_template( 'single-product/tabs/additional-information.php' );
}
}
if ( ! function_exists( 'woocommerce_product_reviews_panel' ) ) {
if ( ! function_exists( 'woocommerce_product_reviews_tab' ) ) {
/**
* Output the reviews tab content.
@ -768,11 +728,76 @@ if ( ! function_exists( 'woocommerce_product_reviews_panel' ) ) {
* @subpackage Product/Tabs
* @return void
*/
function woocommerce_product_reviews_panel() {
function woocommerce_product_reviews_tab() {
woocommerce_get_template( 'single-product/tabs/reviews.php' );
}
}
if ( ! function_exists( 'woocommerce_default_product_tabs' ) ) {
/**
* Add default product tabs to product pages.
*
* @access public
* @param mixed $tabs
* @return void
*/
function woocommerce_default_product_tabs( $tabs = array() ) {
global $product, $post;
// Description tab - shows product content
if ( $post->post_content )
$tabs['description'] = array(
'title' => __( 'Description', 'woocommerce' ),
'priority' => 10,
'callback' => 'woocommerce_product_description_tab'
);
// Additonal information tab - shows attributes
if ( $product->has_attributes() || ( get_option( 'woocommerce_enable_dimension_product_attributes' ) == 'yes' && ( $product->has_dimensions() || $product->has_weight() ) ) )
$tabs['additional_information'] = array(
'title' => __( 'Additional Information', 'woocommerce' ),
'priority' => 20,
'callback' => 'woocommerce_product_additional_information_tab'
);
// Reviews tab - shows comments
if ( comments_open() )
$tabs['reviews'] = array(
'title' => sprintf( __( 'Reviews (%d)', 'woocommerce' ), get_comments_number( $post->ID ) ),
'priority' => 30,
'callback' => 'comments_template'
);
return $tabs;
}
}
if ( ! function_exists( 'woocommerce_sort_product_tabs' ) ) {
/**
* Sort tabs by priority
*
* @access public
* @return void
*/
function woocommerce_sort_product_tabs( $tabs = array() ) {
// Re-order tabs by priority
if ( ! function_exists( '_sort_priority_callback' ) ) {
function _sort_priority_callback( $a, $b ) {
if ( $a['priority'] == $b['priority'] )
return 0;
return ( $a['priority'] < $b['priority'] ) ? -1 : 1;
}
}
uasort( $tabs, '_sort_priority_callback' );
return $tabs;
}
}
if ( ! function_exists( 'woocommerce_comments' ) ) {
/**