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

Дозволяє змінити параметри, передані функції register_post_type під час реєстрації будь-якого типу запису. Спрацьовує до того, як сформовані дефолтні параметри, з’єднані з переданими та застосовані.

З усіма параметрами, які проходять через хук-фільтр register_post_type_args , можна ознайомитись на сторінці функції register_post_type .

Використання

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

/**
 * Function for `register_post_type_args` filter-hook.
 *
 * @param array $args Array of arguments for registering a post type. Виберіть register_post_type() функцію для отриманих arguments.
 * @param string $post_type Post type key.
 *
 * @return array
 */
function wp_kama_register_post_type_args_filter( $args, $post_type ){

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

Приклади

0

#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;
}

Так як тут змінюються лише лейбли, то подібне завдання оптимальніше вирішити через спеціальний хук-фільтр дивіться тут .

0

#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;
}
0

#3 Включимо архівну сторінку для записів

Цей код тестувався не повною мірою і опублікований лише як приклад використання хука, що описується.

Код коректно працює з ЧПУ виду “Назва запису” – http://example.com/sample-post/ .

За умовчанням, щоб увімкнути архівну сторінку для записів, потрібно створити статичну сторінку (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;
}
Проблема: неправильне посилання на архів із записами

Функція 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' ),
		]);
	}
}
0

#4 Додамо тип запису productна видалення, при видаленні користувача

Нехай у зареєстрованому типі запису productпараметр delete_with_userдорівнює false , тобто. вказано, що при видаленні користувача не потрібно видаляти записи користувача. Змінимо цю поведінку через хук, щоб записи користувача типу productвидалялися разом із користувачем.

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

function change_rest_base_posts( $args, $post_type ) {
	if ( 'product' === $post_type ) {
		$args['delete_with_user'] = true;
	}

	return $args;
}

Аналогічного результату можна досягти і на хуку post_types_to_delete_with_user :

add_filter( 'post_types_to_delete_with_user', 'add_post_type_product_to_delete_with_user', 10, 2);

function add_post_type_product_to_delete_with_user( $post_types_to_delete, $id ){
	$post_types_to_delete[] = 'product';

	return $post_types_to_delete;
}

список змін

З версії 4.4.0Введено.

Де викликається хук

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *