Как использовать функцию get_permalink() в WordPress: примеры и аргументы

# GET_PERMALINK() │ WP 1.0.0

Функция get_permalink() позволяет получить постоянную ссылку на текущую или указанную запись. Однако она не выводит ссылку на экран, а возвращает её в переменную.

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

Эту функцию можно использовать вне цикла WordPress. Для этого необходимо указать первый параметр $id — ID записи, на которую вы хотите получить ссылку.

Функция возвращает URL для любого типа записи, включая статические страницы и новые типы записей, добавленные с помощью функции register_post_type.

Если вы не указываете параметр ID и используете эту функцию вне цикла на архивных страницах (категории, архив по дате, архив по авторам и т.д.), то функция вернёт ссылку на последнюю запись, отображаемую на текущей архивной странице, а не на текущую страницу.

### Применение

Функция использует следующие функции:
- get_post_permalink()
- get_attachment_link()
- get_page_link()

Она также используется следующими функциями:
- get_privacy_policy_url()
- comments_popup_link()
- get_comments_link()
- get_comments_pagenum_link()
- wp_get_canonical_url()
- get_post_embed_url()
- the_permalink()
- get_the_permalink()

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

Функция возвращает строку с URL постоянной ссылки или false, если запись не существует.

### Аргументы функции

```php
get_permalink( $post, $leavename );
  • $post (int/WP_Post) — ID записи или объект записи, ссылку на которую мы хотим получить. По умолчанию используется глобальная переменная $post.
  • $leavename (true/false) — сохранять ли имя записи в ссылке. То есть, не заменять ли тег %postname% на имя записи. По умолчанию — false.

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

Пример 1: Получение ссылки на текущую запись

Чтобы получить ссылку на запись внутри цикла WordPress, используйте команду echo:

Это эквивалентно:

Пример 2: Получение ссылок на определённые записи

Выводим список с ссылками на страницы с ID 1 и 10:

Пример 3: Использование со вторым параметром

Чтобы оставить тег %postname% неизменным, например, при такой структуре ссылок /%post_id%/%postname%, функция будет работать так:

// отобразит: http://example.com/185/%postname%

Код функции

function get_permalink( $post = 0, $leavename = false ) {
    $rewritecode = array(
        '%year%',
        '%monthnum%',
        '%day%',
        '%hour%',
        '%minute%',
        '%second%',
        $leavename ? '' : '%postname%',
        '%post_id%',
        '%category%',
        '%author%',
        $leavename ? '' : '%pagename%',
    );

    if ( is_object( $post ) && isset( $post->filter ) && 'sample' === $post->filter ) {
        $sample = true;
    } else {
        $post   = get_post( $post );
        $sample = false;
    }

    if ( empty( $post->ID ) ) {
        return false;
    }

    if ( 'page' === $post->post_type ) {
        return get_page_link( $post, $leavename, $sample );
    } elseif ( 'attachment' === $post->post_type ) {
        return get_attachment_link( $post, $leavename );
    } elseif ( in_array( $post->post_type, get_post_types( array( '_builtin' => false ) ), true ) ) {
        return get_post_permalink( $post, $leavename, $sample );
    }

    $permalink = get_option( 'permalink_structure' );

    $permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename );

    if ( $permalink && ! wp_force_plain_post_permalink( $post ) ) {
        $category = '';
        if ( str_contains( $permalink, '%category%' ) ) {
            $cats = get_the_category( $post->ID );
            if ( $cats ) {
                $cats = wp_list_sort( $cats, array( 'term_id' => 'ASC' ) );
                $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );
                $category_object = get_term( $category_object, 'category' );
                $category = $category_object->slug;
                if ( $category_object->parent ) {
                    $category = get_category_parents( $category_object->parent, false, '/', true ) . $category;
                }
            }
            if ( empty( $category ) ) {
                $default_category = get_term( get_option( 'default_category' ), 'category' );
                if ( $default_category && ! is_wp_error( $default_category ) ) {
                    $category = $default_category->slug;
                }
            }
        }

        $author = '';
        if ( str_contains( $permalink, '%author%' ) ) {
            $authordata = get_userdata( $post->post_author );
            $author = $authordata->user_nicename;
        }

        $date = explode( ' ', str_replace( array( '-', ':' ), ' ', $post->post_date ) );

        $rewritereplace = array(
            $date[0],
            $date[1],
            $date[2],
            $date[3],
            $date[4],
            $date[5],
            $post->post_name,
            $post->ID,
            $category,
            $author,
            $post->post_name,
        );

        $permalink = home_url( str_replace( $rewritecode, $rewritereplace, $permalink ) );
        $permalink = user_trailingslashit( $permalink, 'single' );

    } else {
        $permalink = home_url( '?p=' . $post->ID );
    }

    return apply_filters( 'post_link', $permalink, $post, $leavename );
}

Заключение

Функция get_permalink() является полезным инструментом для получения постоянных ссылок на записи в WordPress, позволяя вам управлять структурой URL-адресов вашего сайта. Используйте её в своих проектах для создания удобных и понятных ссылок.

Leave a Reply

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