get_adjacent_post() WP 2.5.0

Отримує об’єкт сусіднього посту (наступного або попереднього) із зазначеної таксономії (за замовчуванням).

Працює з усіма типами записів (з типом запису поточного поста – Global $post ).

Нотатка: неможливо отримати одночасно наступний та попередній пости.

Повертає

WP_Post|null|Строку.

  • WP_Post – Об’єкт запису у разі успіху.
  • Null– Якщо глобальна змінна $post не встановлено.
  • Пустую строку– якщо немає відповідного посту.

Використання

get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );
$in_same_term
(логічний)
Чи повинен пост перебувати у тій самій рубриці. true – отримувати пости з тієї ж рубрики.


Типово: false
$excluded_terms
(рядок)
З яких категорій посади отримувати не потрібно. Вказуємо ID категорій, через кому.


За замовчуванням: ”
$previous
(логічний)
true – отримувати попередній пост. false – отримувати наступний пост.


Типово: true
$taxonomy
(рядок)
Назва таксономії в якій потрібно шукати перед/слід. запис, коли увімкнено параметр
$in_same_term .


Типово: ‘category’

Приклади

0

#1 Виведемо на екран посилання на наступний пост:

$next_post = get_adjacent_post(0, '', 0);
if($next_post)
	echo '<a href="'. get_permalink($next_post->ID) .'">'. $next_post->post_title .'</a>';

Виведемо на екран посилання на попередній пост:

$prev_post = get_adjacent_post();
if( $prev_post )
	echo '<a href="'. get_permalink($prev_post->ID) .'">'. $prev_post->post_title .'</a>';
0

#2 Приклад полів об’єкта, який повертає функцію:

$prev_post = get_adjacent_post();
print_r ($ prev_post);

// Отримаємо:

WP_Post {
	[ID] => 25
	[post_author] => 1
	[post_date] => 2010-04-05 04:24:04
	[post_date_gmt] => 2010-04-05 00:24:04
	[post_content] => Якщо у вас раптово є, що обговорити, пройдіться клавіатурою за формою нижче:
	[post_title] => Зворотній зв'язок
	[post_excerpt] =>
	[post_status] => publish
	[comment_status] => closed
	[ping_status] => closed
	[post_password] =>
	[post_name] => contacts
	[to_ping] =>
	[pinged] =>
	[post_modified] => 2010-08-16 17:41:20
	[post_modified_gmt] => 2010-08-16 13:41:20
	[post_content_filtered] =>
	[post_parent] => 0
	[guid] => http://wp-kama.ru/contacts
	[menu_order] => 0
	[post_type] => page
	[post_mime_type] =>
	[comment_count] => 0
}

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.5.0Введено.

Код get_adjacent_post() WP 6.0.2

