+/**
+ * Return navigation to next/previous post when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @param array $args {
+ * Optional. Default post navigation arguments. Default empty array.
+ *
+ * @type string $prev_text Anchor text to display in the previous post link. Default `%title`.
+ * @type string $next_text Anchor text to display in the next post link. Default `%title`.
+ * @type string $screen_reader_text Screen reader text for nav element. Default 'Post navigation'.
+ * }
+ * @return string Markup for post links.
+ */
+function get_the_post_navigation( $args = array() ) {
+ $args = wp_parse_args( $args, array(
+ 'prev_text' => '%title',
+ 'next_text' => '%title',
+ 'screen_reader_text' => __( 'Post navigation' ),
+ ) );
+
+ $navigation = '';
+ $previous = get_previous_post_link( '<div class="nav-previous">%link</div>', $args['prev_text'] );
+ $next = get_next_post_link( '<div class="nav-next">%link</div>', $args['next_text'] );
+
+ // Only add markup if there's somewhere to navigate to.
+ if ( $previous || $next ) {
+ $navigation = _navigation_markup( $previous . $next, 'post-navigation', $args['screen_reader_text'] );
+ }
+
+ return $navigation;
+}
+
+/**
+ * Display navigation to next/previous post when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @param array $args Optional. See {@see get_the_post_navigation()} for available
+ * arguments. Default empty array.
+ */
+function the_post_navigation( $args = array() ) {
+ echo get_the_post_navigation( $args );
+}
+
+/**
+ * Return navigation to next/previous set of posts when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @global WP_Query $wp_query WordPress Query object.
+ *
+ * @param array $args {
+ * Optional. Default posts navigation arguments. Default empty array.
+ *
+ * @type string $prev_text Anchor text to display in the previous posts link.
+ * Default 'Older posts'.
+ * @type string $next_text Anchor text to display in the next posts link.
+ * Default 'Newer posts'.
+ * @type string $screen_reader_text Screen reader text for nav element.
+ * Default 'Posts navigation'.
+ * }
+ * @return string Markup for posts links.
+ */
+function get_the_posts_navigation( $args = array() ) {
+ $navigation = '';
+
+ // Don't print empty markup if there's only one page.
+ if ( $GLOBALS['wp_query']->max_num_pages > 1 ) {
+ $args = wp_parse_args( $args, array(
+ 'prev_text' => __( 'Older posts' ),
+ 'next_text' => __( 'Newer posts' ),
+ 'screen_reader_text' => __( 'Posts navigation' ),
+ ) );
+
+ $next_link = get_previous_posts_link( $args['next_text'] );
+ $prev_link = get_next_posts_link( $args['prev_text'] );
+
+ if ( $prev_link ) {
+ $navigation .= '<div class="nav-previous">' . $prev_link . '</div>';
+ }
+
+ if ( $next_link ) {
+ $navigation .= '<div class="nav-next">' . $next_link . '</div>';
+ }
+
+ $navigation = _navigation_markup( $navigation, 'posts-navigation', $args['screen_reader_text'] );
+ }
+
+ return $navigation;
+}
+
+/**
+ * Display navigation to next/previous set of posts when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @param array $args Optional. See {@see get_the_posts_navigation()} for available
+ * arguments. Default empty array.
+ */
+function the_posts_navigation( $args = array() ) {
+ echo get_the_posts_navigation( $args );
+}
+
+/**
+ * Return a paginated navigation to next/previous set of posts,
+ * when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @param array $args {
+ * Optional. Default pagination arguments, {@see paginate_links()}.
+ *
+ * @type string $screen_reader_text Screen reader text for navigation element.
+ * Default 'Posts navigation'.
+ * }
+ * @return string Markup for pagination links.
+ */
+function get_the_posts_pagination( $args = array() ) {
+ $navigation = '';
+
+ // Don't print empty markup if there's only one page.
+ if ( $GLOBALS['wp_query']->max_num_pages > 1 ) {
+ $args = wp_parse_args( $args, array(
+ 'mid_size' => 1,
+ 'prev_text' => _x( 'Previous', 'previous post' ),
+ 'next_text' => _x( 'Next', 'next post' ),
+ 'screen_reader_text' => __( 'Posts navigation' ),
+ ) );
+
+ // Make sure we get a string back. Plain is the next best thing.
+ if ( isset( $args['type'] ) && 'array' == $args['type'] ) {
+ $args['type'] = 'plain';
+ }
+
+ // Set up paginated links.
+ $links = paginate_links( $args );
+
+ if ( $links ) {
+ $navigation = _navigation_markup( $links, 'pagination', $args['screen_reader_text'] );
+ }
+ }
+
+ return $navigation;
+}
+
+/**
+ * Display a paginated navigation to next/previous set of posts,
+ * when applicable.
+ *
+ * @since 4.1.0
+ *
+ * @param array $args Optional. See {@see get_the_posts_pagination()} for available arguments.
+ * Default empty array.
+ */
+function the_posts_pagination( $args = array() ) {
+ echo get_the_posts_pagination( $args );
+}
+
+/**
+ * Wraps passed links in navigational markup.
+ *
+ * @since 4.1.0
+ * @access private
+ *
+ * @param string $links Navigational links.
+ * @param string $class Optional. Custom class for nav element. Default: 'posts-navigation'.
+ * @param string $screen_reader_text Optional. Screen reader text for nav element. Default: 'Posts navigation'.
+ * @return string Navigation template tag.
+ */
+function _navigation_markup( $links, $class = 'posts-navigation', $screen_reader_text = '' ) {
+ if ( empty( $screen_reader_text ) ) {
+ $screen_reader_text = __( 'Posts navigation' );
+ }
+
+ $template = '
+ <nav class="navigation %1$s" role="navigation">
+ <h2 class="screen-reader-text">%2$s</h2>
+ <div class="nav-links">%3$s</div>
+ </nav>';
+
+ return sprintf( $template, sanitize_html_class( $class ), esc_html( $screen_reader_text ), $links );
+}
+