register_post_type_args
Позволяет изменить параметры, переданные функции 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. See the register_post_type() function for accepted 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 и так далее.
Примеры
#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 Включим архивную страницу для Записей
Данный код тестировался не в полной мере и опубликован лишь как пример использования описываемого хука.
Код корректно работает с ЧПУ вида "Название записи" - 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;
}
Проблема: неправильная ссылка на архив с записями
Функция 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' ),
] );
}
}
#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 | Введена. |
Где вызывается хук
$args = apply_filters( 'register_post_type_args', $args, $this->name );