1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Helper functions for the Schema class. |
4
|
|
|
* |
5
|
|
|
* @package lsx |
6
|
|
|
*/ |
7
|
|
|
/** |
8
|
|
|
* Schema utility functions. |
9
|
|
|
* |
10
|
|
|
* @since 11.6 |
11
|
|
|
*/ |
12
|
|
|
class LSX_Schema_Utils { |
13
|
|
|
/** |
14
|
|
|
* Determines whether a given post type should have Review schema. |
15
|
|
|
* |
16
|
|
|
* @param string $post_type Post type to check. |
17
|
|
|
* @param string $comparison_type Post type to check against. |
18
|
|
|
* |
19
|
|
|
* @return bool True if it has schema, false if not. |
20
|
|
|
*/ |
21
|
|
|
public static function is_type( $post_type = null, $comparison_type = null ) { |
22
|
|
|
if ( is_null( $comparison_type ) ) { |
23
|
|
|
return false; |
24
|
|
|
} |
25
|
|
|
if ( is_null( $post_type ) ) { |
26
|
|
|
$post_type = get_post_type(); |
27
|
|
|
} |
28
|
|
|
/** |
29
|
|
|
* Filter: 'wpseo_schema_$this->post_type_post_types' - Allow changing for which post types we output Review schema. |
30
|
|
|
* |
31
|
|
|
* @api string[] $post_types The post types for which we output Review. |
32
|
|
|
*/ |
33
|
|
|
$post_types = apply_filters( 'wpseo_schema_' . $comparison_type . '_post_types', array( $comparison_type ) ); |
34
|
|
|
return in_array( $post_type, $post_types ); |
35
|
|
|
} |
36
|
|
|
/** |
37
|
|
|
* Retrieve a users Schema ID. |
38
|
|
|
* |
39
|
|
|
* @param string $place_id The Name of the Reviewer you need a for. |
40
|
|
|
* @param string $type the type of the place. |
41
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
42
|
|
|
* |
43
|
|
|
* @return string The user's schema ID. |
44
|
|
|
*/ |
45
|
|
|
public static function get_places_schema_id( $place_id, $type, $context ) { |
46
|
|
|
$url = $context->site_url . '#/schema/' . strtolower( $type ) . '/' . wp_hash( $place_id . get_the_title( $place_id ) ); |
47
|
|
|
return trailingslashit( $url ); |
48
|
|
|
} |
49
|
|
|
/** |
50
|
|
|
* Retrieve a users Schema ID. |
51
|
|
|
* |
52
|
|
|
* @param string $name The Name of the Reviewer you need a for. |
53
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
54
|
|
|
* |
55
|
|
|
* @return string The user's schema ID. |
56
|
|
|
*/ |
57
|
|
|
public static function get_subtrip_schema_id( $name, $context ) { |
58
|
|
|
$url = $context->site_url . '#/subtrip/' . wp_hash( $name . $context->id ); |
59
|
|
|
return trailingslashit( $url ); |
60
|
|
|
} |
61
|
|
|
/** |
62
|
|
|
* Retrieve an offer Schema ID. |
63
|
|
|
* |
64
|
|
|
* @param string $id post ID of the place being added. |
65
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
66
|
|
|
* @param string $local if the Schema is local true / false. |
67
|
|
|
* |
68
|
|
|
* @return string The user's schema ID. |
69
|
|
|
*/ |
70
|
|
View Code Duplication |
public static function get_offer_schema_id( $id, $context, $local = false ) { |
|
|
|
|
71
|
|
|
if ( false === $local ) { |
72
|
|
|
$url = $context->site_url; |
73
|
|
|
} else { |
74
|
|
|
$url = get_permalink( $context->id ); |
75
|
|
|
} |
76
|
|
|
$url .= '#/schema/offer/'; |
77
|
|
|
$url .= wp_hash( $id . get_the_title( $id ) ); |
78
|
|
|
return trailingslashit( $url ); |
79
|
|
|
} |
80
|
|
|
/** |
81
|
|
|
* Retrieve an review Schema ID. |
82
|
|
|
* |
83
|
|
|
* @param string $id post ID of the place being added. |
84
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
85
|
|
|
* @param string $local if the Schema is local true / false. |
86
|
|
|
* |
87
|
|
|
* @return string The user's schema ID. |
88
|
|
|
*/ |
89
|
|
View Code Duplication |
public static function get_review_schema_id( $id, $context, $local = false ) { |
|
|
|
|
90
|
|
|
if ( false === $local ) { |
91
|
|
|
$url = $context->site_url; |
92
|
|
|
} else { |
93
|
|
|
$url = get_permalink( $context->id ); |
94
|
|
|
} |
95
|
|
|
$url .= '#/schema/review/'; |
96
|
|
|
$url .= wp_hash( $id . get_the_title( $id ) ); |
97
|
|
|
return trailingslashit( $url ); |
98
|
|
|
} |
99
|
|
|
/** |
100
|
|
|
* Retrieve an Article Schema ID. |
101
|
|
|
* |
102
|
|
|
* @param string $id post ID of the place being added. |
103
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
104
|
|
|
* @param string $local if the Schema is local true / false. |
105
|
|
|
* |
106
|
|
|
* @return string The user's schema ID. |
107
|
|
|
*/ |
108
|
|
|
public static function get_article_schema_id( $id, $context, $local = false ) { |
109
|
|
|
if ( false === $local ) { |
110
|
|
|
$url = get_permalink( $id ) . \WPSEO_Schema_IDs::ARTICLE_HASH; |
111
|
|
|
} else { |
112
|
|
|
$url = get_permalink( $context->id ) . '#/schema/article/' . wp_hash( $id . get_the_title( $id ) ); |
113
|
|
|
} |
114
|
|
|
return trailingslashit( $url ); |
115
|
|
|
} |
116
|
|
|
/** |
117
|
|
|
* Retrieve a users Schema ID. |
118
|
|
|
* |
119
|
|
|
* @param string $name The Name of the Reviewer you need a for. |
120
|
|
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
121
|
|
|
* |
122
|
|
|
* @return string The user's schema ID. |
123
|
|
|
*/ |
124
|
|
|
public static function get_author_schema_id( $name, $email, $context ) { |
125
|
|
|
return $context->site_url . \WPSEO_Schema_IDs::PERSON_HASH . wp_hash( $name . $email ); |
126
|
|
|
} |
127
|
|
|
/** |
128
|
|
|
* Generates the place graph piece for the subtrip / Itinerary arrays. |
129
|
|
|
* |
130
|
|
|
* @param array $data subTrip / itinerary data. |
131
|
|
|
* @param string $type The type in data to save the terms in. |
132
|
|
|
* @param string $post_id The post ID of the current Place to add. |
133
|
|
|
* @param WPSEO_Schema_Context $context The post ID of the current Place to add. |
134
|
|
|
* @param string $contained_in The @id of the containedIn place. |
135
|
|
|
* |
136
|
|
|
* @return mixed array $data Place data. |
137
|
|
|
*/ |
138
|
|
|
public static function add_place( $data, $type, $post_id, $context, $contained_in = false ) { |
139
|
|
|
$at_id = self::get_places_schema_id( $post_id, $type, $context ); |
140
|
|
|
$place = array( |
141
|
|
|
'@type' => $type, |
142
|
|
|
'@id' => $at_id, |
143
|
|
|
'name' => get_the_title( $post_id ), |
144
|
|
|
'description' => get_the_excerpt( $post_id ), |
145
|
|
|
'url' => get_permalink( $post_id ), |
146
|
|
|
); |
147
|
|
|
if ( false !== $contained_in ) { |
148
|
|
|
$place['containedInPlace'] = array( |
149
|
|
|
'@type' => 'Country', |
150
|
|
|
'@id' => $contained_in, |
151
|
|
|
); |
152
|
|
|
} |
153
|
|
|
$data[] = $place; |
154
|
|
|
return $data; |
155
|
|
|
} |
156
|
|
|
/** |
157
|
|
|
* Adds an image node if the post has a featured image. |
158
|
|
|
* |
159
|
|
|
* @param array $data The Review data. |
160
|
|
|
* @param WPSEO_Schema_Context $context The post ID of the current Place to add. |
161
|
|
|
* |
162
|
|
|
* @return array $data The Review data. |
163
|
|
|
*/ |
164
|
|
|
public static function add_image( $data, $context ) { |
165
|
|
|
if ( $context->has_image ) { |
166
|
|
|
$data['image'] = array( |
167
|
|
|
'@id' => $context->canonical . \WPSEO_Schema_IDs::PRIMARY_IMAGE_HASH, |
168
|
|
|
); |
169
|
|
|
} |
170
|
|
|
return $data; |
171
|
|
|
} |
172
|
|
|
/** |
173
|
|
|
* Generates the itemReviewed schema |
174
|
|
|
* |
175
|
|
|
* @param array $items The array of IDS. |
176
|
|
|
* @param string $type The schema type. |
177
|
|
|
* @return array $schema An array of the schema markup. |
178
|
|
|
*/ |
179
|
|
|
public static function get_item_reviewed( $items = array(), $type = '' ) { |
180
|
|
|
$schema = array(); |
181
|
|
|
if ( false !== $items && ! empty( $items ) && '' !== $type ) { |
182
|
|
|
array_unique( $items ); |
183
|
|
|
foreach ( $items as $item ) { |
184
|
|
|
$title = get_the_title( $item ); |
185
|
|
|
if ( '' !== $title ) { |
186
|
|
|
$item_schema = array( |
187
|
|
|
'@type' => $type, |
188
|
|
|
'name' => $title, |
189
|
|
|
); |
190
|
|
|
$schema[] = $item_schema; |
191
|
|
|
} |
192
|
|
|
} |
193
|
|
|
} |
194
|
|
|
return $schema; |
195
|
|
|
} |
196
|
|
|
/** |
197
|
|
|
* Adds a term or multiple terms, comma separated, to a field. |
198
|
|
|
* |
199
|
|
|
* @param array $data Review data. |
200
|
|
|
* @param string $post_id The ID of the item to fetch terms |
201
|
|
|
* @param string $key The key in data to save the terms in. |
202
|
|
|
* @param string $taxonomy The taxonomy to retrieve the terms from. |
203
|
|
|
* |
204
|
|
|
* @return mixed array $data Review data. |
205
|
|
|
*/ |
206
|
|
|
public static function add_terms( $data, $post_id, $key, $taxonomy ) { |
207
|
|
|
$terms = get_the_terms( $post_id, $taxonomy ); |
208
|
|
|
if ( is_array( $terms ) ) { |
209
|
|
|
$keywords = array(); |
210
|
|
|
foreach ( $terms as $term ) { |
211
|
|
|
// We are checking against the WordPress internal translation. |
212
|
|
|
// @codingStandardsIgnoreLine |
213
|
|
|
if ( $term->name !== __( 'Uncategorized' ) ) { |
214
|
|
|
$keywords[] = $term->name; |
215
|
|
|
} |
216
|
|
|
} |
217
|
|
|
$data[ $key ] = implode( ',', $keywords ); |
218
|
|
|
} |
219
|
|
|
return $data; |
220
|
|
|
} |
221
|
|
|
} |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.