PluginProbe ʕ •ᴥ•ʔ
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 18.6
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v18.6
27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 19.1 19.10 19.11 19.12 19.13 19.14 19.2 19.3 19.4 19.5 19.5.1 19.6 19.6.1 19.7 19.7.1 19.7.2 19.8 19.9 20.0 20.1 20.10 20.11 20.12 20.13 20.2 20.2.1 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.8.1 21.9 21.9.1 22.0 22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 23.0 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 24.0 24.1 24.2 24.3 24.4 24.5 24.6 24.7 24.8 24.8.1 24.9 25.0 25.1 25.2 25.3 25.3.1 25.4 25.5 25.6 25.7 25.8 25.9 26.0 26.1 26.1.1 26.2 26.3 26.4 26.5 26.6 26.7 26.8 26.9 27.0 27.1 27.1.1 27.2 27.3 27.4
wordpress-seo / admin / class-primary-term-admin.php
wordpress-seo / admin Last commit date
ajax 5 years ago capabilities 4 years ago endpoints 5 years ago exceptions 7 years ago filters 4 years ago formatter 4 years ago google_search_console 5 years ago import 4 years ago listeners 8 years ago menu 4 years ago metabox 4 years ago notifiers 4 years ago pages 4 years ago roles 5 years ago ryte 4 years ago services 5 years ago statistics 5 years ago taxonomy 4 years ago tracking 4 years ago views 4 years ago watchers 5 years ago admin-settings-changed-listener.php 5 years ago ajax.php 4 years ago class-admin-asset-analysis-worker-location.php 5 years ago class-admin-asset-dev-server-location.php 5 years ago class-admin-asset-location.php 8 years ago class-admin-asset-manager.php 4 years ago class-admin-asset-seo-location.php 4 years ago class-admin-asset-yoast-components-l10n.php 4 years ago class-admin-editor-specific-replace-vars.php 5 years ago class-admin-gutenberg-compatibility-notification.php 5 years ago class-admin-help-panel.php 5 years ago class-admin-init.php 4 years ago class-admin-recommended-replace-vars.php 6 years ago class-admin-user-profile.php 6 years ago class-admin-utils.php 5 years ago class-admin.php 4 years ago class-asset.php 5 years ago class-bulk-description-editor-list-table.php 5 years ago class-bulk-editor-list-table.php 4 years ago class-bulk-title-editor-list-table.php 6 years ago class-collector.php 6 years ago class-config.php 4 years ago class-customizer.php 5 years ago class-database-proxy.php 5 years ago class-export.php 5 years ago class-expose-shortlinks.php 4 years ago class-gutenberg-compatibility.php 4 years ago class-helpscout.php 5 years ago class-meta-columns.php 4 years ago class-my-yoast-proxy.php 5 years ago class-option-tab.php 4 years ago class-option-tabs-formatter.php 5 years ago class-option-tabs.php 5 years ago class-paper-presenter.php 5 years ago class-plugin-availability.php 5 years ago class-plugin-conflict.php 4 years ago class-premium-popup.php 5 years ago class-premium-upsell-admin-block.php 4 years ago class-primary-term-admin.php 5 years ago class-product-upsell-notice.php 5 years ago class-remote-request.php 5 years ago class-schema-person-upgrade-notification.php 4 years ago class-suggested-plugins.php 4 years ago class-yoast-columns.php 5 years ago class-yoast-dashboard-widget.php 4 years ago class-yoast-form.php 4 years ago class-yoast-input-validation.php 5 years ago class-yoast-network-admin.php 5 years ago class-yoast-network-settings-api.php 4 years ago class-yoast-notification-center.php 4 years ago class-yoast-notification.php 5 years ago class-yoast-notifications.php 5 years ago class-yoast-plugin-conflict.php 4 years ago index.php 10 years ago interface-collection.php 7 years ago interface-installable.php 8 years ago
class-primary-term-admin.php
268 lines
1 <?php
2 /**
3 * WPSEO plugin file.
4 *
5 * @package WPSEO\Admin
6 */
7
8 /**
9 * Adds the UI to change the primary term for a post.
10 */
11 class WPSEO_Primary_Term_Admin implements WPSEO_WordPress_Integration {
12
13 /**
14 * Constructor.
15 */
16 public function register_hooks() {
17 add_filter( 'wpseo_content_meta_section_content', [ $this, 'add_input_fields' ] );
18
19 add_action( 'admin_footer', [ $this, 'wp_footer' ], 10 );
20
21 add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
22 }
23
24 /**
25 * Gets the current post ID.
26 *
27 * @return int The post ID.
28 */
29 protected function get_current_id() {
30 $post_id = filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT );
31 if ( empty( $post_id ) && isset( $GLOBALS['post_ID'] ) ) {
32 $post_id = filter_var( $GLOBALS['post_ID'], FILTER_SANITIZE_NUMBER_INT );
33 }
34
35 return $post_id;
36 }
37
38 /**
39 * Adds hidden fields for primary taxonomies.
40 *
41 * @param string $content The metabox content.
42 *
43 * @return string The HTML content.
44 */
45 public function add_input_fields( $content ) {
46 $taxonomies = $this->get_primary_term_taxonomies();
47
48 foreach ( $taxonomies as $taxonomy ) {
49 $content .= $this->primary_term_field( $taxonomy->name );
50 $content .= wp_nonce_field( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce', false, false );
51 }
52 return $content;
53 }
54
55 /**
56 * Generates the HTML for a hidden field for a primary taxonomy.
57 *
58 * @param string $taxonomy_name The taxonomy's slug.
59 *
60 * @return string The HTML for a hidden primary taxonomy field.
61 */
62 protected function primary_term_field( $taxonomy_name ) {
63 return sprintf(
64 '<input class="yoast-wpseo-primary-term" type="hidden" id="%1$s" name="%2$s" value="%3$s" />',
65 esc_attr( $this->generate_field_id( $taxonomy_name ) ),
66 esc_attr( $this->generate_field_name( $taxonomy_name ) ),
67 esc_attr( $this->get_primary_term( $taxonomy_name ) )
68 );
69 }
70
71 /**
72 * Generates an id for a primary taxonomy's hidden field.
73 *
74 * @param string $taxonomy_name The taxonomy's slug.
75 *
76 * @return string The field id.
77 */
78 protected function generate_field_id( $taxonomy_name ) {
79 return 'yoast-wpseo-primary-' . $taxonomy_name;
80 }
81
82 /**
83 * Generates a name for a primary taxonomy's hidden field.
84 *
85 * @param string $taxonomy_name The taxonomy's slug.
86 *
87 * @return string The field id.
88 */
89 protected function generate_field_name( $taxonomy_name ) {
90 return WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy_name . '_term';
91 }
92
93 /**
94 * Adds primary term templates.
95 */
96 public function wp_footer() {
97 $taxonomies = $this->get_primary_term_taxonomies();
98
99 if ( ! empty( $taxonomies ) ) {
100 $this->include_js_templates();
101 }
102 }
103
104 /**
105 * Enqueues all the assets needed for the primary term interface.
106 *
107 * @return void
108 */
109 public function enqueue_assets() {
110 global $pagenow;
111
112 if ( ! WPSEO_Metabox::is_post_edit( $pagenow ) ) {
113 return;
114 }
115
116 $taxonomies = $this->get_primary_term_taxonomies();
117
118 // Only enqueue if there are taxonomies that need a primary term.
119 if ( empty( $taxonomies ) ) {
120 return;
121 }
122
123 $asset_manager = new WPSEO_Admin_Asset_Manager();
124 $asset_manager->enqueue_style( 'primary-category' );
125
126 $mapped_taxonomies = $this->get_mapped_taxonomies_for_js( $taxonomies );
127
128 $data = [
129 'taxonomies' => $mapped_taxonomies,
130 ];
131
132 $asset_manager->localize_script( 'post-edit', 'wpseoPrimaryCategoryL10n', $data );
133 $asset_manager->localize_script( 'post-edit-classic', 'wpseoPrimaryCategoryL10n', $data );
134 }
135
136 /**
137 * Gets the id of the primary term.
138 *
139 * @param string $taxonomy_name Taxonomy name for the term.
140 *
141 * @return int primary term id
142 */
143 protected function get_primary_term( $taxonomy_name ) {
144 $primary_term = new WPSEO_Primary_Term( $taxonomy_name, $this->get_current_id() );
145
146 return $primary_term->get_primary_term();
147 }
148
149 /**
150 * Returns all the taxonomies for which the primary term selection is enabled.
151 *
152 * @param int|null $post_id Default current post ID.
153 * @return array
154 */
155 protected function get_primary_term_taxonomies( $post_id = null ) {
156 if ( $post_id === null ) {
157 $post_id = $this->get_current_id();
158 }
159
160 $taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' );
161 if ( $taxonomies !== false ) {
162 return $taxonomies;
163 }
164
165 $taxonomies = $this->generate_primary_term_taxonomies( $post_id );
166
167 wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' );
168
169 return $taxonomies;
170 }
171
172 /**
173 * Includes templates file.
174 */
175 protected function include_js_templates() {
176 include_once WPSEO_PATH . 'admin/views/js-templates-primary-term.php';
177 }
178
179 /**
180 * Generates the primary term taxonomies.
181 *
182 * @param int $post_id ID of the post.
183 *
184 * @return array
185 */
186 protected function generate_primary_term_taxonomies( $post_id ) {
187 $post_type = get_post_type( $post_id );
188 $all_taxonomies = get_object_taxonomies( $post_type, 'objects' );
189 $all_taxonomies = array_filter( $all_taxonomies, [ $this, 'filter_hierarchical_taxonomies' ] );
190
191 /**
192 * Filters which taxonomies for which the user can choose the primary term.
193 *
194 * @api array $taxonomies An array of taxonomy objects that are primary_term enabled.
195 *
196 * @param string $post_type The post type for which to filter the taxonomies.
197 * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term
198 * enabled.
199 */
200 $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies );
201
202 return $taxonomies;
203 }
204
205 /**
206 * Creates a map of taxonomies for localization.
207 *
208 * @param array $taxonomies The taxononmies that should be mapped.
209 *
210 * @return array The mapped taxonomies.
211 */
212 protected function get_mapped_taxonomies_for_js( $taxonomies ) {
213 return array_map( [ $this, 'map_taxonomies_for_js' ], $taxonomies );
214 }
215
216 /**
217 * Returns an array suitable for use in the javascript.
218 *
219 * @param stdClass $taxonomy The taxonomy to map.
220 *
221 * @return array The mapped taxonomy.
222 */
223 private function map_taxonomies_for_js( $taxonomy ) {
224 $primary_term = $this->get_primary_term( $taxonomy->name );
225
226 if ( empty( $primary_term ) ) {
227 $primary_term = '';
228 }
229
230 $terms = get_terms(
231 [
232 'taxonomy' => $taxonomy->name,
233 'update_term_meta_cache' => false,
234 'fields' => 'id=>name',
235 ]
236 );
237
238 $mapped_terms_for_js = [];
239 foreach ( $terms as $id => $name ) {
240 $mapped_terms_for_js[] = [
241 'id' => $id,
242 'name' => $name,
243 ];
244 }
245
246 return [
247 'title' => $taxonomy->labels->singular_name,
248 'name' => $taxonomy->name,
249 'primary' => $primary_term,
250 'singularLabel' => $taxonomy->labels->singular_name,
251 'fieldId' => $this->generate_field_id( $taxonomy->name ),
252 'restBase' => ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name,
253 'terms' => $mapped_terms_for_js,
254 ];
255 }
256
257 /**
258 * Returns whether or not a taxonomy is hierarchical.
259 *
260 * @param stdClass $taxonomy Taxonomy object.
261 *
262 * @return bool
263 */
264 private function filter_hierarchical_taxonomies( $taxonomy ) {
265 return (bool) $taxonomy->hierarchical;
266 }
267 }
268