PluginProbe
Gutenberg / 23.6.2
Gutenberg v23.6.2
23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 7.4.0 All 402 releases
gutenberg / lib / experimental / knowledge / class-gutenberg-knowledge-post-type.php

class-gutenberg-knowledge-post-type.php in Gutenberg 23.6.2, at lib/experimental/knowledge/class-gutenberg-knowledge-post-type.php

175 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Knowledge Post Type registration.
4 *
5 * @package gutenberg
6 */
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit;
10 }
11
12 /**
13 * Handles registration of the Knowledge custom post type.
14 */
15 class Gutenberg_Knowledge_Post_Type {
16
17 /**
18 * The post type name.
19 *
20 * @var string
21 */
22 const POST_TYPE = 'wp_knowledge';
23
24 /**
25 * The taxonomy name for knowledge types.
26 *
27 * @var string
28 */
29 const TAXONOMY = 'wp_knowledge_type';
30
31 /**
32 * Taxonomy term slug for the `guideline` knowledge type.
33 *
34 * Guidelines are loaded by default when applicable; every row managed by
35 * the Settings → Guidelines page carries this term. Scope rows are further
36 * identified by the `guideline-` slug prefix (see the reservation guard in
37 * knowledge.php).
38 *
39 * @var string
40 */
41 const TERM_GUIDELINE = 'guideline';
42
43 /**
44 * Register the custom post type.
45 */
46 public static function register(): void {
47 if ( post_type_exists( self::POST_TYPE ) ) {
48 return;
49 }
50
51 register_post_type(
52 self::POST_TYPE,
53 array(
54 'labels' => array(
55 'name' => _x( 'Guidelines', 'post type general name', 'gutenberg' ),
56 'singular_name' => _x( 'Guideline', 'post type singular name', 'gutenberg' ),
57 'add_new' => __( 'Add Guideline', 'gutenberg' ),
58 'add_new_item' => __( 'Add Guideline', 'gutenberg' ),
59 'all_items' => __( 'All Guidelines', 'gutenberg' ),
60 'edit_item' => __( 'Edit Guideline', 'gutenberg' ),
61 'filter_items_list' => __( 'Filter guidelines list', 'gutenberg' ),
62 'item_published' => __( 'Guideline published.', 'gutenberg' ),
63 'item_published_privately' => __( 'Guideline published privately.', 'gutenberg' ),
64 'item_reverted_to_draft' => __( 'Guideline reverted to draft.', 'gutenberg' ),
65 'item_scheduled' => __( 'Guideline scheduled.', 'gutenberg' ),
66 'item_updated' => __( 'Guideline updated.', 'gutenberg' ),
67 'items_list' => __( 'Guidelines list', 'gutenberg' ),
68 'items_list_navigation' => __( 'Guidelines list navigation', 'gutenberg' ),
69 'new_item' => __( 'New Guideline', 'gutenberg' ),
70 'not_found' => __( 'No guidelines found.', 'gutenberg' ),
71 'not_found_in_trash' => __( 'No guidelines found in Trash.', 'gutenberg' ),
72 'search_items' => __( 'Search Guidelines', 'gutenberg' ),
73 'view_item' => __( 'View Guideline', 'gutenberg' ),
74 'view_items' => __( 'View Guidelines', 'gutenberg' ),
75 ),
76 'public' => false,
77 // Knowledge rows have no native post-type screens; management
78 // flows through the Settings → Guidelines page (see
79 // load.php) and the REST API.
80 'show_ui' => false,
81 'show_in_rest' => true,
82 'rest_base' => 'knowledge',
83
84 'rest_controller_class' => Gutenberg_Knowledge_REST_Controller::class,
85
86 // The primitive capabilities follow the standard plural form
87 // (`edit_knowledge_items`) while the per-post meta capabilities
88 // keep the singular form (`edit_knowledge_item`) — the same
89 // primitive/meta split WordPress uses for posts (`edit_posts` vs
90 // `edit_post`). The `*_knowledge_item` forms are never granted;
91 // `map_meta_cap()` resolves them onto the primitives.
92 'capability_type' => array( 'knowledge_item', 'knowledge_items' ),
93 'map_meta_cap' => true,
94 // `read` is remapped so Subscribers (who hold the base `read`
95 // cap) are blocked at the post-type door. Every other primitive
96 // defaults to a knowledge_items-suffixed cap synthesized by
97 // `wp_maybe_grant_knowledge_caps()`.
98 'capabilities' => array(
99 'read' => 'read_knowledge_items',
100 ),
101 'supports' => array( 'title', 'editor', 'excerpt', 'author', 'revisions' ),
102 'hierarchical' => false,
103 'has_archive' => false,
104 'rewrite' => false,
105 'query_var' => false,
106 'can_export' => true,
107 )
108 );
109
110 /*
111 * Disable autosave endpoints for knowledge. 'editor' support implies
112 * 'autosave', but knowledge is headless storage with no editor session,
113 * so the autosave REST routes have no consumer. Revision history is
114 * retained.
115 */
116 remove_post_type_support( self::POST_TYPE, 'autosave' );
117
118 register_taxonomy(
119 self::TAXONOMY,
120 self::POST_TYPE,
121 array(
122 'public' => false,
123 'publicly_queryable' => false,
124 'hierarchical' => true,
125 'labels' => array(
126 'name' => _x( 'Guideline Types', 'taxonomy general name', 'gutenberg' ),
127 'singular_name' => _x( 'Guideline Type', 'taxonomy singular name', 'gutenberg' ),
128 'add_new_item' => __( 'Add Guideline Type', 'gutenberg' ),
129 'add_or_remove_items' => __( 'Add or remove guideline types', 'gutenberg' ),
130 'back_to_items' => __( '&larr; Go to Guideline Types', 'gutenberg' ),
131 'edit_item' => __( 'Edit Guideline Type', 'gutenberg' ),
132 'item_link' => __( 'Guideline Type Link', 'gutenberg' ),
133 'item_link_description' => __( 'A link to a guideline type.', 'gutenberg' ),
134 'items_list' => __( 'Guideline Types list', 'gutenberg' ),
135 'items_list_navigation' => __( 'Guideline Types list navigation', 'gutenberg' ),
136 'new_item_name' => __( 'New Guideline Type Name', 'gutenberg' ),
137 'no_terms' => __( 'No guideline types', 'gutenberg' ),
138 'not_found' => __( 'No guideline types found.', 'gutenberg' ),
139 'search_items' => __( 'Search Guideline Types', 'gutenberg' ),
140 'update_item' => __( 'Update Guideline Type', 'gutenberg' ),
141 'view_item' => __( 'View Guideline Type', 'gutenberg' ),
142 ),
143 /*
144 * Editing and assigning terms reuse the `wp_knowledge` primitive
145 * `edit_knowledge_items` so that anyone who can edit a knowledge
146 * row can also lazily create and assign its type. Managing or
147 * deleting the type vocabulary itself stays an administrator task.
148 */
149 'capabilities' => array(
150 'manage_terms' => 'manage_options',
151 'edit_terms' => 'edit_knowledge_items',
152 'delete_terms' => 'manage_options',
153 'assign_terms' => 'edit_knowledge_items',
154 ),
155 'query_var' => false,
156 'rewrite' => false,
157 // Headless, like the post type: knowledge type terms are managed
158 // through the REST API, not a wp-admin taxonomy screen.
159 'show_ui' => false,
160 'show_in_nav_menus' => false,
161 'show_in_rest' => true,
162 )
163 );
164
165 add_filter( 'user_has_cap', 'wp_maybe_grant_knowledge_caps', 1, 4 );
166 add_action( 'save_post_' . self::POST_TYPE, 'wp_knowledge_ensure_default_type_term' );
167 add_filter( 'wp_insert_term_data', 'wp_knowledge_maybe_map_term_label', 10, 2 );
168
169 // Sanitize guideline content and re-stamp registry scope titles on the
170 // REST insert path. Slug uniqueness is left to WordPress: the published
171 // row keeps its exact slug and duplicates are suffixed (see knowledge.php).
172 add_filter( 'rest_pre_insert_' . self::POST_TYPE, 'wp_knowledge_guard_guideline_row', 10, 2 );
173 }
174 }
175