function get_adjacent_post( $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
	Global $wpdb;

	$post = get_post();
	if ( ! $post || ! taxonomy_exists( $taxonomy ) ) {
		return null;
	}

	$current_post_date = $post->post_date;

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

	if ( ! empty( $excluded_terms ) && ! is_array( $excluded_terms ) ) {
		// Back-compat, $excluded_terms використаний для $excluded_categories with IDs separated by " and ".
		if ( false !== strpos( $excluded_terms, ' and ' ) ) {
			_deprecated_argument(
				__FUNCTION__,
				'3.3.0',
				sprintf(
					/* translators: %s: The word 'and'. */
					__( 'Use commas instead of %s to separate excluded terms.' ),
					"and"
				)
			);
			$excluded_terms = explode(' and ', $excluded_terms );
		} else {
			$excluded_terms = explode(',', $excluded_terms);
		}

		$excluded_terms = array_map( 'intval', $excluded_terms );
	}

	/**
	 * Filters the IDs of terms excluded from adjacent post queries.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' або 'previous'.
	 *
	 * Possible hook names include:
	 *
	 * - `get_next_post_excluded_terms`
	 * - `get_previous_post_excluded_terms`
	 *
	 * @ Since 4.4.0
	 *
	 * @param array|string $excluded_terms Array of excluded term IDs. Empty string if none булизабезпечені.
	 */
	$excluded_terms = apply_filters( "get_{$adjacent}_post_excluded_terms", $excluded_terms );

	if ($in_same_term ||! empty($excluded_terms)) {
		if ( $in_same_term ) {
			$join .= " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
			$where .= $wpdb->prepare( 'AND tt.taxonomy = %s', $taxonomy );

			if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
				return '';
			}
			$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );

			// Remove any exclusions from the term array to include.
			$term_array = array_diff( $term_array, (array) $excluded_terms );
			$term_array = array_map( 'intval', $term_array );

			if ( ! $term_array || is_wp_error( $term_array ) ) {
				return '';
			}

			$where .= 'AND tt.term_id IN (' . implode( ',', $term_array ) . ')';
		}

		if ( ! empty( $excluded_terms ) ) {
			$where .= " AND p.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships tr LEFT JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) WHERE tt.term. ( ',', array_map( 'intval', $excluded_terms ) ) . ') )';
		}
	}

	// 'post_status' clause depends on the current user.
	if ( is_user_logged_in() ) {
		$user_id = get_current_user_id();

		$post_type_object = get_post_type_object( $post->post_type );
		if ( empty( $post_type_object ) ) {
			$post_type_cap = $post->post_type;
			$read_private_cap = 'read_private_'. $post_type_cap. 's';
		} else {
			$read_private_cap = $post_type_object->cap->read_private_posts;
		}

		/*
		 * Results повинні включати private posts belonging to the current user, or private posts where the
		 * current user has the 'read_private_posts' cap.
		 */
		$private_states = get_post_stati( array( 'private' => true ) );
		$where .= "AND (p.post_status = 'publish'");
		foreach ( $private_states as $state ) {
			if ( current_user_can( $read_private_cap ) ) {
				$where .= $wpdb->prepare( ' OR p.post_status = %s', $state );
			} else {
				$where .= $wpdb->prepare( ' OR (p.post_author = %d AND p.post_status = %s)', $user_id, $state );
			}
		}
		$where .= ')';
	} else {
		$where .= "AND p.post_status = 'publish'";
	}

	$op = $previous? '<': '>';
	$order = $previous? 'DESC' : 'ASC';

	/**
	 * Filters JOIN clause в SQL для an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' або 'previous'.
	 *
	 * Possible hook names include:
	 *
	 * - `get_next_post_join`
	 * - `get_previous_post_join`
	 *
	 * @ Since 2.5.0
	 * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.
	 *
	 * @param string $join JOIN clause in the SQL.
	 * @param bool $in_same_term Whether post should be in a same taxonomy term.
	 * @param array $excluded_terms Array of excluded term IDs.
	 * @param string $taxonomy Taxonomy. Використовується для визначення терміну використання, коли $in_same_term є true.
	 * @param WP_Post $post WP_Post об'єкт.
	 */
	$join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_term, $excluded_terms, $taxonomy, $post );

	/**
	 * Filters the WHERE clause в SQL для an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' або 'previous'.
	 *
	 * Possible hook names include:
	 *
	 * - `get_next_post_where`
	 * - `get_previous_post_where`
	 *
	 * @ Since 2.5.0
	 * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.
	 *
	 * @param string $where The `WHERE` clause in the SQL.
	 * @param bool $in_same_term Whether post should be in a same taxonomy term.
	 * @param array $excluded_terms Array of excluded term IDs.
	 * @param string $taxonomy Taxonomy. Використовується для визначення терміну використання, коли $in_same_term є true.
	 * @param WP_Post $post WP_Post об'єкт.
	 */
	$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms, $taxonomy, $post);

	/**
	 * Filters ORDER BY clause в SQL для an adjacent post query.
	 *
	 * The dynamic portion of the hook name, `$adjacent`, refers to the type
	 * of adjacency, 'next' або 'previous'.
	 *
	 * Possible hook names include:
	 *
	 * - `get_next_post_sort`
	 * - `get_previous_post_sort`
	 *
	 * @ Since 2.5.0
	 * @since 4.4.0 Added `$post` parameter.
	 * @since 4.9.0 Added `$order` parameter.
	 *
	 * @param string $order_by The `ORDER BY` clause in the SQL.
	 * @param WP_Post $post WP_Post об'єкт.
	 * @param string $order Sort order. 'DESC' for previous post, 'ASC' for next.
	 */
	$sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1", $post, $order );

	$query = "SELECT p.ID FROM $wpdb->posts AS p $join $where $sort";
	$query_key = 'adjacent_post_'. md5($query);
	$result = wp_cache_get($query_key, 'counts');
	if ( false !== $result ) {
		if ($result) {
			$result = get_post($result);
		}
		return $result;
	}

	$result = $wpdb->get_var($query);
	if ( null === $result ) {
		$result = '';
	}

	wp_cache_set($query_key, $result, 'counts');

	if ($result) {
		$result = get_post($result);
	}

	return $result;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *