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 | Введено. |
Де викликається хук
Де використовується хук у WordPress
Використання не знайдено.