Функция GET_BOUNDARY_POST(): WP 2.8.0 – Получение первого или последнего поста на сайте

## Функция GET_BOUNDARY_POST() │ WP 2.8.0

Функция get_boundary_post() позволяет получить первый или последний пост на сайте в зависимости от даты публикации. 

### Что она делает?

С помощью этой функции можно получить первый или последний пост из той же категории, к которой относится текущий пост. Также можно указать категории, посты из которых нужно исключить. Для этого используются параметры $in_same_term и $excluded_terms.

#### Возвращаемое значение

- **Array** — когда данные успешно получены.
- **Пустой массив** — когда нет постов (например, если посты на сайте отсутствуют).
- **null** — если:
  - глобальная переменная $post не задана.
  - текущая страница не является постом.
  - текущая страница является вложением.
  - указанная таксономия не существует.

### Использование

```php
get_boundary_post( $in_same_term, $excluded_terms, $start, $taxonomy );
  • $in_same_term (true/false): Получать ли пост из той же категории, что и текущий пост.

    • true — получить первый/последний пост из той же категории.
    • По умолчанию: false
  • $excluded_terms (array/string): ID категорий (через запятую или массив), посты из которых будут исключены.

    • По умолчанию: ''
  • $start (true/false): true, если хотите показать первый пост. false, если хотите показать последний пост.

    • По умолчанию: true
  • $taxonomy (string): Название таксономии для параметра $excluded_categories.

    • По умолчанию: 'category'

Примеры использования

Пример 1: Получить заголовок последнего поста текущей категории

$last = get_boundary_post(true, '', false)[0];
echo $last->post_title;

Пример 2: Получить первый пост на блоге

$first_post = get_boundary_post()[0];
echo $first_post->post_title;

Пример 3: Другие примеры

// последний пост на блоге, исключая категории 5 и 20
$last_post = get_boundary_post(false, '5,20', true)[0];

// последний пост из категории текущего поста
$last_post_of_the_cat = get_boundary_post(true, '', false)[0];

// последний пост таксономии my_tax
$last_post = get_boundary_post(false, '', true, 'my_tax')[0];

Пример 4: Что возвращает функция?

Функция возвращает массив объектов типа [WP_Post].

$boundary_post = get_boundary_post();

/*
Array
(
    [0] => WP_Post Object (
        [ID] => 1000
        [post_author] => 1
        [post_date] => 2009-05-15 14:48:32
        [post_title] => Edge Case: Nested And Mixed Lists
        // другие поля
    )
)
*/

Изменения

Функция была введена в версии 2.8.0.

Код функции

function get_boundary_post( $in_same_term = false, $excluded_terms = '', $start = true, $taxonomy = 'category' ) {
    $post = get_post();

    if ( ! $post || ! is_single() || is_attachment() || ! taxonomy_exists( $taxonomy ) ) {
        return null;
    }

    $query_args = array(
        'posts_per_page'         => 1,
        'order'                  => $start ? 'ASC' : 'DESC',
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    );

    $term_array = array();

    if ( ! is_array( $excluded_terms ) ) {
        if ( ! empty( $excluded_terms ) ) {
            $excluded_terms = explode( ',', $excluded_terms );
        } else {
            $excluded_terms = array();
        }
    }

    if ( $in_same_term || ! empty( $excluded_terms ) ) {
        if ( $in_same_term ) {
            $term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
        }

        if ( ! empty( $excluded_terms ) ) {
            $excluded_terms = array_map( 'intval', $excluded_terms );
            $excluded_terms = array_diff( $excluded_terms, $term_array );

            $inverse_terms = array();
            foreach ( $excluded_terms as $excluded_term ) {
                $inverse_terms[] = $excluded_term * -1;
            }
            $excluded_terms = $inverse_terms;
        }

        $query_args['tax_query'] = array(
            array(
                'taxonomy' => $taxonomy,
                'terms'    => array_merge( $term_array, $excluded_terms ),
            ),
        );
    }

    return get_posts( $query_args );
}

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *