2021-07-25 23:25:29 +00:00
< ? php
/**
* Post meta elements .
*
* @ package GeneratePress
*/
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly.
}
if ( ! function_exists ( 'generate_content_nav' ) ) {
/**
* Display navigation to next / previous pages when applicable .
*
* @ since 0.1
*
* @ param string $nav_id The id of our navigation .
*/
function generate_content_nav ( $nav_id ) {
global $wp_query , $post ;
// Don't print empty markup on single pages if there's nowhere to navigate.
if ( is_single () ) {
$previous = ( is_attachment () ) ? get_post ( $post -> post_parent ) : get_adjacent_post ( false , '' , true );
$next = get_adjacent_post ( false , '' , false );
if ( ! $next && ! $previous ) {
return ;
}
}
// Don't print empty markup in archives if there's only one page.
if ( $wp_query -> max_num_pages < 2 && ( is_home () || is_archive () || is_search () ) ) {
return ;
}
$nav_class = ( is_single () ) ? 'post-navigation' : 'paging-navigation' ;
?>
< nav id = " <?php echo esc_attr( $nav_id ); ?> " class = " <?php echo esc_attr( $nav_class ); ?> " >
< span class = " screen-reader-text " >< ? php esc_html_e ( 'Post navigation' , 'generatepress' ); ?> </span>
< ? php
if ( is_single () ) : // navigation links for single posts.
$post_navigation_args = apply_filters (
'generate_post_navigation_args' ,
array (
'previous_format' => '<div class="nav-previous">' . generate_get_svg_icon ( 'arrow-left' ) . '<span class="prev" title="' . esc_attr__ ( 'Previous' , 'generatepress' ) . '">%link</span></div>' ,
'next_format' => '<div class="nav-next">' . generate_get_svg_icon ( 'arrow-right' ) . '<span class="next" title="' . esc_attr__ ( 'Next' , 'generatepress' ) . '">%link</span></div>' ,
'link' => '%title' ,
'in_same_term' => apply_filters ( 'generate_category_post_navigation' , false ),
'excluded_terms' => '' ,
'taxonomy' => 'category' ,
)
);
previous_post_link (
$post_navigation_args [ 'previous_format' ],
$post_navigation_args [ 'link' ],
$post_navigation_args [ 'in_same_term' ],
$post_navigation_args [ 'excluded_terms' ],
$post_navigation_args [ 'taxonomy' ]
);
next_post_link (
$post_navigation_args [ 'next_format' ],
$post_navigation_args [ 'link' ],
$post_navigation_args [ 'in_same_term' ],
$post_navigation_args [ 'excluded_terms' ],
$post_navigation_args [ 'taxonomy' ]
);
elseif ( is_home () || is_archive () || is_search () ) : // navigation links for home, archive, and search pages.
if ( get_next_posts_link () ) :
?>
< div class = " nav-previous " >
< ? php generate_do_svg_icon ( 'arrow' ); ?>
< span class = " prev " title = " <?php esc_attr_e( 'Previous', 'generatepress' ); ?> " >< ? php next_posts_link ( __ ( 'Older posts' , 'generatepress' ) ); ?> </span>
</ div >
< ? php
endif ;
if ( get_previous_posts_link () ) :
?>
< div class = " nav-next " >
< ? php generate_do_svg_icon ( 'arrow' ); ?>
< span class = " next " title = " <?php esc_attr_e( 'Next', 'generatepress' ); ?> " >< ? php previous_posts_link ( __ ( 'Newer posts' , 'generatepress' ) ); ?> </span>
</ div >
< ? php
endif ;
if ( function_exists ( 'the_posts_pagination' ) ) {
the_posts_pagination (
array (
'mid_size' => apply_filters ( 'generate_pagination_mid_size' , 1 ),
'prev_text' => apply_filters (
'generate_previous_link_text' ,
sprintf (
/* translators: left arrow */
__ ( '%s Previous' , 'generatepress' ),
'<span aria-hidden="true">←</span>'
)
),
'next_text' => apply_filters (
'generate_next_link_text' ,
sprintf (
/* translators: right arrow */
__ ( 'Next %s' , 'generatepress' ),
'<span aria-hidden="true">→</span>'
)
),
'before_page_number' => sprintf (
'<span class="screen-reader-text">%s</span>' ,
_x ( 'Page' , 'prepends the pagination page number for screen readers' , 'generatepress' )
),
)
);
}
/**
* generate_paging_navigation hook .
*
* @ since 0.1
*/
do_action ( 'generate_paging_navigation' );
endif ;
?>
</ nav >
< ? php
}
}
if ( ! function_exists ( 'generate_modify_posts_pagination_template' ) ) {
add_filter ( 'navigation_markup_template' , 'generate_modify_posts_pagination_template' , 10 , 2 );
/**
* Remove the container and screen reader text from the_posts_pagination ()
* We add this in ourselves in generate_content_nav ()
*
* @ since 1.3 . 45
*
* @ param string $template The default template .
* @ param string $class The class passed by the calling function .
* @ return string The HTML for the post navigation .
*/
function generate_modify_posts_pagination_template ( $template , $class ) {
if ( ! empty ( $class ) && false !== strpos ( $class , 'pagination' ) ) {
$template = '<div class="nav-links">%3$s</div>' ;
}
return $template ;
}
}
/**
* Output requested post meta .
*
* @ since 2.3
*
* @ param string $item The post meta item we ' re requesting .
*/
function generate_do_post_meta_item ( $item ) {
if ( 'date' === $item ) {
$time_string = '<time class="entry-date published" datetime="%1$s"%5$s>%2$s</time>' ;
$updated_time = get_the_modified_time ( 'U' );
$published_time = get_the_time ( 'U' ) + 1800 ;
$schema_type = generate_get_schema_type ();
if ( $updated_time > $published_time ) {
if ( apply_filters ( 'generate_post_date_show_updated_only' , false ) ) {
$time_string = '<time class="entry-date updated-date" datetime="%3$s"%6$s>%4$s</time>' ;
} else {
$time_string = '<time class="updated" datetime="%3$s"%6$s>%4$s</time>' . $time_string ;
}
}
$time_string = sprintf (
$time_string ,
esc_attr ( get_the_date ( 'c' ) ),
esc_html ( get_the_date () ),
esc_attr ( get_the_modified_date ( 'c' ) ),
esc_html ( get_the_modified_date () ),
'microdata' === $schema_type ? ' itemprop="datePublished"' : '' ,
'microdata' === $schema_type ? ' itemprop="dateModified"' : ''
);
$posted_on = '<span class="posted-on">%1$s%4$s</span> ' ;
if ( apply_filters ( 'generate_post_date_link' , false ) ) {
$posted_on = '<span class="posted-on">%1$s<a href="%2$s" title="%3$s" rel="bookmark">%4$s</a></span> ' ;
}
echo apply_filters ( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'generate_post_date_output' ,
sprintf (
$posted_on ,
apply_filters ( 'generate_inside_post_meta_item_output' , '' , 'date' ),
esc_url ( get_permalink () ),
esc_attr ( get_the_time () ),
$time_string
),
$time_string ,
$posted_on
);
}
if ( 'author' === $item ) {
$schema_type = generate_get_schema_type ();
$byline = '<span class="byline">%1$s<span class="author%8$s" %5$s><a class="url fn n" href="%2$s" title="%3$s" rel="author"%6$s><span class="author-name"%7$s>%4$s</span></a></span></span> ' ;
if ( ! apply_filters ( 'generate_post_author_link' , true ) ) {
$byline = '<span class="byline">%1$s<span class="author%8$s" %5$s><span class="author-name"%7$s>%4$s</span></span></span> ' ;
}
echo apply_filters ( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'generate_post_author_output' ,
sprintf (
$byline ,
apply_filters ( 'generate_inside_post_meta_item_output' , '' , 'author' ),
esc_url ( get_author_posts_url ( get_the_author_meta ( 'ID' ) ) ),
/* translators: 1: Author name */
esc_attr ( sprintf ( __ ( 'View all posts by %s' , 'generatepress' ), get_the_author () ) ),
esc_html ( get_the_author () ),
generate_get_microdata ( 'post-author' ),
'microdata' === $schema_type ? ' itemprop="url"' : '' ,
'microdata' === $schema_type ? ' itemprop="name"' : '' ,
generate_is_using_hatom () ? ' vcard' : ''
)
);
}
if ( 'categories' === $item ) {
$term_separator = apply_filters ( 'generate_term_separator' , _x ( ', ' , 'Used between list items, there is a space after the comma.' , 'generatepress' ), 'categories' );
$categories_list = get_the_category_list ( $term_separator );
if ( $categories_list ) {
echo apply_filters ( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'generate_category_list_output' ,
sprintf (
'<span class="cat-links">%3$s<span class="screen-reader-text">%1$s </span>%2$s</span> ' ,
esc_html_x ( 'Categories' , 'Used before category names.' , 'generatepress' ),
$categories_list ,
apply_filters ( 'generate_inside_post_meta_item_output' , '' , 'categories' )
)
);
}
}
if ( 'tags' === $item ) {
$term_separator = apply_filters ( 'generate_term_separator' , _x ( ', ' , 'Used between list items, there is a space after the comma.' , 'generatepress' ), 'tags' );
$tags_list = get_the_tag_list ( '' , $term_separator );
if ( $tags_list ) {
echo apply_filters ( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'generate_tag_list_output' ,
sprintf (
'<span class="tags-links">%3$s<span class="screen-reader-text">%1$s </span>%2$s</span> ' ,
esc_html_x ( 'Tags' , 'Used before tag names.' , 'generatepress' ),
$tags_list ,
apply_filters ( 'generate_inside_post_meta_item_output' , '' , 'tags' )
)
);
}
}
if ( 'comments-link' === $item ) {
if ( ! post_password_required () && ( comments_open () || get_comments_number () ) ) {
echo '<span class="comments-link">' ;
echo apply_filters ( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
'generate_inside_post_meta_item_output' ,
'' ,
'comments-link'
);
comments_popup_link ( __ ( 'Leave a comment' , 'generatepress' ), __ ( '1 Comment' , 'generatepress' ), __ ( '% Comments' , 'generatepress' ) );
echo '</span> ' ;
}
}
if ( 'post-navigation' === $item && is_single () ) {
generate_content_nav ( 'nav-below' );
}
/**
* generate_post_meta_items hook .
*
* @ since 2.4
*/
do_action ( 'generate_post_meta_items' , $item );
}
add_filter ( 'generate_inside_post_meta_item_output' , 'generate_do_post_meta_prefix' , 10 , 2 );
/**
* Add svg icons or text to our post meta output .
*
* @ since 2.4
* @ param string $output The existing output .
* @ param string $item The item to target .
*/
function generate_do_post_meta_prefix ( $output , $item ) {
if ( 'author' === $item ) {
$output = __ ( 'by' , 'generatepress' ) . ' ' ;
}
if ( 'categories' === $item ) {
$output = generate_get_svg_icon ( 'categories' );
}
if ( 'tags' === $item ) {
$output = generate_get_svg_icon ( 'tags' );
}
if ( 'comments-link' === $item ) {
$output = generate_get_svg_icon ( 'comments' );
}
return $output ;
}
/**
* Remove post meta items from display if their individual filters are set .
*
* @ since 3.0 . 0
* @ param array $items The post meta items .
*/
function generate_disable_post_meta_items ( $items ) {
$disable_filter_names = apply_filters (
'generate_disable_post_meta_filter_names' ,
array (
'date' => 'generate_post_date' ,
'author' => 'generate_post_author' ,
'categories' => 'generate_show_categories' ,
'tags' => 'generate_show_tags' ,
'comments-link' => 'generate_show_comments' ,
'post-navigation' => 'generate_show_post_navigation' ,
)
);
foreach ( $items as $item ) {
$default_display = true ;
if ( 'comments-link' === $item && is_singular () ) {
$default_display = false ;
}
// phpcs:ignore -- Hook name is coming from a variable.
if ( isset ( $disable_filter_names [ $item ] ) && ! apply_filters ( $disable_filter_names [ $item ], $default_display ) ) {
$items = array_diff ( $items , array ( $item ) );
}
}
return $items ;
}
/**
* Get the post meta items in the header entry meta .
*
* @ since 3.0 . 0
*/
function generate_get_header_entry_meta_items () {
$items = apply_filters (
'generate_header_entry_meta_items' ,
array (
'date' ,
'author' ,
)
);
// Disable post meta items based on their individual filters.
$items = generate_disable_post_meta_items ( $items );
return $items ;
}
/**
* Get the post meta items in the footer entry meta .
*
* @ since 3.0 . 0
*/
function generate_get_footer_entry_meta_items () {
$items = apply_filters (
'generate_footer_entry_meta_items' ,
array (
'categories' ,
'tags' ,
'comments-link' ,
'post-navigation' ,
)
);
/**
* This wasn ' t a " meta item " prior to 3.0 . 0 and some users may be using the filter above
* without specifying that they want to include post - navigation . The below forces it to display
* for users using the old float system to prevent it from disappearing on update .
*/
if ( ! generate_is_using_flexbox () && ! in_array ( 'post-navigation' , ( array ) $items ) ) {
$items [] = 'post-navigation' ;
}
// Disable post meta items based on their individual filters.
$items = generate_disable_post_meta_items ( $items );
return $items ;
}
if ( ! function_exists ( 'generate_posted_on' ) ) {
/**
* Prints HTML with meta information for the current post - date / time and author .
*
* @ since 0.1
*/
function generate_posted_on () {
$items = generate_get_header_entry_meta_items ();
foreach ( $items as $item ) {
generate_do_post_meta_item ( $item );
}
}
}
if ( ! function_exists ( 'generate_entry_meta' ) ) {
/**
* Prints HTML with meta information for the categories , tags .
*
* @ since 1.2 . 5
*/
function generate_entry_meta () {
$items = generate_get_footer_entry_meta_items ();
foreach ( $items as $item ) {
generate_do_post_meta_item ( $item );
}
}
}
if ( ! function_exists ( 'generate_excerpt_more' ) ) {
add_filter ( 'excerpt_more' , 'generate_excerpt_more' );
/**
* Prints the read more HTML to post excerpts .
*
* @ since 0.1
*
* @ param string $more The string shown within the more link .
* @ return string The HTML for the more link .
*/
function generate_excerpt_more ( $more ) {
return apply_filters (
'generate_excerpt_more_output' ,
sprintf (
' ... <a title="%1$s" class="read-more" href="%2$s" aria-label="%4$s">%3$s</a>' ,
the_title_attribute ( 'echo=0' ),
esc_url ( get_permalink ( get_the_ID () ) ),
__ ( 'Read more' , 'generatepress' ),
sprintf (
/* translators: Aria-label describing the read more button */
_x ( 'More on %s' , 'more on post title' , 'generatepress' ),
the_title_attribute ( 'echo=0' )
)
)
);
}
}
if ( ! function_exists ( 'generate_content_more' ) ) {
add_filter ( 'the_content_more_link' , 'generate_content_more' );
/**
* Prints the read more HTML to post content using the more tag .
*
* @ since 0.1
*
* @ param string $more The string shown within the more link .
* @ return string The HTML for the more link
*/
function generate_content_more ( $more ) {
return apply_filters (
'generate_content_more_link_output' ,
sprintf (
'<p class="read-more-container"><a title="%1$s" class="read-more content-read-more" href="%2$s" aria-label="%4$s">%3$s</a></p>' ,
the_title_attribute ( 'echo=0' ),
esc_url ( get_permalink ( get_the_ID () ) . apply_filters ( 'generate_more_jump' , '#more-' . get_the_ID () ) ),
__ ( 'Read more' , 'generatepress' ),
sprintf (
/* translators: Aria-label describing the read more button */
_x ( 'More on %s' , 'more on post title' , 'generatepress' ),
the_title_attribute ( 'echo=0' )
)
)
);
}
}
add_action ( 'wp' , 'generate_add_post_meta' , 5 );
/**
* Add our post meta items to the page .
*
* @ since 3.0 . 0
*/
function generate_add_post_meta () {
$header_items = generate_get_header_entry_meta_items ();
$header_post_types = apply_filters (
'generate_entry_meta_post_types' ,
array (
'post' ,
)
);
if ( in_array ( get_post_type (), $header_post_types ) && ! empty ( $header_items ) ) {
add_action ( 'generate_after_entry_title' , 'generate_post_meta' );
}
$footer_items = generate_get_footer_entry_meta_items ();
$footer_post_types = apply_filters (
'generate_footer_meta_post_types' ,
array (
'post' ,
)
);
if ( in_array ( get_post_type (), $footer_post_types ) && ! empty ( $footer_items ) ) {
add_action ( 'generate_after_entry_content' , 'generate_footer_meta' );
}
}
if ( ! function_exists ( 'generate_post_meta' ) ) {
/**
* Build the post meta .
*
* @ since 1.3 . 29
*/
function generate_post_meta () {
?>
< div class = " entry-meta " >
< ? php generate_posted_on (); ?>
</ div >
< ? php
}
}
if ( ! function_exists ( 'generate_footer_meta' ) ) {
/**
* Build the footer post meta .
*
* @ since 1.3 . 30
*/
function generate_footer_meta () {
?>
< footer class = " entry-meta " >
< ? php generate_entry_meta (); ?>
</ footer >
< ? php
}
}
add_action ( 'generate_after_loop' , 'generate_do_post_navigation' );
/**
* Add our post navigation after post loops .
*
* @ since 3.0 . 0
* @ param string $template The template of the current action .
*/
function generate_do_post_navigation ( $template ) {
$templates = apply_filters (
'generate_post_navigation_templates' ,
array (
'index' ,
'archive' ,
'search' ,
)
);
if ( in_array ( $template , $templates ) && apply_filters ( 'generate_show_post_navigation' , true ) ) {
generate_content_nav ( 'nav-below' );
}
}