Passed
Push — add/cover-template-update ( ca0bef...ba8c8e )
by Virginia
09:49 queued 04:07
created

includes/classes/class-lsx-schema-graph-piece.php (3 issues)

1
<?php
2
/**
3
 * Schema for LSX
4
 *
5
 * @package lsx
6
 */
7
/**
8
 * Returns schema Review data.
9
 *
10
 * @since 10.2
11
 */
12
use \Yoast\WP\SEO\Generators\Schema\Abstract_Schema_Piece;
13
14
if ( class_exists( 'Abstract_Schema_Piece' ) ) {
0 ignored issues
show
Expected 0 spaces after opening bracket; 1 found
Loading history...
Expected 0 spaces before closing bracket; 1 found
Loading history...
15
	class LSX_Schema_Graph_Piece extends Abstract_Schema_Piece {
0 ignored issues
show
Coding Style Documentation introduced by
Missing doc comment for class LSX_Schema_Graph_Piece
Loading history...
16
		/**
17
		 * A value object with context variables.
18
		 *
19
		 * @var \WPSEO_Schema_Context
20
		 */
21
		public $context;
22
		/**
23
		 * This is the post type that you want the piece to output for.
24
		 *
25
		 * @var string;
26
		 */
27
		public $post_type;
28
		/**
29
		 * If this is a top level parent
30
		 *
31
		 * @var boolean
32
		 */
33
		public $is_top_level;
34
		/**
35
		 * This holds the meta_key => scehma_type of the fields you want to add to your subtrip.
36
		 *
37
		 * @var array()
38
		 */
39
		public $place_ids;
40
		/**
41
		 * This holds an object or the current trip post.
42
		 *
43
		 * @var WP_Post();
44
		 */
45
		public $post;
46
		/**
47
		 * This holds URL for the trip
48
		 *
49
		 * @var string
50
		 */
51
		public $post_url;
52
		/**
53
		 * Constructor.
54
		 *
55
		 * @param \WPSEO_Schema_Context $context A value object with context variables.
56
		 */
57
		public function __construct( WPSEO_Schema_Context $context ) {
58
			$this->context      = $context;
59
			$this->place_ids    = array();
60
			$this->post         = get_post( $this->context->id );
61
			$this->post_url     = get_permalink( $this->context->id );
62
			$this->is_top_level = false;
63
			if ( is_object( $this->post ) && isset( $this->post->post_parent ) && ( false === $this->post->post_parent || 0 === $this->post->post_parent || '' === $this->post->post_parent ) ) {
64
				$this->is_top_level = true;
65
			}
66
		}
67
		/**
68
		 * Determines whether or not a piece should be added to the graph.
69
		 *
70
		 * @return bool
71
		 */
72
		public function is_needed() {
73
			if ( ! is_singular() ) {
74
				return false;
75
			}
76
			if ( false === $this->context->site_represents ) {
77
				return false;
78
			}
79
			return LSX_Schema_Utils::is_type( get_post_type(), $this->post_type );
80
		}
81
		/**
82
		 * Returns Review data.
83
		 *
84
		 * @return array $data Review data.
85
		 */
86
		public function generate() {
87
			$data = array();
88
			return $data;
89
		}
90
		/**
91
		 * Gets the connected reviews post type and set it as the "Review" schema
92
		 *
93
		 * @param  array    $data An array of offers already added.
94
		 * @param  string   $data_key
95
		 * @param  boolean  $include_aggregate
96
		 * @return array    $data
97
		 */
98
		public function add_reviews( $data, $data_key = 'reviews', $include_aggregate = true ) {
99
			$reviews       = get_post_meta( $this->context->id, 'review_to_' . $this->post_type, false );
100
			$reviews_array = array();
101
			if ( ! empty( $reviews ) ) {
102
				$aggregate_value = 1;
103
				$review_count    = 0;
104
				foreach ( $reviews as $review_id ) {
105
					$rating      = get_post_meta( $review_id, 'rating', true );
106
					$author      = get_post_meta( $review_id, 'reviewer_name', true );
107
					$description = wp_strip_all_tags( get_the_excerpt( $review_id ) );
108
					$review_args = array(
109
						'author'     => $author,
110
						'reviewBody' => $description,
111
					);
112
					// Add in the review rating.
113
					if ( false !== $rating && '' !== $rating && '0' !== $rating && 0 !== $rating ) {
114
						$review_args['reviewRating'] = array(
115
							'@type'       => 'Rating',
116
							'ratingValue' => $rating,
117
						);
118
					}
119
					$reviews_array = LSX_Schema_Utils::add_review( $reviews_array, $review_id, $this->context, $review_args );
120
					$review_count++;
121
				}
122
				if ( ! empty( $reviews_array ) ) {
123
					if ( true === $include_aggregate ) {
124
						$data['aggregateRating'] = array(
125
							'@type'       => 'AggregateRating',
126
							'ratingValue' => (string) $aggregate_value,
127
							'reviewCount' => (string) $review_count,
128
							'bestRating'  => '5',
129
							'worstRating' => '1',
130
						);
131
					}
132
					$data[ $data_key ] = $reviews_array;
133
				}
134
			}
135
			return $data;
136
		}
137
		/**
138
		 * Gets the connected posts and set it as the "Article" schema
139
		 *
140
		 * @param  array  $data An array of offers already added.
141
		 * @param  string $data_key
142
		 * @return array  $data
143
		 */
144
		public function add_articles( $data, $data_key = 'subjectOf' ) {
145
			$posts       = get_post_meta( $this->context->id, 'post_to_' . $this->post_type, false );
146
			$posts_array = array();
147
			if ( ! empty( $posts ) ) {
148
				foreach ( $posts as $post_id ) {
149
					$post_args = array(
150
						'articleBody' => wp_strip_all_tags( get_the_excerpt( $post_id ) ),
151
						'headline'    => get_the_title( $post_id ),
152
					);
153
					$section   = get_the_term_list( $post_id, 'category' );
154
					if ( ! is_wp_error( $section ) && '' !== $section && false !== $section ) {
155
						$post_args['articleSection'] = wp_strip_all_tags( $section );
156
					}
157
					if ( $this->context->site_represents_reference ) {
158
						$post_args['publisher'] = $this->context->site_represents_reference;
159
					}
160
					$image_url = get_the_post_thumbnail_url( $post_id, 'lsx-thumbnail-wide' );
161
					if ( false !== $image_url ) {
162
						$post_args['image'] = $image_url;
163
					}
164
					$posts_array = LSX_Schema_Utils::add_article( $posts_array, $post_id, $this->context, $post_args );
165
				}
166
				if ( ! empty( $posts_array ) ) {
167
					$data[ $data_key ] = $posts_array;
168
				}
169
			}
170
			return $data;
171
		}
172
		/**
173
		 * Adds the Project and Testimonials attached to the Team Member
174
		 *
175
		 * @param array $data
176
		 *
177
		 * @return array $data
178
		 */
179
		public function add_connections( $data ) {
180
			$connections_array = array();
181
			if ( $this->is_top_level ) {
182
				$connections_array = $this->add_regions( $connections_array );
183
				$connections_array = $this->add_accommodation( $connections_array );
184
				if ( ! empty( $connections_array ) ) {
185
					$data['containsPlace'] = $connections_array;
186
				}
187
			} else {
188
				$connections_array             = $this->add_countries( $connections_array );
189
				$data['containedInPlace'] = $connections_array;
190
				$connections_array          = array();
191
				$connections_array          = $this->add_accommodation( $connections_array );
192
				$data['containsPlace'] = $connections_array;
193
			}
194
			return $data;
195
		}
196
		/**
197
		 * Adds the terms for the taxonomy
198
		 *
199
		 * @param array $data     Review data.
200
		 * @param array $data_key the parameter name you wish to assign it to.
201
		 * @param array $taxonomy the taxonomy to grab terms for.
202
		 *
203
		 * @return array $data Review data.
204
		 */
205
		public function add_taxonomy_terms( $data, $data_key, $taxonomy ) {
206
			/**
207
			 * Filter: 'lsx_schema_' . $this->post_type . '_' . $data_key . '_taxonomy' - Allow changing the taxonomy used to assign keywords to a post type Review data.
208
			 *
209
			 * @api string $taxonomy The chosen taxonomy.
210
			 */
211
			$taxonomy = apply_filters( 'lsx_schema_' . $this->post_type . '_' . $data_key . '_taxonomy', $taxonomy );
212
			return LSX_Schema_Utils::add_terms( $data, $this->context->id, $data_key, $taxonomy );
213
		}
214
		/**
215
		 * Adds the custom field value for the supplied key
216
		 *
217
		 * @param array   $data     Schema data.
218
		 * @param string  $data_key the parameter name you wish to assign it to.
219
		 * @param string  $meta_key the taxonomy to grab terms for.
220
		 * @param boolean $single   A single custom field or an array
221
		 *
222
		 * @return array $data Review data.
223
		 */
224
		public function add_custom_field( $data, $data_key, $meta_key, $single = true ) {
225
			$value = get_post_meta( $this->context->id, $meta_key, $single );
226
			if ( '' !== $value && false !== $value ) {
227
				$data[ $data_key ] = $value;
228
			}
229
			return $data;
230
		}
231
	}
232
}
233