PluginProbe
Gutenberg / 17.2.0
Gutenberg v17.2.0
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 / README.md

README.md in Gutenberg 17.2.0, at lib/README.md

194 lines 9.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 # Gutenberg PHP
2
3 This documentation is intended for developers who are contributing to the PHP code in the Gutenberg plugin, and pertains to files in the `lib` directory.
4
5 The Gutenberg plugin is continuously enhancing existing features and creating new ones. Some features, once considered stable and useful, are merged into Core (the WordPress source code) during a WordPress release. Others remain in the plugin forever or are eventually removed as the minimum supported WordPress version changes.
6
7 During a WordPress release, new features, bugfixes and other changes are "synced" between the Gutenberg plugin and WordPress Core. Consistent naming and directory structures make this process easier by preventing naming conflicts and compartmentalizing release-specific code.
8
9 The following documentation is intended to act as a guide only. If you're unsure about naming or where to place new PHP files, please don't hesitate to ping other contributors on Github or ask in the #core-editor channel on [](https://make.wordpress.org/chat/WordPress Slack](https://make.wordpress.org/chat/](https://make.wordpress.org/chat/).
10
11 ## File structure
12
13 To make it easier for contributors to identify features that should be merged into Core and those that can be deleted, Gutenberg uses the following file structure for its PHP code:
14
15 - `lib/experimental` - Experimental features that exist only in the plugin. They should not be merged into Core.
16 - `lib/compat/wordpress-X.Y` - Stable features that are intended to be merged into Core in a future `X.Y` release, or that were previously merged to Core in the `X.Y` release and remain in the plugin for backwards compatibility when running the plugin on older versions of WordPress.
17 - `lib/compat/plugin` - Features for backwards compatibility for the plugin consumers. These files don't need to be merged into Core and should have a timeline for when they should be removed from the plugin.
18
19 Files at the root of `/lib` are generally considered to contain "evergreen" code. Such code is both fundamental to the proper functioning of the plugin, and also so often updated that versioning it between WordPress releases is not practical. Changes to these files are merged into Core as required.
20
21 ## Best practices
22
23 There are a few best practices that should be observed when adding new files to the Gutenberg plugin.
24
25 ### Using `gutenberg` suffixes/prefixes vs. `wp` prefixes
26
27 To avoid naming conflicts with WordPress Core and other plugins, the Gutenberg plugin uses the `gutenberg` identifier in many of its PHP classes and function names, e.g., `WP_Theme_JSON_Gutenberg` and `gutenberg_get_block_editor_settings`.
28
29 This is especially so for classes and functions whose functionality is ubiquitous and constantly being updated — so-called "evergreen" code. Anything related to `WP_Theme_JSON_Gutenberg` is a good example of this: this class controls the way Gutenberg processes and outputs global styles and much more, and its methods are called in many places. In every aspect of plugin functionality, we want plugin users to have access to the latest versions of these files, even if they are running an older version of WordPress.
30
31 ```php
32 /**
33 * Returns something useful.
34 *
35 * @since 6.2.0 Updates to something even more useful.
36 * @since 6.3.0 Now more useful than ever.
37 *
38 * @return string Something useful.
39 */
40 function gutenberg_get_something_useful() {
41 // ...
42 }
43 ```
44
45 When porting new functions into Core, the function must be renamed to use the `wp_` prefix for functions or a `WP_` prefix for classes.
46
47 ```php
48 /**
49 * Returns something useful.
50 *
51 * @since 6.2.0 Updates to something even more useful.
52 * @since 6.3.0 Now more useful than ever.
53 *
54 * @return string Something useful.
55 */
56 function wp_get_something_useful() {
57 // ...
58 }
59 ```
60
61 Plugin code that is stable and expected to be merged "as-is" into Core in the near future can use the `wp_` prefix for functions or a `WP_` prefix for classes.
62
63 When doing so, care must be taken to ensure that no duplicate declarations to create functions or classes exist between Gutenberg and WordPress core code. A quick codebase search will also help you know if your new names are unique.
64
65 Wrapping such code in `class_exists()` and `function_exists()` checks should be used to ensure it executes in the plugin up until it is merged to Core, or when running the plugin on older versions of WordPress.
66
67 ```php
68 if ( ! function_exists( 'wp_a_new_and_stable_feature' ) ) {
69 /**
70 * A very new and stable feature.
71 *
72 * @return string Something useful.
73 */
74 function wp_a_new_and_stable_feature() {
75 // ...
76 }
77 }
78 ```
79
80 Or for classes:
81
82 ```php
83 /**
84 * WP_A_Stable_Class class
85 *
86 * @package WordPress
87 * @since 6.3.0
88 */
89 if ( class_exists( 'WP_A_Stable_Class' ) ) {
90 return;
91 }
92
93 /**
94 * A very stable class that does something.
95 *
96 * @since 6.3.0
97 */
98 class WP_A_Stable_Class { ... }
99 ```
100
101 Wrapping code in `class_exists()` and `function_exists()` is usually inappropriate for evergreen code, or any plugin code that we expect to undergo constant change between WordPress releases, because it would prevent the latest versions of the code from being used. For example, the statement `class_exists( 'WP_Theme_JSON' )` would return `true` because the class already exists in Core.
102
103 When to use which prefix is a judgement call, but the general rule is that if you're unsure, use the `gutenberg` prefix because it will less likely give rise to naming conflicts.
104
105 #### When not to use plugin-specific prefixes/suffixes
106
107 The above recommendations in relation to plugin-specific prefixes/suffixes are relevant only to files in the `lib` directory and only in the Gutenberg plugin.
108
109 `Gutenberg` prefixes/suffixes _should not_ be used in Core PHP code. When syncing `/lib` files to Core, plugin-specific prefixes/suffixes are generally replaced with their `WP_` or `wp_` equivalents manually.
110
111 Accordingly, unless required to run plugin-only code, you should avoid using plugin-specific prefixes/suffixes in any block PHP code. Core blocks in the plugin are [](https://github.com/WordPress/gutenberg/blob/trunk/docs/contributors/code/release.md#packages-releases-to-npm-and-wordpress-core-updatespublished as NPM packages](https://github.com/WordPress/gutenberg/blob/trunk/docs/contributors/code/release.md#packages-releases-to-npm-and-wordpress-core-updates](https://github.com/WordPress/gutenberg/blob/trunk/docs/contributors/code/release.md#packages-releases-to-npm-and-wordpress-core-updates), which Core consumes as NPM dependencies.
112
113 See [](https://github.com/WordPress/gutenberg/tree/trunk/packages/block-library#naming-convention-for-php-functionsblock naming conventions](https://github.com/WordPress/gutenberg/tree/trunk/packages/block-library#naming-convention-for-php-functions](https://github.com/WordPress/gutenberg/tree/trunk/packages/block-library#naming-convention-for-php-functions) for more information on block naming conventions.
114
115 As always, get in touch with your fellow contributors if you're unsure.
116
117 ### Documentation and annotations
118
119 For every class, method and function in the plugin, refer to the [](https://developer.wordpress.org/coding-standards/inline-documentation-standards/php/WordPress PHP documentation standards](https://developer.wordpress.org/coding-standards/inline-documentation-standards/php/](https://developer.wordpress.org/coding-standards/inline-documentation-standards/php/) when documenting your code.
120
121 It's particularly important to observe annotation standards, and `@since` descriptions that specify the target WordPress version, so that all contributors can easily identify what needs to be (or what already has been) merged to Core and when.
122
123 Developers should also write a brief note about _how_ their feature should be merged to Core, for example, which Core file or function should be patched.
124
125 Notes can be included in the doc comment.
126
127 This helps future developers know what to do when merging Gutenberg features into Core.
128
129 ```php
130 /**
131 * Returns a navigation object for the given slug.
132 *
133 * Should live in `wp-includes/navigation.php` when merged to Core.
134 *
135 * @since 6.3.0
136 *
137 * @param string $slug
138 * @return WP_Navigation
139 */
140 function wp_get_navigation( $slug ) { ... }
141 ```
142
143 ### Group PHP code by _feature_
144
145 Developers should organize PHP into files or folders by _feature_, not by _component_.
146
147 When defining a function that will be hooked, developers should call `add_action` and `add_filter` immediately after the function declaration.
148
149 These two practices make it easier for PHP code to start in one folder (e.g., `lib/experimental`) and eventually move to another using a simple `git mv`.
150
151 #### Good
152
153 ```php
154 // lib/experimental/navigation.php
155
156 function wp_get_navigation( $slug ) { ... }
157
158 function wp_register_navigation_cpt() { ... }
159
160 add_action( 'init', 'wp_register_navigation_cpt' );
161 ```
162
163 #### Not so good
164
165 ```php
166 // lib/experimental/functions.php
167
168 function wp_get_navigation( $slug ) { ... }
169
170 // lib/experimental/post-types.php
171
172 function wp_register_navigation_cpt() { ... }
173
174 // lib/experimental/init.php
175 add_action( 'init', 'wp_register_navigation_cpt' );
176 ```
177
178 ### Requiring files in lib/load.php
179 Should the load order allow it, try to group imports according to WordPress release, then feature. It'll help everyone to quickly recognise the files that belong to specific WordPress releases.
180
181 Existing comments in `lib/load.php` should act as a guide.
182
183 ## When to sync changes to Gutenberg PHP with Core and vice versa
184
185 If you've changed or added PHP files to the Gutenberg plugin, you'll need to confirm whether the changes are to be synced to WordPress Core, and therefore featured in the next release of WordPress.
186
187 The Gutenberg Github pull request in question should be labeled with the `Needs PHP backport` label if the changes are to be synced to Core.
188
189 If so, it is recommended to create a [](https://core.trac.wordpress.org/newticketnew Trac ticket](https://core.trac.wordpress.org/newticket](https://core.trac.wordpress.org/newticket) and submit a pull request to the [](https://github.com/WordPress/wordpress-developWordPress Core Github repository](https://github.com/WordPress/wordpress-develop](https://github.com/WordPress/wordpress-develop) soon after your pull request is merged.
190
191 So too, if you've made changes in WordPress Core to code that also lives in the Gutenberg plugin, these changes will need to be synced (often called "backporting") to Gutenberg. The relevant Gutenberg Github pull request should be labeled with the `Backport from WordPress Core` label.
192
193 If you're unsure, you can always ask for help in the #core-editor channel in [](https://make.wordpress.org/chat/WordPress Slack](https://make.wordpress.org/chat/](https://make.wordpress.org/chat/).
194