Taxonomy_Registrar::compile_args()   B
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 116
Code Lines 61

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 61
c 2
b 0
f 0
dl 0
loc 116
rs 8.8509
cc 3
nc 2
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Registration Registrar for all custom Taxonomies.
7
 *
8
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
11
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
12
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
13
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
14
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
15
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
16
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
18
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19
 *
20
 * @author Glynn Quelch <[email protected]>
21
 * @license http://www.opensource.org/licenses/mit-license.html  MIT License
22
 * @package PinkCrab\Registerables
23
 */
24
25
namespace PinkCrab\Registerables\Registrar;
26
27
use Exception;
28
use PinkCrab\Registerables\Taxonomy;
29
use PinkCrab\Registerables\Registerable_Hooks;
30
use PinkCrab\Registerables\Registrar\Registrar;
31
use PinkCrab\Registerables\Validator\Taxonomy_Validator;
32
use PinkCrab\Registerables\Registrar\Meta_Data_Registrar;
33
use PinkCrab\Registerables\Module\Middleware\Registerable;
34
35
class Taxonomy_Registrar implements Registrar {
36
37
	protected Taxonomy_Validator $validator;
38
	protected Meta_Data_Registrar $meta_data_registrar;
39
40
	public function __construct(
41
		Taxonomy_Validator $validator,
42
		Meta_Data_Registrar $meta_data_registrar
43
	) {
44
		$this->validator           = $validator;
45
		$this->meta_data_registrar = $meta_data_registrar;
46
	}
47
48
	/**
49
	 * Register a taxonomy
50
	 *
51
	 * @param \PinkCrab\Registerables\Module\Middleware\Registerable $registerable
52
	 * @return void
53
	 */
54
	public function register( Registerable $registerable ): void {
55
		/**
56
 * @var Taxonomy $registerable, Validation call below catches no Post_Type Registerables
57
*/
58
59
		if ( ! $this->validator->validate( $registerable ) ) {
60
			throw new Exception(
61
				sprintf(
62
					'Failed validating taxonomy model(%s) with errors: %s',
63
					esc_html( get_class( $registerable ) ),
64
					esc_html( join( ', ', $this->validator->get_errors() ) )
65
				)
66
			);
67
		}
68
69
		// Attempt to register the taxonomy.
70
		try {
71
			$result = \register_taxonomy(
72
				$registerable->slug,
0 ignored issues
show
Bug introduced by
Accessing slug on the interface PinkCrab\Registerables\M...Middleware\Registerable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
73
				$registerable->object_type,
0 ignored issues
show
Bug introduced by
Accessing object_type on the interface PinkCrab\Registerables\M...Middleware\Registerable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
74
				/* @phpstan-ignore-next-line */
75
				$this->compile_args( $registerable )
76
			);
77
78
			if ( is_a( $result, \WP_Error::class ) ) {
79
				throw new Exception( join( $result->get_error_messages() ) );
0 ignored issues
show
Bug introduced by
The call to join() has too few arguments starting with array. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

79
				throw new Exception( /** @scrutinizer ignore-call */ join( $result->get_error_messages() ) );

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
80
			}
81
		} catch ( \Throwable $th ) {
82
			throw new Exception( esc_html( "Failed to register {$registerable->slug} taxonomy ({$th->getMessage()})" ) );
83
		}
84
85
		// Register any associated meta data.
86
		$this->register_meta_data( $registerable );
87
	}
88
89
	/**
90
	 * Registers all meta data for taxonomy.
91
	 *
92
	 * @param \PinkCrab\Registerables\Taxonomy $taxonomy
93
	 * @return void
94
	 */
95
	protected function register_meta_data( Taxonomy $taxonomy ): void {
96
97
		// Get all meta fields for taxonomy.
98
		$meta_fields = $taxonomy->meta_data( array() );
99
100
		// Attempt to register all Meta for taxonomy.
101
		try {
102
			foreach ( $meta_fields as $meta_field ) {
103
				$this->meta_data_registrar->register_for_term( $meta_field, $taxonomy->slug );
104
			}
105
		} catch ( \Throwable $th ) {
106
			throw new Exception( esc_html( $th->getMessage() ) );
107
		}
108
	}
109
110
	/**
111
	 * Compiles the args used to register the taxonomy.
112
	 *
113
	 * @param \PinkCrab\Registerables\Taxonomy $taxonomy
114
	 * @return array<string, string|int|array<string, string>>
115
	 */
116
	protected function compile_args( Taxonomy $taxonomy ): array {
117
		// Create the labels.
118
		$base_labels = array(
119
			'name'                  => $taxonomy->plural,
120
			'singular_name'         => $taxonomy->singular,
121
			'menu_name'             => \ucfirst( \esc_attr( $taxonomy->plural ?? '' ) ),
122
			/* translators: %s: Taxonomy plural name */
123
			'search_items'          => wp_sprintf( _x( 'Search %s', 'Label for searching plural items. Default is ‘Search {taxonomy plural name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
124
			/* translators: %s: Taxonomy plural name */
125
			'popular_items'         => wp_sprintf( _x( 'Popular %s', 'Label for the popular terms', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
126
			/* translators: %s: Taxonomy singular name */
127
			'edit_item'             => wp_sprintf( _x( 'Edit %s', 'Label for editing a singular item. Default is ‘Edit {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
128
			/* translators: %s: Taxonomy singular name */
129
			'view_item'             => wp_sprintf( _x( 'View %s', 'Label for viewing a singular item. Default is ‘View {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
130
			/* translators: %s: Taxonomy singular name */
131
			'update_item'           => wp_sprintf( _x( 'Update %s', 'Label for editing a singular item. Default is ‘Edit {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
132
			/* translators: %s: Taxonomy singular name */
133
			'add_new_item'          => wp_sprintf( _x( 'Add New %s', 'Label for adding a new singular item. Default is ‘Add New {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
134
			/* translators: %s: Taxonomy singular name */
135
			'new_item_name'         => wp_sprintf( _x( 'New %s', 'Label for the new item page title. Default is ‘New {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
136
			/* translators: %s: Taxonomy plural name */
137
			'not_found'             => wp_sprintf( _x( 'No %s found', 'Label used when no items are found. Default is ‘No {taxonomy plural name} found’.', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
138
			/* translators: %s: Taxonomy plural name */
139
			'items_list'            => wp_sprintf( _x( '%s list', 'Label for the table hidden heading. Default is ‘{taxonomy plural name} list’.', 'pinkcrab' ), \ucfirst( \esc_attr( $taxonomy->plural ?? '' ) ) ),
140
			/* translators: %s: Taxonomy plural name */
141
			'items_list_navigation' => wp_sprintf( _x( '%s list navigation', 'Label for the pagination hidden heading. Default is ‘{taxonomy plural name} list’.', 'pinkcrab' ), \ucfirst( \esc_attr( $taxonomy->plural ?? '' ) ) ),
142
			/* translators: %s: Taxonomy plural name */
143
			'all_items'             => wp_sprintf( _x( 'All %s', 'Label for the pagination hidden heading. Default is ‘{taxonomy plural name} list’.', 'pinkcrab' ), \ucfirst( \esc_attr( $taxonomy->plural ?? '' ) ) ),
144
			'most_used'             => _x( 'Most Used', 'Title for the Most Used tab. Default \'Most Used\'.', 'pinkcrab' ),
145
			/* translators: %s: Taxonomy plural name */
146
			'back_to_items'         => wp_sprintf( _x( '← Back to %s', 'Label for the pagination hidden heading. Default is ‘{taxonomy plural name} list’.', 'pinkcrab' ), \ucfirst( \esc_attr( $taxonomy->plural ?? '' ) ) ),
147
			/* translators: %s: Taxonomy singular name */
148
			'item_link'             => wp_sprintf( _x( '%s Link', 'Title for a navigation link block variation. Default is ‘{taxonomy singular name} Link’.', 'pinkcrab' ), \ucfirst( \esc_attr( $taxonomy->singular ?? '' ) ) ),
149
			/* translators: %s: Taxonomy singular name */
150
			'item_link_description' => wp_sprintf( _x( 'A link to a %s', 'Description for a navigation link block variation. Default is ‘A link to a {taxonomy singular name}’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
151
		);
152
153
		$tag_labels = array(
154
			/* translators: %s: Taxonomy plural name */
155
			'separate_items_with_commas' => wp_sprintf( _x( 'Separate %s with commas', 'This label is only used for non-hierarchical taxonomies. Default \'Separate {taxonomy plural name} with commas\', used in the meta box.’.', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
156
			/* translators: %s: Taxonomy plural name */
157
			'add_or_remove_items'        => wp_sprintf( _x( 'Add or remove %s', 'This label is only used for non-hierarchical taxonomies. Default \'Add or remove {taxonomy plural name}\', used in the meta box when JavaScript is disabled.', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
158
			/* translators: %s: Taxonomy plural name */
159
			'choose_from_most_used'      => wp_sprintf( _x( 'Add or remove %s', 'This label is only used on non-hierarchical taxonomies. Default\'Choose from the most used {taxonomy plural name}\', used in the meta box.', 'pinkcrab' ), \esc_attr( $taxonomy->plural ?? '' ) ),
160
		);
161
162
		$hierarchical_labels = array(
163
			/* translators: %s: Taxonomy singular name */
164
			'parent_item_colon' => wp_sprintf( _x( 'Parent %s:', 'Label used to prefix parents of hierarchical items. Not used on non-hierarchical taxonomys. Default is ‘Parent {taxonomy plural name}:’.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
165
			/* translators: %s: Taxonomy singular name */
166
			'parent_item'       => wp_sprintf( _x( 'Parent %s', 'Label for the parent term', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
167
			/* translators: %s: Taxonomy singular name */
168
			'filter_by_item'    => wp_sprintf( _x( 'Filter by %s', 'This label is only used for hierarchical taxonomies. Default \'Filter by {taxonomy singular name}\', used in the posts list table.', 'pinkcrab' ), \esc_attr( $taxonomy->singular ?? '' ) ),
169
		);
170
171
		$labels = array_merge(
172
			$base_labels,
173
			$taxonomy->hierarchical ? $hierarchical_labels : $tag_labels
174
		);
175
176
		/**
177
		 * Allow 3rd party plugins to filter the labels also.
178
		 *
179
		 * @filter_handle PinkCrab/Registerable/taxonomy_labels
180
		 * @param array<string, string> $labels
181
		 * @param Taxonomy $taxonomy
182
		 * @return array<string, string>
183
		 */
184
		$labels = apply_filters( Registerable_Hooks::TAXONOMY_LABELS, $taxonomy->filter_labels( $labels ), $taxonomy );
185
186
		// Compose args.
187
		$args = array(
188
			'labels'                => $labels,
189
			'publicly_queryable'    => $taxonomy->publicly_queryable,
190
			'show_ui'               => $taxonomy->show_ui,
191
			'show_in_menu'          => $taxonomy->show_in_menu,
192
			'show_in_nav_menus'     => $taxonomy->public,
193
			'show_in_rest'          => $taxonomy->show_in_rest,
194
			'rest_base'             => $taxonomy->rest_base ?? $taxonomy->slug,
195
			'rest_controller_class' => $taxonomy->rest_controller_class,
196
			'show_tagcloud'         => $taxonomy->show_tagcloud,
197
			'show_in_quick_edit'    => $taxonomy->show_in_quick_edit,
198
			'show_admin_column'     => $taxonomy->show_admin_column,
199
			'sort'                  => $taxonomy->sort,
200
			'description'           => $taxonomy->description,
201
			'rewrite'               => $taxonomy->slug,
202
			'label'                 => $taxonomy->label ?? $taxonomy->plural,
203
			'query_var'             => $taxonomy->query_var,
204
			'hierarchical'          => $taxonomy->hierarchical,
205
			'update_count_callback' => $taxonomy->update_count_callback ?? '_update_post_term_count',
206
			'meta_box_cb'           => $taxonomy->meta_box_cb ??
207
				$taxonomy->hierarchical ? 'post_categories_meta_box' : 'post_tags_meta_box',
208
			'default_term'          => $taxonomy->default_term,
209
		);
210
211
		// Merge existing capabilities with the new ones.
212
		$args['capabilities'] = array_merge(
213
			array(
214
				'manage_terms' => 'manage_categories',
215
				'edit_terms'   => 'manage_categories',
216
				'delete_terms' => 'manage_categories',
217
				'assign_terms' => 'edit_posts',
218
			),
219
			$taxonomy->capabilities ?? array()
220
		);
221
222
		/**
223
		 * Allow 3rd party plugins to filter this also.
224
		 *
225
		 * @filter_handle PinkCrab/Registerable/taxonomy_args
226
		 * @param array<string, string|bool|int|null|array<string, string>> $args
227
		 * @param Taxonomy $taxonomy
228
		 * @return array<string, string|bool|int|null|array<string, string>>
229
		 */
230
		/* @phpstan-ignore-next-line, this is due to apply_filters type hints being wrong. */
231
		return apply_filters( Registerable_Hooks::TAXONOMY_ARGS, $taxonomy->filter_args( $args ), $taxonomy );
232
	}
233
}
234