WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

register_post_type_args хук-фильтр . WP 4.4.0

Позволяет изменить параметры, переданные функции register_post_type при регистрации любого типа записи. Срабатывает до того, как сформированы дефолтные параметры, соединены с передаваемыми и применены.

Со всеми параметрами, которые проходят через хук-фильтр register_post_type_args, можно ознакомиться на странице функции register_post_type.

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

add_filter( 'register_post_type_args', 'filter_function_name_8795', 10, 2 );
function filter_function_name_8795( $args, $post_type ){
	// Фильтруем...

	return $args;
}
$args(массив)
Параметры, переданные функции register_post_type() вторым аргументом для регистрации нового типа поста.
$post_type(строка)
Название типа записи, указываемое первым аргументом функции register_post_type(), например post, page, product и так далее.

Примеры

#1 Изменим текст "Записи" на "Новости"

Простой пример, как "Записи" в админ-сайдбаре и админ-баре заменить на "Новости".

add_filter( 'register_post_type_args', 'filter_register_post_type_args', 10, 2 );

function filter_register_post_type_args( $args, $post_type ) {

	if ( 'post' == $post_type ) {
		$args['labels'] = [
			'name'          => 'Новости',
			'singular_name' => 'Новость',
		];
	}

	return $args;
}

Так как здесь изменяются только лейблы, то подобную задачу оптимальнее решить через специальный хук-фильтр post_type_labels_(post_type). Хороший полноценный пример смотрите здесь.

#2 Изменим REST маршрут у Записей

По умолчанию Записи для REST запросов доступны по адресу:

http://example.com/wp-json/wp/v2/post

Если Записи используются для публикации Новостей, то логично сделать и REST маршрут соответствующий, например:

http://example.com/wp-json/wp/v2/news

Для этого нужно изменить параметр rest_base при регистрации типа поста "Записи":

add_filter( 'register_post_type_args', 'change_rest_base_posts', 10, 2 );

function change_rest_base_posts( $args, $post_type ) {
	if ( 'post' == $post_type ) {
		$args['rest_base'] = 'news';
	}

	return $args;
}

#3 Включим архивную страницу для Записей

Данный код тестировался не в полной мере и опубликован лишь как пример использования описываемого хука.

По умолчанию, чтобы включить архивную страницу для записей, нужно создать статическую страницу (post_type=page) и затем выбрать её в Настройки - Чтение. Это может показаться неудобным, поэтому можно воспользоваться следующим решением:

add_filter( 'register_post_type_args', 'change_register_post_type_args', 10, 2 );

function change_register_post_type_args ( $args, $post_type ) {
	if ( 'post' === $post_type ) {
		$args['has_archive'] = 'news'; // slug архива
		$args['rewrite']     = true;
	}

	return $args;
}
Проблема: неправильная ссылка на архив с записями

Функция get_post_type_archive_link() будет возвращает ссылку на главную страницу сайта, а не на my-site.com/news/. Воспользуемся фильтром post_type_archive_link, чтобы отдать правильную ссылку.

Решение:

add_filter( 'post_type_archive_link', 'post_type_archive_link__news', 10, 2 );

/**
 * @param string $link
 * @param string $post_type
 *
 * @return bool|string
 */
function post_type_archive_link__news( $link, $post_type ) {
	global $wp_rewrite;

	if ( $post_type === 'post' ) {
		$post_type_obj = get_post_type_object( $post_type );

		/** start @see get_post_type_archive_link() */
		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 );
		}
		/* end */
	}

	return $link;
}
Проблема: нет ссылки на архив в админке

В админке, как у произвольных типов записей, в админ-баре нет ссылки на архив записей во фронте. Воспользуемся хуком admin_bar_menu, чтобы добавить нужный пункт меню в админ-бар.

Решение:

add_action( 'admin_bar_menu', 'admin_bar_add_archive_post_link', 100 );

/**
 * @param WP_Admin_Bar $wp_admin_bar
 */
function admin_bar_add_archive_post_link( $wp_admin_bar ) {
	if ( is_admin() && is_post_type_archive( 'post' ) ) {
		$wp_admin_bar->add_menu( [
			'id'    => 'archive_post_link',
			'title' => 'Просмотр Новостей',
			'href'  => get_post_type_archive_link( 'post' ),
		] );
	}
}

Где вызывается хук

WP_Post_Type::set_props()
register_post_type_args
wp-includes/class-wp-post-type.php 376
$args = apply_filters( 'register_post_type_args', $args, $this->name );

Где используется хук (в ядре WP)

Использование не найдено.
campusboy 3314youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7450
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться