Passed
Pull Request — master (#225)
by Jacques
02:10
created

LSX_Schema_Utils::get_places_schema_id()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 3
dl 0
loc 4
rs 10
c 0
b 0
f 0
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 ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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 ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

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.

Loading history...
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
}