* @copyright Copyright (c) 2008 - 2017, Justin Tadlock
* @link https://themehybrid.com/hybrid-core
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/
/**
* Checks if a post has any content. Useful if you need to check if the user has written any content
* before performing any actions.
*
* @since 1.6.0
* @access public
* @param int $post_id
* @return bool
*/
function hybrid_post_has_content( $post_id = 0 ) {
$post = get_post( $post_id );
return ! empty( $post->post_content );
}
/**
* Outputs a link to the post format archive.
*
* @since 2.0.0
* @access public
* @return void
*/
function hybrid_post_format_link() {
echo hybrid_get_post_format_link();
}
/**
* Generates a link to the current post format's archive. If the post doesn't have a post format, the link
* will go to the post permalink.
*
* @since 2.0.0
* @access public
* @return string
*/
function hybrid_get_post_format_link() {
$format = get_post_format();
$url = $format ? get_post_format_link( $format ) : get_permalink();
return sprintf( '%s', esc_url( $url ), get_post_format_string( $format ) );
}
/**
* Outputs a post's author.
*
* @since 2.0.0
* @access public
* @param array $args
* @return void
*/
function hybrid_post_author( $args = array() ) {
echo hybrid_get_post_author( $args );
}
/**
* Function for getting the current post's author in The Loop and linking to the author archive page.
* This function was created because core WordPress does not have template tags with proper translation
* and RTL support for this. An equivalent getter function for `the_author_posts_link()` would
* instantly solve this issue.
*
* @since 2.0.0
* @access public
* @param array $args
* @return string
*/
function hybrid_get_post_author( $args = array() ) {
$html = '';
$defaults = array(
'text' => '%s',
'before' => '',
'after' => '',
'wrap' => '%s',
);
$args = wp_parse_args( $args, $defaults );
// Output buffering to get the author posts link.
ob_start();
the_author_posts_link();
$link = ob_get_clean();
// A small piece of my soul just died. Kittens no longer purr. Dolphins lost the ability to swim with grace.
if ( $link ) {
$html .= $args['before'];
$html .= sprintf( $args['wrap'], hybrid_get_attr( 'entry-author' ), sprintf( $args['text'], $link ) );
$html .= $args['after'];
}
return $html;
}
/**
* Outputs a post's taxonomy terms.
*
* @since 2.0.0
* @access public
* @param array $args
* @return void
*/
function hybrid_post_terms( $args = array() ) {
echo hybrid_get_post_terms( $args );
}
/**
* This template tag is meant to replace template tags like `the_category()`, `the_terms()`, etc. These core
* WordPress template tags don't offer proper translation and RTL support without having to write a lot of
* messy code within the theme's templates. This is why theme developers often have to resort to custom
* functions to handle this (even the default WordPress themes do this). Particularly, the core functions
* don't allow for theme developers to add the terms as placeholders in the accompanying text (ex: "Posted in %s").
* This funcion is a wrapper for the WordPress `get_the_terms_list()` function. It uses that to build a
* better post terms list.
*
* @since 2.0.0
* @access public
* @param array $args
* @return string
*/
function hybrid_get_post_terms( $args = array() ) {
$html = '';
$defaults = array(
'post_id' => get_the_ID(),
'taxonomy' => 'category',
'text' => '%s',
'before' => '',
'after' => '',
'wrap' => '%s',
// Translators: Separates tags, categories, etc. when displaying a post.
'sep' => _x( ', ', 'taxonomy terms separator', 'hybrid-core' )
);
$args = wp_parse_args( $args, $defaults );
$terms = get_the_term_list( $args['post_id'], $args['taxonomy'], '', $args['sep'], '' );
if ( $terms ) {
$html .= $args['before'];
$html .= sprintf( $args['wrap'], hybrid_get_attr( 'entry-terms', $args['taxonomy'] ), sprintf( $args['text'], $terms ) );
$html .= $args['after'];
}
return $html;
}
/* === Galleries === */
/**
* Gets the gallery *item* count. This is different from getting the gallery *image* count. By default,
* WordPress only allows attachments with the 'image' mime type in galleries. However, some scripts such
* as Cleaner Gallery allow for other mime types. This is a more accurate count than the
* hybrid_get_gallery_image_count() function since it will count all gallery items regardless of mime type.
*
* @todo Check for the [gallery] shortcode with the 'mime_type' parameter and use that in get_posts().
*
* @since 1.6.0
* @access public
* @return int
*/
function hybrid_get_gallery_item_count() {
// Check the post content for galleries.
$galleries = get_post_galleries( get_the_ID(), true );
// If galleries were found in the content, get the gallery item count.
if ( ! empty( $galleries ) ) {
$items = '';
foreach ( $galleries as $gallery => $gallery_items )
$items .= $gallery_items;
preg_match_all( '#src=([\'"])(.+?)\1#is', $items, $sources, PREG_SET_ORDER );
if ( ! empty( $sources ) )
return count( $sources );
}
// If an item count wasn't returned, get the post attachments.
$attachments = get_posts(
array(
'fields' => 'ids',
'post_parent' => get_the_ID(),
'post_type' => 'attachment',
'numberposts' => -1
)
);
// Return the attachment count if items were found.
return ! empty( $attachments ) ? count( $attachments ) : 0;
}
/**
* Returns the number of images displayed by the gallery or galleries in a post.
*
* @since 1.6.0
* @access public
* @return int
*/
function hybrid_get_gallery_image_count() {
// Set up an empty array for images.
$images = array();
// Get the images from all post galleries.
$galleries = get_post_galleries_images();
// Merge each gallery image into a single array.
foreach ( $galleries as $gallery_images )
$images = array_merge( $images, $gallery_images );
// If there are no images in the array, just grab the attached images.
if ( empty( $images ) ) {
$images = get_posts(
array(
'fields' => 'ids',
'post_parent' => get_the_ID(),
'post_type' => 'attachment',
'post_mime_type' => 'image',
'numberposts' => -1
)
);
}
// Return the count of the images.
return count( $images );
}
/* === Links === */
/**
* Gets a URL from the content, even if it's not wrapped in an tag.
*
* @since 1.6.0
* @access public
* @param string $content
* @return string
*/
function hybrid_get_content_url( $content ) {
// Catch links that are not wrapped in an '' tag.
preg_match( '/]*?href=[\'"](.+?)[\'"]/is', make_clickable( $content ), $matches );
return ! empty( $matches[1] ) ? esc_url_raw( $matches[1] ) : '';
}
/**
* Filters 'get_the_post_format_url' to make for a more robust and back-compatible function. If WP did
* not find a URL, check the post content for one. If nothing is found, return the post permalink.
*
* @since 1.6.0
* @access public
* @param string $url
* @param object $post
* @return string
*/
function hybrid_get_the_post_format_url( $url = '', $post = null ) {
if ( ! $url ) {
$post = is_null( $post ) ? get_post() : $post;
$content_url = hybrid_get_content_url( $post->post_content );
$url = $content_url ? esc_url( $content_url ) : esc_url( get_permalink( $post->ID ) );
}
return $url;
}