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. Виберіть 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 тощо.
Приклади
#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;
}
Так як тут змінюються лише лейбли, то подібне завдання оптимальніше вирішити через спеціальний хук-фільтр дивіться тут .
#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;
}
Проблема: неправильне посилання на архів із записами
Функція 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 | Введено. |