get_adjacent_post_link

Получает ссылку (HTML тег A) на смежные записи (следующая/предыдущая). Можно указать ограничения по рубрикам или элементам таксономий. Используется на страницах типа is_single().

Для этой функции существуют обертки, для удобного использования: previous_post_link() и next_post_link().
Хуки из функции:
(adjacent)_post_link
the_title
Возвращает

Строку: HTML код ссылки:

get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, $previous, $taxonomy );
$format(строка) (обязательный)
Формат ссылки. %link будет заменено на HTML код ссылки <a>. Например, ‘%link →‘ выведет <a …> →.
$link(строка) (обязательный)
Анкор ссылки. ‘%title’ будет заменено на заголовок записи.
$in_same_term(логический)
true – будет искать смежные записи в том же элементе таксономии (рубрике) что и текущая статья, откуда вызывается функция. false – будет искать ссылки из всех элементов таксономии.
По умолчанию: false
$excluded_terms(массив/строка)
ID элементов таксономии, статьи в которых не нужно учитывать. Указывается в массиве или в строке через запятую, например: ‘1,5,15’ или array(1,5,15).
По умолчанию: ”
$previous(логический/строка)
Какую записи искать: следующую за текущей статьей (false) или до текущей статьи (true).
По умолчанию: true
$taxonomy(строка)
Название таксономии с которой работать, если есть параметр $in_same_term.
По умолчанию: ‘category’

Примеры

#1 Демонстрация

Ниже варианты вызова функции и то что в результате выводится:

/**
 * Выводит ссылку (HTML тег A) на смежные записи (следующая/предыдущая).
 * 
 * При отсутствии смежной записи выводит запись с противоположного конца рубрики. Работает в пределах той рубрики, где находится сама запись.
 *
 * @param string $course принимает значение next/prev.
 */
function da_the_adjacent_post_link( $course = '' ){
  global $post;
  $course = ( $course == 'prev' ) ? true : false;
  $order  = ( $course ) ? 'DESC' : 'ASC';
  $class  = ( $course ) ? 'prev' : 'next';

  $link = get_adjacent_post_link( '%link', '%title', true, '', $course );

  if ( ! $link ){
	$term = get_the_terms( $post->ID, 'category' );
	$term = $term[0];
	$article = get_posts([
	  'numberposts' => 1,
	  'exclude'     => $post->ID,
	  'category'    => $term->term_id,
	  'order'       => $order
	]);

	if ( empty($article) )
	  return false;
	else
	  $article = $article[0];

	$link = sprintf( '<a href="%s" rel="%s">%s</a>', get_the_permalink($article->ID), $class, $article->post_title );
  }

  echo $link;
}

Код из


wp-includes/link-template.php

WP 4.7.2

<?php
function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	if ( $previous && is_attachment() )
		$post = get_post( get_post()->post_parent );
	else
		$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );

	if ( ! $post ) {
		$output = '';
	} else {
		$title = $post->post_title;

		if ( empty( $post->post_title ) )
			$title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );

		/** This filter is documented in wp-includes/post-template.php */
		$title = apply_filters( 'the_title', $title, $post->ID );

		$date = mysql2date( get_option( 'date_format' ), $post->post_date );
		$rel = $previous ? 'prev' : 'next';

		$string = '<a href="' . get_permalink( $post ) . '" rel="'.$rel.'">';
		$inlink = str_replace( '%title', $title, $link );
		$inlink = str_replace( '%date', $date, $inlink );
		$inlink = $string . $inlink . '</a>';

		$output = str_replace( '%link', $inlink, $format );
	}

	$adjacent = $previous ? 'previous' : 'next';

	/**
	 * Filters the adjacent post link.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' or 'previous'.
	 *
	 * @since 2.6.0
	 * @since 4.2.0 Added the `$adjacent` parameter.
	 *
	 * @param string  $output   The adjacent post link.
	 * @param string  $format   Link anchor format.
	 * @param string  $link     Link permalink format.
	 * @param WP_Post $post     The adjacent post.
	 * @param string  $adjacent Whether the post is previous or next.
	 */
	return apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post, $adjacent );
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *