'',
'separator' => '',
'show_home' => false,
'show_current' => false,
);
$args = (object)wp_parse_args( $args, $defaults );
// Avoid pages with multiple entries - makes no sense.
if ( is_front_page() || is_home() || is_archive() ) return '';
// See if there is a label that should be displayed.
$label = '';
if ( !empty( $args->label ) ) $label = ''.$args->label.'';
// Prepare the crumbs in an array.
$levels = array();
// First, figure out what the visitor is looking at to determine the crumb content.
if ( function_exists( 'is_product' ) && is_product() )
{
$crumbs = ( new \WC_Breadcrumb() )->generate();
foreach ( $crumbs as $key => $crumb )
{
$name = $crumb[0];
$url = $crumb[1];
if ( !empty( $url ) )
{
$levels[] = ''.esc_html( $name ).'';
}
}
}
else if ( is_category() || is_single() || is_attachment() )
{
$levels =
array_merge(
$levels,
array_map(
function( $el )
{
return ''.esc_html( $el->name ).'';
},
get_the_category()
)
);
}
// If there is no crumb content by this point, get out of here and display nothing.
if ( empty( $levels ) ) return '';
// Then, on with the currently-viewed item.
if ( ( $args->show_current ) && ( is_single() || is_page() ) ) $levels[] = get_the_title();
// Finally, prepend the home link - this is done last so the earlier check for any crumbs could be done.
if ( $args->show_home ) array_unshift( $levels, ''.get_bloginfo( 'name' ).'' );
// Glue the elements together into a single line - the array_filter
// call automatically removes empty elements from being included.
//
// Note: The apparent-backwards
element pairing is intentional.
return
'
'.
''.
$label.
'
'.
implode( '
'.$args->separator.'
', array_filter( $levels ) ).
'
'.
''.
'
';
}
/**
* Generates the markup that displays all comments for a given page/post.
*
* @link http://themeshaper.com/2012/11/04/the-wordpress-theme-comments-template/
* @param array $args Can be any of the following arguments:
* TBD
* @return string The markup
*/
function tag_comments( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
// Only show comments if there is a post or similar.
global $post;
if ( empty( $post ) ) return '';
// If comments are open or we have at least one comment, load up the comment template -
// note that products should not have comments as they already have a reviews tab.
ob_start();
if ( ( comments_open() || '0' != get_comments_number() ) && !( function_exists( 'is_product' ) && is_product() ) )
{
comments_template( '', true );
}
// Display it.
return ob_get_clean();
}
/**
* Generates a prominent highlighted area associated with
* the current post typically displays the post title
* just above the post.
*
* @link http://getbootstrap.com/components/#alerts
* @param array $args Can be any of the following arguments:
* string $text The text to display
* string $subtext The smaller text to display below the main text
* string $align_class Can be 'ml', 'mc', or 'mr' for left, center, or right text alignment
* string $context_class An optional descriptive class that is applied to the containers
* @return string The generated markup
*/
function tag_highlight( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'text' => '',
'subtext' => '',
'align_class' => 'mc',
'context_class' => '',
);
$args = (object)wp_parse_args( $args, $defaults );
// These get used in the markup based on the parameters.
$class = '';
$content = '';
// The caller must supply the alignment.
$class .= ' '.$args->align_class;
// Filter.
$args->text = apply_filters( 'filter_bpq_highlight_text', $args->text );
$args->subtext = apply_filters( 'filter_bpq_highlight_subtext', $args->subtext );
// Text.
if ( empty( $args->text ) ) return '';
ob_start();
echo
'
';
$content .= ob_get_clean();
// The markup - wrap the content in a Bootstrap row to ensure
// margins match up with the sidebar/content areas.
return
'
'.
'
'.
$content.
'
'.
'
';
}
/**
* Puts together the full "sha-bang" of metadata for posts.
*
* @link http://getbootstrap.com/components/#alerts
* @param array $args Can be any of the following arguments:
* boolean $include_author Send 'false' to omit this info
* boolean $include_categories Send 'false' to omit this info
* boolean $include_comments Send 'false' to omit this info
* boolean $include_date Send 'false' to omit this info
* boolean $include_tags Send 'false' to omit this info
* string $date_archive_type Drive which date archive is linked to; can be: 'day', 'month', or 'year'
* @return string The generated markup
*/
function tag_post_meta( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'include_author' => true,
'include_categories' => true,
'include_comments' => true,
'include_date' => true,
'include_tags' => true,
'date_archive_type' => 'month'
);
$args = (object)wp_parse_args( $args, $defaults );
// Prepare an array of all the pieces that make up the post metadata.
$meta = array();
if ( $args->include_author ) $meta[] = tag_post_meta_author();
if ( $args->include_categories ) $meta[] = tag_post_meta_categories();
if ( $args->include_comments ) $meta[] = tag_post_meta_comments();
if ( $args->include_date ) $meta[] = tag_post_meta_date( array( 'archive_type' => $args->date_archive_type ) );
if ( $args->include_tags ) $meta[] = tag_post_meta_tags();
// If no metadata was added to the overall array, then get
// out now before return an empty element.
if ( empty( $meta ) ) return '';
// Glue the elements together into a single line - the array_filter
// call automatically removes empty elements from being included.
return
'
';
}
/**
* Provides a link and info about the author who wrote a post.
*
* @link http://themeshaper.com/2012/11/01/the-wordpress-theme-index-template/
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_post_meta_author( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
// Write up the date.
ob_start();
echo
''.
''.
''.
esc_html( get_the_author() ).
''.
'';
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_author', ob_get_clean() );
}
/**
* Puts together a list of categories separated by commas.
*
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_post_meta_categories( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
/* translators: used between list items, there is a space after the comma */
ob_start();
$categories_list = get_the_category_list( __( ', ', 'bpq' ) );
if ( $categories_list )
{
echo
''.
''.
sprintf( __( '%1$s', 'bpq' ), $categories_list ).
'';
}
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_categories', ob_get_clean() );
}
/**
* Provides a link to the comments while also informing how
* many there are on the post.
*
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_post_meta_comments( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
//DAN-HACK: Start
//
// The sample template in the Customizer should always show the comment
// link - this is a hack because other post meta pieces handle the
// sample template through filter hooks; unfortunately, there is no hook
// for this post meta comment information.
$comment_link = '';
if ( is_viewing_sample() ) $comment_link = ''.__( 'Comment', 'bpq' ).'';
//
//DAN-HACK: End
// Consider a comments link - both informs and links to a place for leaving comments.
elseif ( !post_password_required() && ( comments_open() || '0' != get_comments_number() ) )
{
ob_start();
comments_popup_link( __( 'Leave a comment', 'bpq' ), __( '1 Comment', 'bpq' ), __( '% Comments', 'bpq' ) );
$comment_link = ob_get_clean();
}
// Generate the markup.
ob_start();
if ( !empty( $comment_link ) )
{
echo ''.
''.
$comment_link.
'';
}
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_comments', ob_get_clean() );
}
/**
* Provides a link and info about the date a post was posted.
*
* @link http://themeshaper.com/2012/11/01/the-wordpress-theme-index-template/
* @param array $args Can be any of the following arguments:
* string $archive_type Drive which archive is linked to; can be: 'day', 'month', or 'year'
* @return string The desired text
*/
function tag_post_meta_date( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'archive_type' => 'month'
);
$args = (object)wp_parse_args( $args, $defaults );
// The date link could potentially go to
// the daily, monthly, or yearly archives.
$link = get_permalink();
switch ( $args->archive_type )
{
case 'day': $link = get_day_link( get_post_time( 'Y' ), get_post_time( 'm' ), get_post_time( 'j' ) ); break;
case 'month': $link = get_month_link( get_post_time( 'Y' ), get_post_time( 'm' ) ); break;
case 'year': $link = get_year_link( get_post_time( 'Y' ) ); break;
}
// Write up the date.
ob_start();
echo
'';
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_date', ob_get_clean() );
}
/**
* Provides a link for any logged-in users who are permitted to edit posts.
*
* @link http://codex.wordpress.org/Template_Tags/get_edit_post_link
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_post_meta_edit( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
// Write up the date.
ob_start();
echo
''.
''.
''.
__( 'Edit', 'bpq' ).
''.
'';
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_edit', ob_get_clean() );
}
/**
* Puts together a list of tags separated by commas.
*
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_post_meta_tags( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
/* translators: used between list items, there is a space after the comma */
ob_start();
$tags_list = get_the_tag_list( '', __( ', ', 'bpq' ) );
if ( $tags_list )
{
echo
''.
''.
sprintf( __( '%1$s', 'bpq' ), $tags_list ).
'';
}
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_meta_tags', ob_get_clean() );
}
/**
* Provides an icon that goes with a post layout.
*
* @param array $args Can be any of the following arguments:
* string $icon If specified, will override the default icon; use full Font Awesome of Glyphicons markup
* @return string The desired text
*/
function tag_post_icon( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'icon' => ''
);
$args = (object)wp_parse_args( $args, $defaults );
// Write up the icon with font-awesome.
return
'
';
}
/**
* Retrieves, and optionally displays, the feature image from a post.
*
* @param array $args Can be any of the following arguments:
* string $size One of the WP-defined image sizes: 'full', 'large', 'medium', or 'thumbnail'
* @return string The desired image
*/
function tag_post_image( $args = array() )
{
//DAN-HACK: Start
//
// Special case for the customizer sample template.
if ( is_viewing_sample() )
{
global $sample;
return
'
'.
$sample->post_thumbnail.
'
';
}
//
//DAN-HACK: End
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'size' => 'thumbnail'
);
$args = (object)wp_parse_args( $args, $defaults );
// Try to get the main image from the featured image.
$image_markup = '';
if ( has_post_thumbnail() )
{
ob_start();
the_post_thumbnail( $args->size );
$image_markup = ob_get_clean();
}
// Give the child theme a chance to override.
$image_markup = apply_filters( 'filter_bpq_featured_image', $image_markup );
// Return the markup.
if ( !empty( $image_markup ) )
{
return
'
';
}
}
/**
* Provides a linked version of the post title.
*
* @param array $args Can be any of the following arguments:
* string $label An optional label to prepend to the front of the title
* @return string The desired text
*/
function tag_post_title( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
'label' => '',
);
$args = (object)wp_parse_args( $args, $defaults );
// If there is a label, generate the wrapper around it.
$label = apply_filters( 'filter_bpq_post_title_label', $args->label );
if ( !empty( $label ) )
{
$label =
''.
$label.
'';
}
// Write up the title using the various specialized WP functions.
ob_start();
echo
'
';
// Display or not, then return.
return ob_get_clean();
}
/**
* Provides a 'read more'-type link to the current post.
*
* @link http://codex.wordpress.org/Function_Reference/the_excerpt#Make_the_.22read_more.22_link_to_the_post
* @param array $args Can be any of the following arguments:
* TBD
* @return string The desired text
*/
function tag_read_more( $args = array() )
{
// Merge default arguments and the arguments supplied by the caller.
$defaults = array(
// TBD
);
$args = (object)wp_parse_args( $args, $defaults );
// OPTION: Read more text
$opt_text = get_theme_mod( 'bpq_opt_content_read_more_text', '' );
if ( empty( $opt_text ) ) $opt_text = __( 'continue reading', 'bpq' );
$opt_text = apply_filters( 'filter_bpq_read_more_text', $opt_text );
// Write up the read more link - note that the 'excerpt_more'
// WP hook is being used for familiarity.
ob_start();
echo
''.
$opt_text.
' '.
'';
// Ask the client if they want to change this up a bit (or ignore it completely).
return apply_filters( 'filter_bpq_post_read_more', ob_get_clean() );
}
?>