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’
Приклади
#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>';
#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.
список змін
Код get_adjacent_post() 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;
}
Зв’язані функції