get_post_type_archive_link()WP 3.1.0

Возвращает URL (постоянную ссылку) на страницу архива произвольного типа записи.

Подробнее о том, какие страницы относятся к "post_type_archive" смотрите в описании функции is_post_type_archive()

Если функция не работает или возвращает false, проверьте, включен ли аргумент has_archive => true при регистрации типа поста.

Работает на основе: get_post_type_object()
Хуки из функции

Возвращает

Строку|false. Строку: ссылку (УРЛ) на страницу архива указанного типа поста. Вернет false, если указанного типа поста не существует или если для него не указан параметр has_archive.

Если указать post, то вернет ссылку на главную страницу сайта или на страницу, указанную в админке как "Страница записей".

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

get_post_type_archive_link( $post_type );
$post_type(строка) (обязательный)
Название произвольного типа поста.

Примеры

5

#1 Ссылка на архивную страницу произвольного типа записи

Допустим, с помощью register_post_type() мы создали тип записи book. Давайте выведем ссылку на архивную страницу этого типа (на ней будут расположены все записи этого типа):

<a href="<?php echo get_post_type_archive_link('book'); ?>">Книги</a>

Заметки

  • Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.

Список изменений

С версии 3.1.0 Введена.
С версии 4.5.0 Support for posts was added.

Код get_post_type_archive_link() WP 6.4.3

function get_post_type_archive_link( $post_type ) {
	global $wp_rewrite;

	$post_type_obj = get_post_type_object( $post_type );

	if ( ! $post_type_obj ) {
		return false;
	}

	if ( 'post' === $post_type ) {
		$show_on_front  = get_option( 'show_on_front' );
		$page_for_posts = get_option( 'page_for_posts' );

		if ( 'page' === $show_on_front && $page_for_posts ) {
			$link = get_permalink( $page_for_posts );
		} else {
			$link = get_home_url();
		}
		/** This filter is documented in wp-includes/link-template.php */
		return apply_filters( 'post_type_archive_link', $link, $post_type );
	}

	if ( ! $post_type_obj->has_archive ) {
		return false;
	}

	if ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) ) {
		$struct = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive;
		if ( $post_type_obj->rewrite['with_front'] ) {
			$struct = $wp_rewrite->front . $struct;
		} else {
			$struct = $wp_rewrite->root . $struct;
		}
		$link = home_url( user_trailingslashit( $struct, 'post_type_archive' ) );
	} else {
		$link = home_url( '?post_type=' . $post_type );
	}

	/**
	 * Filters the post type archive permalink.
	 *
	 * @since 3.1.0
	 *
	 * @param string $link      The post type archive permalink.
	 * @param string $post_type Post type name.
	 */
	return apply_filters( 'post_type_archive_link', $link, $post_type );
}