@@ -18,235 +18,235 @@ |
||
18 | 18 | */ |
19 | 19 | class Wordlift_Publisher_Service { |
20 | 20 | |
21 | - protected function __construct() { |
|
22 | - |
|
23 | - } |
|
24 | - |
|
25 | - private static $instance = null; |
|
26 | - |
|
27 | - public static function get_instance() { |
|
28 | - |
|
29 | - if ( ! isset( self::$instance ) ) { |
|
30 | - self::$instance = new self(); |
|
31 | - } |
|
32 | - |
|
33 | - return self::$instance; |
|
34 | - } |
|
35 | - |
|
36 | - /** |
|
37 | - * Counts the number of potential publishers. |
|
38 | - * |
|
39 | - * @return int The number of potential publishers. |
|
40 | - * @since 3.11.0 |
|
41 | - */ |
|
42 | - public function count() { |
|
43 | - |
|
44 | - // Search for entities which are either a Person |
|
45 | - // or Organization. |
|
46 | - |
|
47 | - // Get only the ids as all we need is the count. |
|
48 | - $entities = get_posts( |
|
49 | - array( |
|
50 | - 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
|
51 | - 'post_status' => 'publish', |
|
52 | - 'posts_per_page' => - 1, |
|
53 | - 'tax_query' => array( |
|
54 | - array( |
|
55 | - 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
56 | - 'field' => 'slug', |
|
57 | - 'terms' => array( 'organization', 'person' ), |
|
58 | - ), |
|
59 | - ), |
|
60 | - 'fields' => 'ids', |
|
61 | - ) |
|
62 | - ); |
|
63 | - |
|
64 | - // Finally return the count. |
|
65 | - return count( $entities ); |
|
66 | - } |
|
67 | - |
|
68 | - /** |
|
69 | - * Search SQL filter for matching against post title only. |
|
70 | - * |
|
71 | - * @link http://wordpress.stackexchange.com/a/11826/1685 |
|
72 | - * |
|
73 | - * @since 3.15.0 |
|
74 | - * |
|
75 | - * @param string $search The search string. |
|
76 | - * @param WP_Query $wp_query The {@link WP_Query} instance. |
|
77 | - * |
|
78 | - * @return array|string An array of results. |
|
79 | - */ |
|
80 | - public function limit_search_to_title( $search, $wp_query ) { |
|
81 | - |
|
82 | - // Bail out if the search or the `search_terms` haven't been set. |
|
83 | - if ( empty( $search ) || empty( $wp_query->query_vars['search_terms'] ) ) { |
|
84 | - return $search; |
|
85 | - } |
|
86 | - |
|
87 | - global $wpdb; |
|
88 | - |
|
89 | - $query_vars = $wp_query->query_vars; |
|
90 | - $percent = ! empty( $query_vars['exact'] ) ? '' : '%'; |
|
91 | - $search = array(); |
|
92 | - |
|
93 | - foreach ( (array) $query_vars['search_terms'] as $term ) { |
|
94 | - $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $percent . $wpdb->esc_like( $term ) . $percent ); |
|
95 | - } |
|
96 | - |
|
97 | - if ( ! is_user_logged_in() ) { |
|
98 | - $search[] = "$wpdb->posts.post_password = ''"; |
|
99 | - } |
|
100 | - |
|
101 | - $search = ' AND ' . implode( ' AND ', $search ); |
|
102 | - |
|
103 | - return $search; |
|
104 | - } |
|
105 | - |
|
106 | - /** |
|
107 | - * Query WP for potential publishers, i.e. {@link WP_Post}s which are associated` |
|
108 | - * with `wl_entity_type` (taxonomy) terms of `Organization` or `Person`. |
|
109 | - * |
|
110 | - * @param string $filter The title filter. |
|
111 | - * |
|
112 | - * @return array An array of results in a select2 friendly format. |
|
113 | - * @since 3.11.0 |
|
114 | - */ |
|
115 | - public function query( $filter = '' ) { |
|
116 | - |
|
117 | - // Search for the filter in the titles only. |
|
118 | - add_filter( |
|
119 | - 'posts_search', |
|
120 | - array( |
|
121 | - $this, |
|
122 | - 'limit_search_to_title', |
|
123 | - ), |
|
124 | - 10, |
|
125 | - 2 |
|
126 | - ); |
|
127 | - |
|
128 | - /* |
|
21 | + protected function __construct() { |
|
22 | + |
|
23 | + } |
|
24 | + |
|
25 | + private static $instance = null; |
|
26 | + |
|
27 | + public static function get_instance() { |
|
28 | + |
|
29 | + if ( ! isset( self::$instance ) ) { |
|
30 | + self::$instance = new self(); |
|
31 | + } |
|
32 | + |
|
33 | + return self::$instance; |
|
34 | + } |
|
35 | + |
|
36 | + /** |
|
37 | + * Counts the number of potential publishers. |
|
38 | + * |
|
39 | + * @return int The number of potential publishers. |
|
40 | + * @since 3.11.0 |
|
41 | + */ |
|
42 | + public function count() { |
|
43 | + |
|
44 | + // Search for entities which are either a Person |
|
45 | + // or Organization. |
|
46 | + |
|
47 | + // Get only the ids as all we need is the count. |
|
48 | + $entities = get_posts( |
|
49 | + array( |
|
50 | + 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
|
51 | + 'post_status' => 'publish', |
|
52 | + 'posts_per_page' => - 1, |
|
53 | + 'tax_query' => array( |
|
54 | + array( |
|
55 | + 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
56 | + 'field' => 'slug', |
|
57 | + 'terms' => array( 'organization', 'person' ), |
|
58 | + ), |
|
59 | + ), |
|
60 | + 'fields' => 'ids', |
|
61 | + ) |
|
62 | + ); |
|
63 | + |
|
64 | + // Finally return the count. |
|
65 | + return count( $entities ); |
|
66 | + } |
|
67 | + |
|
68 | + /** |
|
69 | + * Search SQL filter for matching against post title only. |
|
70 | + * |
|
71 | + * @link http://wordpress.stackexchange.com/a/11826/1685 |
|
72 | + * |
|
73 | + * @since 3.15.0 |
|
74 | + * |
|
75 | + * @param string $search The search string. |
|
76 | + * @param WP_Query $wp_query The {@link WP_Query} instance. |
|
77 | + * |
|
78 | + * @return array|string An array of results. |
|
79 | + */ |
|
80 | + public function limit_search_to_title( $search, $wp_query ) { |
|
81 | + |
|
82 | + // Bail out if the search or the `search_terms` haven't been set. |
|
83 | + if ( empty( $search ) || empty( $wp_query->query_vars['search_terms'] ) ) { |
|
84 | + return $search; |
|
85 | + } |
|
86 | + |
|
87 | + global $wpdb; |
|
88 | + |
|
89 | + $query_vars = $wp_query->query_vars; |
|
90 | + $percent = ! empty( $query_vars['exact'] ) ? '' : '%'; |
|
91 | + $search = array(); |
|
92 | + |
|
93 | + foreach ( (array) $query_vars['search_terms'] as $term ) { |
|
94 | + $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $percent . $wpdb->esc_like( $term ) . $percent ); |
|
95 | + } |
|
96 | + |
|
97 | + if ( ! is_user_logged_in() ) { |
|
98 | + $search[] = "$wpdb->posts.post_password = ''"; |
|
99 | + } |
|
100 | + |
|
101 | + $search = ' AND ' . implode( ' AND ', $search ); |
|
102 | + |
|
103 | + return $search; |
|
104 | + } |
|
105 | + |
|
106 | + /** |
|
107 | + * Query WP for potential publishers, i.e. {@link WP_Post}s which are associated` |
|
108 | + * with `wl_entity_type` (taxonomy) terms of `Organization` or `Person`. |
|
109 | + * |
|
110 | + * @param string $filter The title filter. |
|
111 | + * |
|
112 | + * @return array An array of results in a select2 friendly format. |
|
113 | + * @since 3.11.0 |
|
114 | + */ |
|
115 | + public function query( $filter = '' ) { |
|
116 | + |
|
117 | + // Search for the filter in the titles only. |
|
118 | + add_filter( |
|
119 | + 'posts_search', |
|
120 | + array( |
|
121 | + $this, |
|
122 | + 'limit_search_to_title', |
|
123 | + ), |
|
124 | + 10, |
|
125 | + 2 |
|
126 | + ); |
|
127 | + |
|
128 | + /* |
|
129 | 129 | * Search for entities which are either a Person |
130 | 130 | * or Organization. Sort the results by title in ascending order. |
131 | 131 | */ |
132 | - $entities = get_posts( |
|
133 | - array( |
|
134 | - 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
|
135 | - 'post_status' => 'publish', |
|
136 | - 'posts_per_page' => - 1, |
|
137 | - 'tax_query' => array( |
|
138 | - array( |
|
139 | - 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
140 | - 'field' => 'slug', |
|
141 | - 'terms' => array( 'organization', 'person' ), |
|
142 | - ), |
|
143 | - ), |
|
144 | - 's' => $filter, |
|
145 | - 'orderby' => 'title', |
|
146 | - 'order' => 'ASC', |
|
147 | - ) |
|
148 | - ); |
|
149 | - |
|
150 | - // Remove the search filter added before the query. |
|
151 | - remove_filter( |
|
152 | - 'posts_search', |
|
153 | - array( |
|
154 | - $this, |
|
155 | - 'limit_search_to_title', |
|
156 | - ), |
|
157 | - 10, |
|
158 | - 2 |
|
159 | - ); |
|
160 | - |
|
161 | - // Set a reference to ourselves to pass to the closure. |
|
162 | - $publisher_service = $this; |
|
163 | - |
|
164 | - // Map the results in a `Select2` compatible array. |
|
165 | - return array_map( |
|
166 | - function ( $entity ) use ( $publisher_service ) { |
|
167 | - $type = wp_get_post_terms( $entity->ID, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
168 | - $thumb_id = get_post_thumbnail_id( $entity->ID ); |
|
169 | - |
|
170 | - return array( |
|
171 | - 'id' => $entity->ID, |
|
172 | - 'text' => $entity->post_title, |
|
173 | - 'type' => $type[0]->name, |
|
174 | - 'thumbnail_url' => $publisher_service->get_attachment_image_url( $thumb_id ), |
|
175 | - ); |
|
176 | - }, |
|
177 | - $entities |
|
178 | - ); |
|
179 | - } |
|
180 | - |
|
181 | - /** |
|
182 | - * Get the thumbnail's URL. |
|
183 | - * |
|
184 | - * @param int $attachment_id The attachment id. |
|
185 | - * @param string $size The attachment size (default = 'thumbnail'). |
|
186 | - * |
|
187 | - * @return string|bool The image URL or false if not found. |
|
188 | - * @since 3.11.0 |
|
189 | - */ |
|
190 | - public function get_attachment_image_url( $attachment_id, $size = 'thumbnail' ) { |
|
191 | - |
|
192 | - $image = wp_get_attachment_image_src( $attachment_id, $size ); |
|
193 | - |
|
194 | - return isset( $image['0'] ) ? $image['0'] : false; |
|
195 | - } |
|
196 | - |
|
197 | - /** |
|
198 | - * Add additional instructions to featured image metabox |
|
199 | - * when the entity type is the publisher. |
|
200 | - * |
|
201 | - * @param string $content Current metabox content. |
|
202 | - * |
|
203 | - * @return string $content metabox content with additional instructions. |
|
204 | - * @since 3.19.0 |
|
205 | - */ |
|
206 | - public function add_featured_image_instruction( $content ) { |
|
207 | - // Get the current post ID. |
|
208 | - $post_id = get_the_ID(); |
|
209 | - |
|
210 | - // Get the publisher id. |
|
211 | - $publisher_id = Wordlift_Configuration_Service::get_instance()->get_publisher_id(); |
|
212 | - |
|
213 | - // Bail if for some reason the post id is not set. |
|
214 | - if ( |
|
215 | - empty( $post_id ) || |
|
216 | - $post_id !== (int) $publisher_id |
|
217 | - ) { |
|
218 | - return $content; |
|
219 | - } |
|
220 | - |
|
221 | - $terms = wp_get_post_terms( |
|
222 | - $post_id, // The post id. |
|
223 | - Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, // The taxonomy slug. |
|
224 | - array( |
|
225 | - 'fields' => 'slugs', |
|
226 | - // We don't need all fields, but only slugs. |
|
227 | - ) |
|
228 | - ); |
|
229 | - |
|
230 | - // Check that the entity type is "Organization". |
|
231 | - if ( in_array( 'organization', $terms, true ) ) { |
|
232 | - // Add the featured image description when the type is "Organization". |
|
233 | - |
|
234 | - $link = sprintf( |
|
235 | - '<a target="_blank" href="%s">%s</a>', |
|
236 | - esc_attr__( 'https://developers.google.com/search/docs/data-types/article#logo-guidelines', 'wordlift' ), |
|
237 | - esc_html__( 'AMP logo guidelines', 'wordlift' ) |
|
238 | - ); |
|
239 | - $content .= sprintf( |
|
240 | - '<p>' |
|
241 | - /* translators: %s: AMP logo guidelines. */ |
|
242 | - . esc_html_x( 'According to the %s, the logo should fit in a 60x600px rectangle, and either be exactly 60px high (preferred), or exactly 600px wide. For example, 450x45px would not be acceptable, even though it fits in the 600x60px rectangle. To comply with the guidelines, WordLift will automatically resize the Featured Image for structured data formats.', 'After "According to the" goes the link to the "AMP logo guidelines".', 'wordlift' ) |
|
243 | - . '</p>', |
|
244 | - $link |
|
245 | - ); |
|
246 | - } |
|
247 | - |
|
248 | - // Finally return the content. |
|
249 | - return $content; |
|
250 | - } |
|
132 | + $entities = get_posts( |
|
133 | + array( |
|
134 | + 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
|
135 | + 'post_status' => 'publish', |
|
136 | + 'posts_per_page' => - 1, |
|
137 | + 'tax_query' => array( |
|
138 | + array( |
|
139 | + 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
140 | + 'field' => 'slug', |
|
141 | + 'terms' => array( 'organization', 'person' ), |
|
142 | + ), |
|
143 | + ), |
|
144 | + 's' => $filter, |
|
145 | + 'orderby' => 'title', |
|
146 | + 'order' => 'ASC', |
|
147 | + ) |
|
148 | + ); |
|
149 | + |
|
150 | + // Remove the search filter added before the query. |
|
151 | + remove_filter( |
|
152 | + 'posts_search', |
|
153 | + array( |
|
154 | + $this, |
|
155 | + 'limit_search_to_title', |
|
156 | + ), |
|
157 | + 10, |
|
158 | + 2 |
|
159 | + ); |
|
160 | + |
|
161 | + // Set a reference to ourselves to pass to the closure. |
|
162 | + $publisher_service = $this; |
|
163 | + |
|
164 | + // Map the results in a `Select2` compatible array. |
|
165 | + return array_map( |
|
166 | + function ( $entity ) use ( $publisher_service ) { |
|
167 | + $type = wp_get_post_terms( $entity->ID, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
168 | + $thumb_id = get_post_thumbnail_id( $entity->ID ); |
|
169 | + |
|
170 | + return array( |
|
171 | + 'id' => $entity->ID, |
|
172 | + 'text' => $entity->post_title, |
|
173 | + 'type' => $type[0]->name, |
|
174 | + 'thumbnail_url' => $publisher_service->get_attachment_image_url( $thumb_id ), |
|
175 | + ); |
|
176 | + }, |
|
177 | + $entities |
|
178 | + ); |
|
179 | + } |
|
180 | + |
|
181 | + /** |
|
182 | + * Get the thumbnail's URL. |
|
183 | + * |
|
184 | + * @param int $attachment_id The attachment id. |
|
185 | + * @param string $size The attachment size (default = 'thumbnail'). |
|
186 | + * |
|
187 | + * @return string|bool The image URL or false if not found. |
|
188 | + * @since 3.11.0 |
|
189 | + */ |
|
190 | + public function get_attachment_image_url( $attachment_id, $size = 'thumbnail' ) { |
|
191 | + |
|
192 | + $image = wp_get_attachment_image_src( $attachment_id, $size ); |
|
193 | + |
|
194 | + return isset( $image['0'] ) ? $image['0'] : false; |
|
195 | + } |
|
196 | + |
|
197 | + /** |
|
198 | + * Add additional instructions to featured image metabox |
|
199 | + * when the entity type is the publisher. |
|
200 | + * |
|
201 | + * @param string $content Current metabox content. |
|
202 | + * |
|
203 | + * @return string $content metabox content with additional instructions. |
|
204 | + * @since 3.19.0 |
|
205 | + */ |
|
206 | + public function add_featured_image_instruction( $content ) { |
|
207 | + // Get the current post ID. |
|
208 | + $post_id = get_the_ID(); |
|
209 | + |
|
210 | + // Get the publisher id. |
|
211 | + $publisher_id = Wordlift_Configuration_Service::get_instance()->get_publisher_id(); |
|
212 | + |
|
213 | + // Bail if for some reason the post id is not set. |
|
214 | + if ( |
|
215 | + empty( $post_id ) || |
|
216 | + $post_id !== (int) $publisher_id |
|
217 | + ) { |
|
218 | + return $content; |
|
219 | + } |
|
220 | + |
|
221 | + $terms = wp_get_post_terms( |
|
222 | + $post_id, // The post id. |
|
223 | + Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, // The taxonomy slug. |
|
224 | + array( |
|
225 | + 'fields' => 'slugs', |
|
226 | + // We don't need all fields, but only slugs. |
|
227 | + ) |
|
228 | + ); |
|
229 | + |
|
230 | + // Check that the entity type is "Organization". |
|
231 | + if ( in_array( 'organization', $terms, true ) ) { |
|
232 | + // Add the featured image description when the type is "Organization". |
|
233 | + |
|
234 | + $link = sprintf( |
|
235 | + '<a target="_blank" href="%s">%s</a>', |
|
236 | + esc_attr__( 'https://developers.google.com/search/docs/data-types/article#logo-guidelines', 'wordlift' ), |
|
237 | + esc_html__( 'AMP logo guidelines', 'wordlift' ) |
|
238 | + ); |
|
239 | + $content .= sprintf( |
|
240 | + '<p>' |
|
241 | + /* translators: %s: AMP logo guidelines. */ |
|
242 | + . esc_html_x( 'According to the %s, the logo should fit in a 60x600px rectangle, and either be exactly 60px high (preferred), or exactly 600px wide. For example, 450x45px would not be acceptable, even though it fits in the 600x60px rectangle. To comply with the guidelines, WordLift will automatically resize the Featured Image for structured data formats.', 'After "According to the" goes the link to the "AMP logo guidelines".', 'wordlift' ) |
|
243 | + . '</p>', |
|
244 | + $link |
|
245 | + ); |
|
246 | + } |
|
247 | + |
|
248 | + // Finally return the content. |
|
249 | + return $content; |
|
250 | + } |
|
251 | 251 | |
252 | 252 | } |
@@ -26,7 +26,7 @@ discard block |
||
26 | 26 | |
27 | 27 | public static function get_instance() { |
28 | 28 | |
29 | - if ( ! isset( self::$instance ) ) { |
|
29 | + if ( ! isset(self::$instance)) { |
|
30 | 30 | self::$instance = new self(); |
31 | 31 | } |
32 | 32 | |
@@ -49,12 +49,12 @@ discard block |
||
49 | 49 | array( |
50 | 50 | 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
51 | 51 | 'post_status' => 'publish', |
52 | - 'posts_per_page' => - 1, |
|
52 | + 'posts_per_page' => -1, |
|
53 | 53 | 'tax_query' => array( |
54 | 54 | array( |
55 | 55 | 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
56 | 56 | 'field' => 'slug', |
57 | - 'terms' => array( 'organization', 'person' ), |
|
57 | + 'terms' => array('organization', 'person'), |
|
58 | 58 | ), |
59 | 59 | ), |
60 | 60 | 'fields' => 'ids', |
@@ -62,7 +62,7 @@ discard block |
||
62 | 62 | ); |
63 | 63 | |
64 | 64 | // Finally return the count. |
65 | - return count( $entities ); |
|
65 | + return count($entities); |
|
66 | 66 | } |
67 | 67 | |
68 | 68 | /** |
@@ -77,28 +77,28 @@ discard block |
||
77 | 77 | * |
78 | 78 | * @return array|string An array of results. |
79 | 79 | */ |
80 | - public function limit_search_to_title( $search, $wp_query ) { |
|
80 | + public function limit_search_to_title($search, $wp_query) { |
|
81 | 81 | |
82 | 82 | // Bail out if the search or the `search_terms` haven't been set. |
83 | - if ( empty( $search ) || empty( $wp_query->query_vars['search_terms'] ) ) { |
|
83 | + if (empty($search) || empty($wp_query->query_vars['search_terms'])) { |
|
84 | 84 | return $search; |
85 | 85 | } |
86 | 86 | |
87 | 87 | global $wpdb; |
88 | 88 | |
89 | 89 | $query_vars = $wp_query->query_vars; |
90 | - $percent = ! empty( $query_vars['exact'] ) ? '' : '%'; |
|
90 | + $percent = ! empty($query_vars['exact']) ? '' : '%'; |
|
91 | 91 | $search = array(); |
92 | 92 | |
93 | - foreach ( (array) $query_vars['search_terms'] as $term ) { |
|
94 | - $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $percent . $wpdb->esc_like( $term ) . $percent ); |
|
93 | + foreach ((array) $query_vars['search_terms'] as $term) { |
|
94 | + $search[] = $wpdb->prepare("$wpdb->posts.post_title LIKE %s", $percent.$wpdb->esc_like($term).$percent); |
|
95 | 95 | } |
96 | 96 | |
97 | - if ( ! is_user_logged_in() ) { |
|
97 | + if ( ! is_user_logged_in()) { |
|
98 | 98 | $search[] = "$wpdb->posts.post_password = ''"; |
99 | 99 | } |
100 | 100 | |
101 | - $search = ' AND ' . implode( ' AND ', $search ); |
|
101 | + $search = ' AND '.implode(' AND ', $search); |
|
102 | 102 | |
103 | 103 | return $search; |
104 | 104 | } |
@@ -112,7 +112,7 @@ discard block |
||
112 | 112 | * @return array An array of results in a select2 friendly format. |
113 | 113 | * @since 3.11.0 |
114 | 114 | */ |
115 | - public function query( $filter = '' ) { |
|
115 | + public function query($filter = '') { |
|
116 | 116 | |
117 | 117 | // Search for the filter in the titles only. |
118 | 118 | add_filter( |
@@ -133,12 +133,12 @@ discard block |
||
133 | 133 | array( |
134 | 134 | 'post_type' => Wordlift_Entity_Service::valid_entity_post_types(), |
135 | 135 | 'post_status' => 'publish', |
136 | - 'posts_per_page' => - 1, |
|
136 | + 'posts_per_page' => -1, |
|
137 | 137 | 'tax_query' => array( |
138 | 138 | array( |
139 | 139 | 'taxonomy' => Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
140 | 140 | 'field' => 'slug', |
141 | - 'terms' => array( 'organization', 'person' ), |
|
141 | + 'terms' => array('organization', 'person'), |
|
142 | 142 | ), |
143 | 143 | ), |
144 | 144 | 's' => $filter, |
@@ -163,15 +163,15 @@ discard block |
||
163 | 163 | |
164 | 164 | // Map the results in a `Select2` compatible array. |
165 | 165 | return array_map( |
166 | - function ( $entity ) use ( $publisher_service ) { |
|
167 | - $type = wp_get_post_terms( $entity->ID, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
168 | - $thumb_id = get_post_thumbnail_id( $entity->ID ); |
|
166 | + function($entity) use ($publisher_service) { |
|
167 | + $type = wp_get_post_terms($entity->ID, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME); |
|
168 | + $thumb_id = get_post_thumbnail_id($entity->ID); |
|
169 | 169 | |
170 | 170 | return array( |
171 | 171 | 'id' => $entity->ID, |
172 | 172 | 'text' => $entity->post_title, |
173 | 173 | 'type' => $type[0]->name, |
174 | - 'thumbnail_url' => $publisher_service->get_attachment_image_url( $thumb_id ), |
|
174 | + 'thumbnail_url' => $publisher_service->get_attachment_image_url($thumb_id), |
|
175 | 175 | ); |
176 | 176 | }, |
177 | 177 | $entities |
@@ -187,11 +187,11 @@ discard block |
||
187 | 187 | * @return string|bool The image URL or false if not found. |
188 | 188 | * @since 3.11.0 |
189 | 189 | */ |
190 | - public function get_attachment_image_url( $attachment_id, $size = 'thumbnail' ) { |
|
190 | + public function get_attachment_image_url($attachment_id, $size = 'thumbnail') { |
|
191 | 191 | |
192 | - $image = wp_get_attachment_image_src( $attachment_id, $size ); |
|
192 | + $image = wp_get_attachment_image_src($attachment_id, $size); |
|
193 | 193 | |
194 | - return isset( $image['0'] ) ? $image['0'] : false; |
|
194 | + return isset($image['0']) ? $image['0'] : false; |
|
195 | 195 | } |
196 | 196 | |
197 | 197 | /** |
@@ -203,7 +203,7 @@ discard block |
||
203 | 203 | * @return string $content metabox content with additional instructions. |
204 | 204 | * @since 3.19.0 |
205 | 205 | */ |
206 | - public function add_featured_image_instruction( $content ) { |
|
206 | + public function add_featured_image_instruction($content) { |
|
207 | 207 | // Get the current post ID. |
208 | 208 | $post_id = get_the_ID(); |
209 | 209 | |
@@ -212,7 +212,7 @@ discard block |
||
212 | 212 | |
213 | 213 | // Bail if for some reason the post id is not set. |
214 | 214 | if ( |
215 | - empty( $post_id ) || |
|
215 | + empty($post_id) || |
|
216 | 216 | $post_id !== (int) $publisher_id |
217 | 217 | ) { |
218 | 218 | return $content; |
@@ -228,18 +228,18 @@ discard block |
||
228 | 228 | ); |
229 | 229 | |
230 | 230 | // Check that the entity type is "Organization". |
231 | - if ( in_array( 'organization', $terms, true ) ) { |
|
231 | + if (in_array('organization', $terms, true)) { |
|
232 | 232 | // Add the featured image description when the type is "Organization". |
233 | 233 | |
234 | - $link = sprintf( |
|
234 | + $link = sprintf( |
|
235 | 235 | '<a target="_blank" href="%s">%s</a>', |
236 | - esc_attr__( 'https://developers.google.com/search/docs/data-types/article#logo-guidelines', 'wordlift' ), |
|
237 | - esc_html__( 'AMP logo guidelines', 'wordlift' ) |
|
236 | + esc_attr__('https://developers.google.com/search/docs/data-types/article#logo-guidelines', 'wordlift'), |
|
237 | + esc_html__('AMP logo guidelines', 'wordlift') |
|
238 | 238 | ); |
239 | 239 | $content .= sprintf( |
240 | 240 | '<p>' |
241 | 241 | /* translators: %s: AMP logo guidelines. */ |
242 | - . esc_html_x( 'According to the %s, the logo should fit in a 60x600px rectangle, and either be exactly 60px high (preferred), or exactly 600px wide. For example, 450x45px would not be acceptable, even though it fits in the 600x60px rectangle. To comply with the guidelines, WordLift will automatically resize the Featured Image for structured data formats.', 'After "According to the" goes the link to the "AMP logo guidelines".', 'wordlift' ) |
|
242 | + . esc_html_x('According to the %s, the logo should fit in a 60x600px rectangle, and either be exactly 60px high (preferred), or exactly 600px wide. For example, 450x45px would not be acceptable, even though it fits in the 600x60px rectangle. To comply with the guidelines, WordLift will automatically resize the Featured Image for structured data formats.', 'After "According to the" goes the link to the "AMP logo guidelines".', 'wordlift') |
|
243 | 243 | . '</p>', |
244 | 244 | $link |
245 | 245 | ); |
@@ -20,199 +20,199 @@ |
||
20 | 20 | */ |
21 | 21 | class Wordlift_Uri_Service { |
22 | 22 | |
23 | - /** |
|
24 | - * The title regex to sanitize titles in paths. |
|
25 | - * |
|
26 | - * According to RFC2396 (http://www.ietf.org/rfc/rfc2396.txt) these characters are reserved: |
|
27 | - * ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | |
|
28 | - * "$" | "," |
|
29 | - * |
|
30 | - * We also remove the space and the UTF-8 BOM sequence. |
|
31 | - * |
|
32 | - * @since 3.7.1 |
|
33 | - */ |
|
34 | - const INVALID_CHARACTERS = "/[ ;\\/?:@&=\\+\\\$,]|(?:\\xEF\\xBB\\xBF)/"; |
|
35 | - |
|
36 | - /** |
|
37 | - * A {@link Wordlift_Log_Service} instance. |
|
38 | - * |
|
39 | - * @since 3.6.0 |
|
40 | - * @access private |
|
41 | - * @var \Wordlift_Log_Service $log A {@link Wordlift_Log_Service} instance. |
|
42 | - */ |
|
43 | - private $log; |
|
44 | - |
|
45 | - /** |
|
46 | - * The global WordPress database connection. |
|
47 | - * |
|
48 | - * @since 3.6.0 |
|
49 | - * @access private |
|
50 | - * @var \wpdb $wpdb The global WordPress database connection. |
|
51 | - */ |
|
52 | - private $wpdb; |
|
53 | - |
|
54 | - /** |
|
55 | - * The {@link Wordlift_Uri_Service} singleton instance. |
|
56 | - * |
|
57 | - * @since 3.7.2 |
|
58 | - * @access private |
|
59 | - * @var \Wordlift_Uri_Service The {@link Wordlift_Uri_Service} singleton instance. |
|
60 | - */ |
|
61 | - private static $instance; |
|
62 | - |
|
63 | - /** |
|
64 | - * Create an instance of Wordlift_Uri_Service. |
|
65 | - * |
|
66 | - * @param \wpdb $wpdb The global WordPress database connection. |
|
67 | - * |
|
68 | - * @since 3.6.0 |
|
69 | - */ |
|
70 | - public function __construct( $wpdb ) { |
|
71 | - |
|
72 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Uri_Service' ); |
|
73 | - |
|
74 | - $this->wpdb = $wpdb; |
|
75 | - |
|
76 | - self::$instance = $this; |
|
77 | - |
|
78 | - } |
|
79 | - |
|
80 | - /** |
|
81 | - * Get the {@link Wordlift_Uri_Service} singleton instance. |
|
82 | - * |
|
83 | - * @return \Wordlift_Uri_Service The {@link Wordlift_Uri_Service} singleton instance. |
|
84 | - * @since 3.7.2 |
|
85 | - */ |
|
86 | - public static function get_instance() { |
|
87 | - |
|
88 | - return self::$instance; |
|
89 | - } |
|
90 | - |
|
91 | - /** |
|
92 | - * Sanitizes an URI path by replacing the not allowed characters with an underscore. |
|
93 | - * |
|
94 | - * @param string $path The path to sanitize. |
|
95 | - * @param string $char The replacement character (by default an underscore). |
|
96 | - * |
|
97 | - * @return string The sanitized path. |
|
98 | - * @since 3.7.2 |
|
99 | - * @uses sanitize_title() to manage not ASCII chars |
|
100 | - * |
|
101 | - * @see https://codex.wordpress.org/Function_Reference/sanitize_title |
|
102 | - */ |
|
103 | - public function sanitize_path( $path, $char = '_' ) { |
|
104 | - |
|
105 | - // Ensure the path is ASCII. |
|
106 | - // see https://github.com/insideout10/wordlift-plugin/issues/386 |
|
107 | - // $path_ascii = mb_convert_encoding( $path, 'ASCII' ); |
|
108 | - |
|
109 | - return sanitize_title( preg_replace( self::INVALID_CHARACTERS, $char, stripslashes( $path ) ) ); |
|
110 | - } |
|
111 | - |
|
112 | - /** |
|
113 | - * Build an entity uri for a given title. The uri is composed using a given |
|
114 | - * post_type and a title. If already exists an entity e2 with a given uri a |
|
115 | - * numeric suffix is added. If a schema type is given entities with same label |
|
116 | - * and same type are overridden. |
|
117 | - * |
|
118 | - * @param string $title A post title. |
|
119 | - * @param string $post_type A post type. Default value is 'entity' |
|
120 | - * @param string $schema_type A schema org type. |
|
121 | - * @param integer $increment_digit A digit used to call recursively the same function. |
|
122 | - * |
|
123 | - * @return string Returns an uri. |
|
124 | - * @deprecated don't use anywhere else, since we're refactoring the way URIs are built in the global function wl_build_entity_uri. |
|
125 | - * @since 3.5.0 |
|
126 | - */ |
|
127 | - public function build_uri( $title, $post_type, $schema_type = null, $increment_digit = 0 ) { |
|
128 | - |
|
129 | - // Get the entity slug suffix digit |
|
130 | - $suffix_digit = $increment_digit + 1; |
|
131 | - |
|
132 | - // Get a sanitized uri for a given title. |
|
133 | - /* |
|
23 | + /** |
|
24 | + * The title regex to sanitize titles in paths. |
|
25 | + * |
|
26 | + * According to RFC2396 (http://www.ietf.org/rfc/rfc2396.txt) these characters are reserved: |
|
27 | + * ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | |
|
28 | + * "$" | "," |
|
29 | + * |
|
30 | + * We also remove the space and the UTF-8 BOM sequence. |
|
31 | + * |
|
32 | + * @since 3.7.1 |
|
33 | + */ |
|
34 | + const INVALID_CHARACTERS = "/[ ;\\/?:@&=\\+\\\$,]|(?:\\xEF\\xBB\\xBF)/"; |
|
35 | + |
|
36 | + /** |
|
37 | + * A {@link Wordlift_Log_Service} instance. |
|
38 | + * |
|
39 | + * @since 3.6.0 |
|
40 | + * @access private |
|
41 | + * @var \Wordlift_Log_Service $log A {@link Wordlift_Log_Service} instance. |
|
42 | + */ |
|
43 | + private $log; |
|
44 | + |
|
45 | + /** |
|
46 | + * The global WordPress database connection. |
|
47 | + * |
|
48 | + * @since 3.6.0 |
|
49 | + * @access private |
|
50 | + * @var \wpdb $wpdb The global WordPress database connection. |
|
51 | + */ |
|
52 | + private $wpdb; |
|
53 | + |
|
54 | + /** |
|
55 | + * The {@link Wordlift_Uri_Service} singleton instance. |
|
56 | + * |
|
57 | + * @since 3.7.2 |
|
58 | + * @access private |
|
59 | + * @var \Wordlift_Uri_Service The {@link Wordlift_Uri_Service} singleton instance. |
|
60 | + */ |
|
61 | + private static $instance; |
|
62 | + |
|
63 | + /** |
|
64 | + * Create an instance of Wordlift_Uri_Service. |
|
65 | + * |
|
66 | + * @param \wpdb $wpdb The global WordPress database connection. |
|
67 | + * |
|
68 | + * @since 3.6.0 |
|
69 | + */ |
|
70 | + public function __construct( $wpdb ) { |
|
71 | + |
|
72 | + $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Uri_Service' ); |
|
73 | + |
|
74 | + $this->wpdb = $wpdb; |
|
75 | + |
|
76 | + self::$instance = $this; |
|
77 | + |
|
78 | + } |
|
79 | + |
|
80 | + /** |
|
81 | + * Get the {@link Wordlift_Uri_Service} singleton instance. |
|
82 | + * |
|
83 | + * @return \Wordlift_Uri_Service The {@link Wordlift_Uri_Service} singleton instance. |
|
84 | + * @since 3.7.2 |
|
85 | + */ |
|
86 | + public static function get_instance() { |
|
87 | + |
|
88 | + return self::$instance; |
|
89 | + } |
|
90 | + |
|
91 | + /** |
|
92 | + * Sanitizes an URI path by replacing the not allowed characters with an underscore. |
|
93 | + * |
|
94 | + * @param string $path The path to sanitize. |
|
95 | + * @param string $char The replacement character (by default an underscore). |
|
96 | + * |
|
97 | + * @return string The sanitized path. |
|
98 | + * @since 3.7.2 |
|
99 | + * @uses sanitize_title() to manage not ASCII chars |
|
100 | + * |
|
101 | + * @see https://codex.wordpress.org/Function_Reference/sanitize_title |
|
102 | + */ |
|
103 | + public function sanitize_path( $path, $char = '_' ) { |
|
104 | + |
|
105 | + // Ensure the path is ASCII. |
|
106 | + // see https://github.com/insideout10/wordlift-plugin/issues/386 |
|
107 | + // $path_ascii = mb_convert_encoding( $path, 'ASCII' ); |
|
108 | + |
|
109 | + return sanitize_title( preg_replace( self::INVALID_CHARACTERS, $char, stripslashes( $path ) ) ); |
|
110 | + } |
|
111 | + |
|
112 | + /** |
|
113 | + * Build an entity uri for a given title. The uri is composed using a given |
|
114 | + * post_type and a title. If already exists an entity e2 with a given uri a |
|
115 | + * numeric suffix is added. If a schema type is given entities with same label |
|
116 | + * and same type are overridden. |
|
117 | + * |
|
118 | + * @param string $title A post title. |
|
119 | + * @param string $post_type A post type. Default value is 'entity' |
|
120 | + * @param string $schema_type A schema org type. |
|
121 | + * @param integer $increment_digit A digit used to call recursively the same function. |
|
122 | + * |
|
123 | + * @return string Returns an uri. |
|
124 | + * @deprecated don't use anywhere else, since we're refactoring the way URIs are built in the global function wl_build_entity_uri. |
|
125 | + * @since 3.5.0 |
|
126 | + */ |
|
127 | + public function build_uri( $title, $post_type, $schema_type = null, $increment_digit = 0 ) { |
|
128 | + |
|
129 | + // Get the entity slug suffix digit |
|
130 | + $suffix_digit = $increment_digit + 1; |
|
131 | + |
|
132 | + // Get a sanitized uri for a given title. |
|
133 | + /* |
|
134 | 134 | * The call takes into consideration URL encoding. |
135 | 135 | * |
136 | 136 | * @see https://github.com/insideout10/wordlift-plugin/issues/885 |
137 | 137 | * |
138 | 138 | * @since 3.20.0 |
139 | 139 | */ |
140 | - $entity_slug = urldecode( wl_sanitize_uri_path( $title ) ) |
|
141 | - . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
142 | - |
|
143 | - // Compose a candidate uri. |
|
144 | - $new_entity_uri = sprintf( |
|
145 | - '%s/%s/%s', |
|
146 | - untrailingslashit( wl_configuration_get_redlink_dataset_uri() ), |
|
147 | - $post_type, |
|
148 | - $entity_slug |
|
149 | - ); |
|
150 | - |
|
151 | - $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
152 | - |
|
153 | - $content = Wordpress_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
154 | - $post_id = $content && is_a( $content->get_bag(), '\WP_Post' ) ? $content->get_bag()->ID : null; |
|
155 | - |
|
156 | - // If the post does not exist, then the new uri is returned |
|
157 | - if ( ! is_numeric( $post_id ) ) { |
|
158 | - $this->log->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
159 | - |
|
160 | - return $new_entity_uri; |
|
161 | - } |
|
162 | - |
|
163 | - // If schema_type is equal to schema org type of post x, then the new uri is returned |
|
164 | - $schema_post_type = Wordlift_Entity_Type_Service::get_instance()->get( $post_id ); |
|
165 | - |
|
166 | - // @todo: we shouldn't rely on css classes to take such decisions. |
|
167 | - if ( $schema_type === $schema_post_type['css_class'] ) { |
|
168 | - $this->log->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
169 | - |
|
170 | - return $new_entity_uri; |
|
171 | - } |
|
172 | - |
|
173 | - // Otherwise the same function is called recursively |
|
174 | - return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit ); |
|
175 | - } |
|
176 | - |
|
177 | - /** |
|
178 | - * |
|
179 | - * @param string $title A post title. |
|
180 | - * @param string $taxonomy A post type. Default value is 'entity' |
|
181 | - * @param integer $increment_digit A digit used to call recursively the same function. |
|
182 | - * |
|
183 | - * @return string Returns an uri. |
|
184 | - * @since 3.32.0 |
|
185 | - */ |
|
186 | - public function build_term_uri( $title, $taxonomy, $increment_digit = 0 ) { |
|
187 | - |
|
188 | - // Get the entity slug suffix digit |
|
189 | - $suffix_digit = $increment_digit + 1; |
|
190 | - |
|
191 | - $entity_slug = urldecode( $title ) |
|
192 | - . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
193 | - |
|
194 | - // Compose a candidate uri. |
|
195 | - $new_entity_uri = sprintf( |
|
196 | - '%s/term/%s/%s', |
|
197 | - Wordlift_Configuration_Service::get_instance()->get_dataset_uri(), |
|
198 | - $taxonomy, |
|
199 | - $entity_slug |
|
200 | - ); |
|
201 | - |
|
202 | - $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
203 | - |
|
204 | - $content = Wordpress_Term_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
205 | - $term_id = $content ? $content->get_bag()->term_id : null; |
|
206 | - |
|
207 | - // If the post does not exist, then the new uri is returned |
|
208 | - if ( ! is_numeric( $term_id ) ) { |
|
209 | - $this->log->trace( "Going to return uri [ new_term_entity_uri :: $new_entity_uri ]" ); |
|
210 | - |
|
211 | - return $new_entity_uri; |
|
212 | - } |
|
213 | - |
|
214 | - // Otherwise the same function is called recursively |
|
215 | - return $this->build_term_uri( $title, $taxonomy, ++ $increment_digit ); |
|
216 | - } |
|
140 | + $entity_slug = urldecode( wl_sanitize_uri_path( $title ) ) |
|
141 | + . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
142 | + |
|
143 | + // Compose a candidate uri. |
|
144 | + $new_entity_uri = sprintf( |
|
145 | + '%s/%s/%s', |
|
146 | + untrailingslashit( wl_configuration_get_redlink_dataset_uri() ), |
|
147 | + $post_type, |
|
148 | + $entity_slug |
|
149 | + ); |
|
150 | + |
|
151 | + $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
152 | + |
|
153 | + $content = Wordpress_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
154 | + $post_id = $content && is_a( $content->get_bag(), '\WP_Post' ) ? $content->get_bag()->ID : null; |
|
155 | + |
|
156 | + // If the post does not exist, then the new uri is returned |
|
157 | + if ( ! is_numeric( $post_id ) ) { |
|
158 | + $this->log->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
159 | + |
|
160 | + return $new_entity_uri; |
|
161 | + } |
|
162 | + |
|
163 | + // If schema_type is equal to schema org type of post x, then the new uri is returned |
|
164 | + $schema_post_type = Wordlift_Entity_Type_Service::get_instance()->get( $post_id ); |
|
165 | + |
|
166 | + // @todo: we shouldn't rely on css classes to take such decisions. |
|
167 | + if ( $schema_type === $schema_post_type['css_class'] ) { |
|
168 | + $this->log->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
169 | + |
|
170 | + return $new_entity_uri; |
|
171 | + } |
|
172 | + |
|
173 | + // Otherwise the same function is called recursively |
|
174 | + return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit ); |
|
175 | + } |
|
176 | + |
|
177 | + /** |
|
178 | + * |
|
179 | + * @param string $title A post title. |
|
180 | + * @param string $taxonomy A post type. Default value is 'entity' |
|
181 | + * @param integer $increment_digit A digit used to call recursively the same function. |
|
182 | + * |
|
183 | + * @return string Returns an uri. |
|
184 | + * @since 3.32.0 |
|
185 | + */ |
|
186 | + public function build_term_uri( $title, $taxonomy, $increment_digit = 0 ) { |
|
187 | + |
|
188 | + // Get the entity slug suffix digit |
|
189 | + $suffix_digit = $increment_digit + 1; |
|
190 | + |
|
191 | + $entity_slug = urldecode( $title ) |
|
192 | + . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
193 | + |
|
194 | + // Compose a candidate uri. |
|
195 | + $new_entity_uri = sprintf( |
|
196 | + '%s/term/%s/%s', |
|
197 | + Wordlift_Configuration_Service::get_instance()->get_dataset_uri(), |
|
198 | + $taxonomy, |
|
199 | + $entity_slug |
|
200 | + ); |
|
201 | + |
|
202 | + $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
203 | + |
|
204 | + $content = Wordpress_Term_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
205 | + $term_id = $content ? $content->get_bag()->term_id : null; |
|
206 | + |
|
207 | + // If the post does not exist, then the new uri is returned |
|
208 | + if ( ! is_numeric( $term_id ) ) { |
|
209 | + $this->log->trace( "Going to return uri [ new_term_entity_uri :: $new_entity_uri ]" ); |
|
210 | + |
|
211 | + return $new_entity_uri; |
|
212 | + } |
|
213 | + |
|
214 | + // Otherwise the same function is called recursively |
|
215 | + return $this->build_term_uri( $title, $taxonomy, ++ $increment_digit ); |
|
216 | + } |
|
217 | 217 | |
218 | 218 | } |
@@ -67,9 +67,9 @@ discard block |
||
67 | 67 | * |
68 | 68 | * @since 3.6.0 |
69 | 69 | */ |
70 | - public function __construct( $wpdb ) { |
|
70 | + public function __construct($wpdb) { |
|
71 | 71 | |
72 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Uri_Service' ); |
|
72 | + $this->log = Wordlift_Log_Service::get_logger('Wordlift_Uri_Service'); |
|
73 | 73 | |
74 | 74 | $this->wpdb = $wpdb; |
75 | 75 | |
@@ -100,13 +100,13 @@ discard block |
||
100 | 100 | * |
101 | 101 | * @see https://codex.wordpress.org/Function_Reference/sanitize_title |
102 | 102 | */ |
103 | - public function sanitize_path( $path, $char = '_' ) { |
|
103 | + public function sanitize_path($path, $char = '_') { |
|
104 | 104 | |
105 | 105 | // Ensure the path is ASCII. |
106 | 106 | // see https://github.com/insideout10/wordlift-plugin/issues/386 |
107 | 107 | // $path_ascii = mb_convert_encoding( $path, 'ASCII' ); |
108 | 108 | |
109 | - return sanitize_title( preg_replace( self::INVALID_CHARACTERS, $char, stripslashes( $path ) ) ); |
|
109 | + return sanitize_title(preg_replace(self::INVALID_CHARACTERS, $char, stripslashes($path))); |
|
110 | 110 | } |
111 | 111 | |
112 | 112 | /** |
@@ -124,7 +124,7 @@ discard block |
||
124 | 124 | * @deprecated don't use anywhere else, since we're refactoring the way URIs are built in the global function wl_build_entity_uri. |
125 | 125 | * @since 3.5.0 |
126 | 126 | */ |
127 | - public function build_uri( $title, $post_type, $schema_type = null, $increment_digit = 0 ) { |
|
127 | + public function build_uri($title, $post_type, $schema_type = null, $increment_digit = 0) { |
|
128 | 128 | |
129 | 129 | // Get the entity slug suffix digit |
130 | 130 | $suffix_digit = $increment_digit + 1; |
@@ -137,41 +137,41 @@ discard block |
||
137 | 137 | * |
138 | 138 | * @since 3.20.0 |
139 | 139 | */ |
140 | - $entity_slug = urldecode( wl_sanitize_uri_path( $title ) ) |
|
141 | - . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
140 | + $entity_slug = urldecode(wl_sanitize_uri_path($title)) |
|
141 | + . (0 === $increment_digit ? '' : '_'.$suffix_digit); |
|
142 | 142 | |
143 | 143 | // Compose a candidate uri. |
144 | 144 | $new_entity_uri = sprintf( |
145 | 145 | '%s/%s/%s', |
146 | - untrailingslashit( wl_configuration_get_redlink_dataset_uri() ), |
|
146 | + untrailingslashit(wl_configuration_get_redlink_dataset_uri()), |
|
147 | 147 | $post_type, |
148 | 148 | $entity_slug |
149 | 149 | ); |
150 | 150 | |
151 | - $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
151 | + $this->log->trace("Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]"); |
|
152 | 152 | |
153 | - $content = Wordpress_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
154 | - $post_id = $content && is_a( $content->get_bag(), '\WP_Post' ) ? $content->get_bag()->ID : null; |
|
153 | + $content = Wordpress_Content_Service::get_instance()->get_by_entity_id($new_entity_uri); |
|
154 | + $post_id = $content && is_a($content->get_bag(), '\WP_Post') ? $content->get_bag()->ID : null; |
|
155 | 155 | |
156 | 156 | // If the post does not exist, then the new uri is returned |
157 | - if ( ! is_numeric( $post_id ) ) { |
|
158 | - $this->log->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
157 | + if ( ! is_numeric($post_id)) { |
|
158 | + $this->log->trace("Going to return uri [ new_entity_uri :: $new_entity_uri ]"); |
|
159 | 159 | |
160 | 160 | return $new_entity_uri; |
161 | 161 | } |
162 | 162 | |
163 | 163 | // If schema_type is equal to schema org type of post x, then the new uri is returned |
164 | - $schema_post_type = Wordlift_Entity_Type_Service::get_instance()->get( $post_id ); |
|
164 | + $schema_post_type = Wordlift_Entity_Type_Service::get_instance()->get($post_id); |
|
165 | 165 | |
166 | 166 | // @todo: we shouldn't rely on css classes to take such decisions. |
167 | - if ( $schema_type === $schema_post_type['css_class'] ) { |
|
168 | - $this->log->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" ); |
|
167 | + if ($schema_type === $schema_post_type['css_class']) { |
|
168 | + $this->log->trace("An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]"); |
|
169 | 169 | |
170 | 170 | return $new_entity_uri; |
171 | 171 | } |
172 | 172 | |
173 | 173 | // Otherwise the same function is called recursively |
174 | - return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit ); |
|
174 | + return $this->build_uri($title, $post_type, $schema_type, ++ $increment_digit); |
|
175 | 175 | } |
176 | 176 | |
177 | 177 | /** |
@@ -183,13 +183,13 @@ discard block |
||
183 | 183 | * @return string Returns an uri. |
184 | 184 | * @since 3.32.0 |
185 | 185 | */ |
186 | - public function build_term_uri( $title, $taxonomy, $increment_digit = 0 ) { |
|
186 | + public function build_term_uri($title, $taxonomy, $increment_digit = 0) { |
|
187 | 187 | |
188 | 188 | // Get the entity slug suffix digit |
189 | 189 | $suffix_digit = $increment_digit + 1; |
190 | 190 | |
191 | - $entity_slug = urldecode( $title ) |
|
192 | - . ( 0 === $increment_digit ? '' : '_' . $suffix_digit ); |
|
191 | + $entity_slug = urldecode($title) |
|
192 | + . (0 === $increment_digit ? '' : '_'.$suffix_digit); |
|
193 | 193 | |
194 | 194 | // Compose a candidate uri. |
195 | 195 | $new_entity_uri = sprintf( |
@@ -199,20 +199,20 @@ discard block |
||
199 | 199 | $entity_slug |
200 | 200 | ); |
201 | 201 | |
202 | - $this->log->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" ); |
|
202 | + $this->log->trace("Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]"); |
|
203 | 203 | |
204 | - $content = Wordpress_Term_Content_Service::get_instance()->get_by_entity_id( $new_entity_uri ); |
|
204 | + $content = Wordpress_Term_Content_Service::get_instance()->get_by_entity_id($new_entity_uri); |
|
205 | 205 | $term_id = $content ? $content->get_bag()->term_id : null; |
206 | 206 | |
207 | 207 | // If the post does not exist, then the new uri is returned |
208 | - if ( ! is_numeric( $term_id ) ) { |
|
209 | - $this->log->trace( "Going to return uri [ new_term_entity_uri :: $new_entity_uri ]" ); |
|
208 | + if ( ! is_numeric($term_id)) { |
|
209 | + $this->log->trace("Going to return uri [ new_term_entity_uri :: $new_entity_uri ]"); |
|
210 | 210 | |
211 | 211 | return $new_entity_uri; |
212 | 212 | } |
213 | 213 | |
214 | 214 | // Otherwise the same function is called recursively |
215 | - return $this->build_term_uri( $title, $taxonomy, ++ $increment_digit ); |
|
215 | + return $this->build_term_uri($title, $taxonomy, ++ $increment_digit); |
|
216 | 216 | } |
217 | 217 | |
218 | 218 | } |
@@ -8,61 +8,61 @@ |
||
8 | 8 | |
9 | 9 | class Wordlift_Batch_Action { |
10 | 10 | |
11 | - public static function process( $post_type, $offset, $query, $callback ) { |
|
11 | + public static function process( $post_type, $offset, $query, $callback ) { |
|
12 | 12 | |
13 | - $posts_per_page = 10; |
|
13 | + $posts_per_page = 10; |
|
14 | 14 | |
15 | - $args = array_merge( |
|
16 | - self::get_args( $post_type, $query ), |
|
17 | - array( |
|
18 | - 'offset' => $offset, |
|
19 | - 'posts_per_page' => $posts_per_page, |
|
20 | - ) |
|
21 | - ); |
|
15 | + $args = array_merge( |
|
16 | + self::get_args( $post_type, $query ), |
|
17 | + array( |
|
18 | + 'offset' => $offset, |
|
19 | + 'posts_per_page' => $posts_per_page, |
|
20 | + ) |
|
21 | + ); |
|
22 | 22 | |
23 | - $post_ids = get_posts( $args ); |
|
23 | + $post_ids = get_posts( $args ); |
|
24 | 24 | |
25 | - foreach ( $post_ids as $post_id ) { |
|
26 | - call_user_func( $callback, $post_id ); |
|
27 | - } |
|
25 | + foreach ( $post_ids as $post_id ) { |
|
26 | + call_user_func( $callback, $post_id ); |
|
27 | + } |
|
28 | 28 | |
29 | - return array( |
|
30 | - 'current' => $offset, |
|
31 | - 'next' => $offset + $posts_per_page, |
|
32 | - 'count' => self::count( $post_type, $query ), |
|
33 | - ); |
|
34 | - } |
|
29 | + return array( |
|
30 | + 'current' => $offset, |
|
31 | + 'next' => $offset + $posts_per_page, |
|
32 | + 'count' => self::count( $post_type, $query ), |
|
33 | + ); |
|
34 | + } |
|
35 | 35 | |
36 | - public static function count( $post_type, $query ) { |
|
37 | - $args = array_merge( |
|
38 | - self::get_args( $post_type, $query ), |
|
39 | - array( |
|
40 | - 'posts_per_page' => - 1, |
|
41 | - ) |
|
42 | - ); |
|
36 | + public static function count( $post_type, $query ) { |
|
37 | + $args = array_merge( |
|
38 | + self::get_args( $post_type, $query ), |
|
39 | + array( |
|
40 | + 'posts_per_page' => - 1, |
|
41 | + ) |
|
42 | + ); |
|
43 | 43 | |
44 | - return count( get_posts( $args ) ); |
|
45 | - } |
|
44 | + return count( get_posts( $args ) ); |
|
45 | + } |
|
46 | 46 | |
47 | - private static function get_args( $post_type, $query ) { |
|
47 | + private static function get_args( $post_type, $query ) { |
|
48 | 48 | |
49 | - return array_merge( |
|
50 | - array( |
|
51 | - 'fields' => 'ids', |
|
52 | - 'post_type' => $post_type, |
|
53 | - 'post_status' => array( |
|
54 | - 'publish', |
|
55 | - 'future', |
|
56 | - 'draft', |
|
57 | - 'pending', |
|
58 | - 'private', |
|
59 | - 'auto-draft', |
|
60 | - 'inherit', |
|
61 | - ), |
|
62 | - 'cache_results' => false, |
|
63 | - ), |
|
64 | - $query |
|
65 | - ); |
|
66 | - } |
|
49 | + return array_merge( |
|
50 | + array( |
|
51 | + 'fields' => 'ids', |
|
52 | + 'post_type' => $post_type, |
|
53 | + 'post_status' => array( |
|
54 | + 'publish', |
|
55 | + 'future', |
|
56 | + 'draft', |
|
57 | + 'pending', |
|
58 | + 'private', |
|
59 | + 'auto-draft', |
|
60 | + 'inherit', |
|
61 | + ), |
|
62 | + 'cache_results' => false, |
|
63 | + ), |
|
64 | + $query |
|
65 | + ); |
|
66 | + } |
|
67 | 67 | |
68 | 68 | } |
@@ -8,43 +8,43 @@ |
||
8 | 8 | |
9 | 9 | class Wordlift_Batch_Action { |
10 | 10 | |
11 | - public static function process( $post_type, $offset, $query, $callback ) { |
|
11 | + public static function process($post_type, $offset, $query, $callback) { |
|
12 | 12 | |
13 | 13 | $posts_per_page = 10; |
14 | 14 | |
15 | 15 | $args = array_merge( |
16 | - self::get_args( $post_type, $query ), |
|
16 | + self::get_args($post_type, $query), |
|
17 | 17 | array( |
18 | 18 | 'offset' => $offset, |
19 | 19 | 'posts_per_page' => $posts_per_page, |
20 | 20 | ) |
21 | 21 | ); |
22 | 22 | |
23 | - $post_ids = get_posts( $args ); |
|
23 | + $post_ids = get_posts($args); |
|
24 | 24 | |
25 | - foreach ( $post_ids as $post_id ) { |
|
26 | - call_user_func( $callback, $post_id ); |
|
25 | + foreach ($post_ids as $post_id) { |
|
26 | + call_user_func($callback, $post_id); |
|
27 | 27 | } |
28 | 28 | |
29 | 29 | return array( |
30 | 30 | 'current' => $offset, |
31 | 31 | 'next' => $offset + $posts_per_page, |
32 | - 'count' => self::count( $post_type, $query ), |
|
32 | + 'count' => self::count($post_type, $query), |
|
33 | 33 | ); |
34 | 34 | } |
35 | 35 | |
36 | - public static function count( $post_type, $query ) { |
|
36 | + public static function count($post_type, $query) { |
|
37 | 37 | $args = array_merge( |
38 | - self::get_args( $post_type, $query ), |
|
38 | + self::get_args($post_type, $query), |
|
39 | 39 | array( |
40 | - 'posts_per_page' => - 1, |
|
40 | + 'posts_per_page' => -1, |
|
41 | 41 | ) |
42 | 42 | ); |
43 | 43 | |
44 | - return count( get_posts( $args ) ); |
|
44 | + return count(get_posts($args)); |
|
45 | 45 | } |
46 | 46 | |
47 | - private static function get_args( $post_type, $query ) { |
|
47 | + private static function get_args($post_type, $query) { |
|
48 | 48 | |
49 | 49 | return array_merge( |
50 | 50 | array( |
@@ -2,26 +2,26 @@ |
||
2 | 2 | |
3 | 3 | class Wordlift_Sanitizer { |
4 | 4 | |
5 | - /** |
|
6 | - * Only accept URIs |
|
7 | - * |
|
8 | - * @param string $value |
|
9 | - * |
|
10 | - * @return null |
|
11 | - */ |
|
12 | - public static function sanitize_url( $value ) { |
|
5 | + /** |
|
6 | + * Only accept URIs |
|
7 | + * |
|
8 | + * @param string $value |
|
9 | + * |
|
10 | + * @return null |
|
11 | + */ |
|
12 | + public static function sanitize_url( $value ) { |
|
13 | 13 | |
14 | - // Initially this function used also filter_var( $value, FILTER_VALIDATE_URL ) |
|
15 | - // but URLs with UTF-8 characters are not valid. We store those anyway in the DB as it's up to the browser |
|
16 | - // to do proper url encoding when requesting the URL. |
|
17 | - // |
|
18 | - // see also http://stackoverflow.com/questions/2137080/php-filter-var-filter-validate-url |
|
14 | + // Initially this function used also filter_var( $value, FILTER_VALIDATE_URL ) |
|
15 | + // but URLs with UTF-8 characters are not valid. We store those anyway in the DB as it's up to the browser |
|
16 | + // to do proper url encoding when requesting the URL. |
|
17 | + // |
|
18 | + // see also http://stackoverflow.com/questions/2137080/php-filter-var-filter-validate-url |
|
19 | 19 | |
20 | - if ( $value !== null && '' !== $value ) { |
|
21 | - return $value; |
|
22 | - } |
|
20 | + if ( $value !== null && '' !== $value ) { |
|
21 | + return $value; |
|
22 | + } |
|
23 | 23 | |
24 | - return null; |
|
25 | - } |
|
24 | + return null; |
|
25 | + } |
|
26 | 26 | |
27 | 27 | } |
@@ -9,7 +9,7 @@ discard block |
||
9 | 9 | * |
10 | 10 | * @return null |
11 | 11 | */ |
12 | - public static function sanitize_url( $value ) { |
|
12 | + public static function sanitize_url($value) { |
|
13 | 13 | |
14 | 14 | // Initially this function used also filter_var( $value, FILTER_VALIDATE_URL ) |
15 | 15 | // but URLs with UTF-8 characters are not valid. We store those anyway in the DB as it's up to the browser |
@@ -17,7 +17,7 @@ discard block |
||
17 | 17 | // |
18 | 18 | // see also http://stackoverflow.com/questions/2137080/php-filter-var-filter-validate-url |
19 | 19 | |
20 | - if ( $value !== null && '' !== $value ) { |
|
20 | + if ($value !== null && '' !== $value) { |
|
21 | 21 | return $value; |
22 | 22 | } |
23 | 23 |
@@ -25,194 +25,194 @@ |
||
25 | 25 | */ |
26 | 26 | class Wordlift_Entity_Link_Service { |
27 | 27 | |
28 | - /** |
|
29 | - * The entity type service. |
|
30 | - * |
|
31 | - * @since 3.6.0 |
|
32 | - * @access private |
|
33 | - * @var Wordlift_Entity_Post_Type_Service $entity_type_service The entity type service. |
|
34 | - */ |
|
35 | - private $entity_type_service; |
|
36 | - |
|
37 | - /** |
|
38 | - * The entity post type slug. |
|
39 | - * |
|
40 | - * @since 3.6.0 |
|
41 | - * @access private |
|
42 | - * @var string $slug The entity post type slug. |
|
43 | - */ |
|
44 | - private $slug; |
|
45 | - |
|
46 | - /** |
|
47 | - * A logger instance. |
|
48 | - * |
|
49 | - * @since 3.6.0 |
|
50 | - * @access private |
|
51 | - * @var Wordlift_Log_Service |
|
52 | - */ |
|
53 | - private $log; |
|
54 | - |
|
55 | - /** |
|
56 | - * Wordlift_Entity_Link_Service constructor. |
|
57 | - * |
|
58 | - * @since 3.6.0 |
|
59 | - * |
|
60 | - * @param Wordlift_Entity_Post_Type_Service $entity_type_service |
|
61 | - * @param string $slug The entity post type slug. |
|
62 | - */ |
|
63 | - public function __construct( $entity_type_service, $slug ) { |
|
64 | - |
|
65 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Link_Service' ); |
|
66 | - |
|
67 | - $this->entity_type_service = $entity_type_service; |
|
68 | - $this->slug = $slug; |
|
69 | - |
|
70 | - } |
|
71 | - |
|
72 | - /** |
|
73 | - * Intercept link generation to posts in order to customize links to entities. |
|
74 | - * |
|
75 | - * @since 3.6.0 |
|
76 | - * |
|
77 | - * @param string $post_link The post's permalink. |
|
78 | - * @param WP_Post $post The post in question. |
|
79 | - * |
|
80 | - * @return string The link to the post. |
|
81 | - */ |
|
82 | - public function post_type_link( $post_link, $post ) { |
|
83 | - |
|
84 | - // Return the post link if this is not our post type. |
|
85 | - if ( ! empty( $this->slug ) || $this->entity_type_service->get_post_type() !== get_post_type( $post ) ) { |
|
86 | - return $post_link; |
|
87 | - } |
|
88 | - |
|
89 | - // Replace /slug/post_name/ with /post_name/ |
|
90 | - // The slug comes from the Entity Type Service since that service is responsible for registering the default |
|
91 | - // slug. |
|
92 | - return str_replace( "/{$this->entity_type_service->get_slug()}/$post->post_name/", "/$post->post_name/", $post_link ); |
|
93 | - } |
|
94 | - |
|
95 | - /** |
|
96 | - * Alter the query to look for our own custom type. |
|
97 | - * |
|
98 | - * @since 3.6.0 |
|
99 | - * |
|
100 | - * @param WP_Query $query |
|
101 | - */ |
|
102 | - public function pre_get_posts( $query ) { |
|
103 | - |
|
104 | - // If a slug has been set, we don't need to alter the query. |
|
105 | - if ( ! empty( $this->slug ) ) { |
|
106 | - return; |
|
107 | - } |
|
108 | - |
|
109 | - // Check if it's a query we should extend with our own custom post type. |
|
110 | - // |
|
111 | - // The `$query->query` count could be > 2 if the preview parameter is passed too. |
|
112 | - // |
|
113 | - // See https://github.com/insideout10/wordlift-plugin/issues/439 |
|
114 | - if ( ! $query->is_main_query() || 2 > count( $query->query ) || ! isset( $query->query['page'] ) || empty( $query->query['name'] ) ) { |
|
115 | - return; |
|
116 | - } |
|
117 | - |
|
118 | - // Add our own post type to the query. |
|
119 | - $post_types = '' === $query->get( 'post_type' ) |
|
120 | - ? Wordlift_Entity_Service::valid_entity_post_types() |
|
121 | - : array_merge( (array) $query->get( 'post_type' ), (array) $this->entity_type_service->get_post_type() ); |
|
122 | - $query->set( 'post_type', $post_types ); |
|
123 | - |
|
124 | - } |
|
125 | - |
|
126 | - /** |
|
127 | - * Hook to WordPress' wp_unique_post_slug_is_bad_flat_slug filter. This is called when a page is saved. |
|
128 | - * |
|
129 | - * @since 3.6.0 |
|
130 | - * |
|
131 | - * @param bool $bad_slug Whether the post slug would be bad as a flat slug. |
|
132 | - * @param string $slug The post slug. |
|
133 | - * @param string $post_type Post type. |
|
134 | - * |
|
135 | - * @return bool Whether the slug is bad. |
|
136 | - */ |
|
137 | - public function wp_unique_post_slug_is_bad_flat_slug( $bad_slug, $slug, $post_type ) { |
|
138 | - |
|
139 | - // The list of post types that might have conflicting slugs. |
|
140 | - $post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
|
141 | - |
|
142 | - // Ignore post types different from the ones we need to check. |
|
143 | - if ( ! in_array( $post_type, $post_types, true ) ) { |
|
144 | - return $bad_slug; |
|
145 | - } |
|
146 | - |
|
147 | - // We remove the request post type since WordPress is already checking that the slug doesn't conflict. |
|
148 | - $exists = $this->slug_exists( $slug, array_diff( $post_types, array( $post_type ) ) ); |
|
149 | - |
|
150 | - $this->log->debug( "Checking if a slug exists [ post type :: $post_type ][ slug :: $slug ][ exists :: " . ( $exists ? 'yes' : 'no' ) . ' ]' ); |
|
151 | - |
|
152 | - return apply_filters( 'wl_unique_post_slug_is_bad_flat_slug', $exists, $bad_slug, $slug, $post_type ); |
|
153 | - } |
|
154 | - |
|
155 | - /** |
|
156 | - * Check whether a slug exists already for the specified post types. |
|
157 | - * |
|
158 | - * @since 3.6.0 |
|
159 | - * |
|
160 | - * @param string $slug The slug. |
|
161 | - * @param array $post_types An array of post types. |
|
162 | - * |
|
163 | - * @return bool True if the slug exists, otherwise false. |
|
164 | - */ |
|
165 | - private function slug_exists( $slug, $post_types ) { |
|
166 | - global $wpdb; |
|
167 | - |
|
168 | - // Loop through all post types and check |
|
169 | - // whether they have archive pages and if |
|
170 | - // the archive slug matches the post slug. |
|
171 | - // |
|
172 | - // Note that the condition below checks only post types used by WordLift. |
|
173 | - // We don't check other post types for archive pages, |
|
174 | - // because this is a job of WordPress. |
|
175 | - // |
|
176 | - // There is a open ticket that should solve this, when it's merged: |
|
177 | - // https://core.trac.wordpress.org/ticket/13459 |
|
178 | - $all_post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
|
179 | - foreach ( $all_post_types as $post_type ) { |
|
180 | - |
|
181 | - // Get the post type object for current post type. |
|
182 | - $post_type_object = get_post_type_object( $post_type ); |
|
183 | - |
|
184 | - if ( |
|
185 | - // Check whether the post type object is not empty. |
|
186 | - ! empty( $post_type_object ) && |
|
187 | - // And the post type has archive page. |
|
188 | - $post_type_object->has_archive && |
|
189 | - // And `rewrite` options exists.. |
|
190 | - ! empty( $post_type_object->rewrite ) && |
|
191 | - // And the `rewrite` slug property is not empty. |
|
192 | - ! empty( $post_type_object->rewrite['slug'] ) && |
|
193 | - // And if the rewrite slug equals to the slug. |
|
194 | - $post_type_object->rewrite['slug'] === $slug |
|
195 | - ) { |
|
196 | - // Return true which means that the slug is already in use. |
|
197 | - return true; |
|
198 | - } |
|
199 | - } |
|
200 | - |
|
201 | - return null !== $wpdb->get_var( |
|
202 | - $wpdb->prepare( |
|
203 | - sprintf( |
|
204 | - "SELECT post_name |
|
28 | + /** |
|
29 | + * The entity type service. |
|
30 | + * |
|
31 | + * @since 3.6.0 |
|
32 | + * @access private |
|
33 | + * @var Wordlift_Entity_Post_Type_Service $entity_type_service The entity type service. |
|
34 | + */ |
|
35 | + private $entity_type_service; |
|
36 | + |
|
37 | + /** |
|
38 | + * The entity post type slug. |
|
39 | + * |
|
40 | + * @since 3.6.0 |
|
41 | + * @access private |
|
42 | + * @var string $slug The entity post type slug. |
|
43 | + */ |
|
44 | + private $slug; |
|
45 | + |
|
46 | + /** |
|
47 | + * A logger instance. |
|
48 | + * |
|
49 | + * @since 3.6.0 |
|
50 | + * @access private |
|
51 | + * @var Wordlift_Log_Service |
|
52 | + */ |
|
53 | + private $log; |
|
54 | + |
|
55 | + /** |
|
56 | + * Wordlift_Entity_Link_Service constructor. |
|
57 | + * |
|
58 | + * @since 3.6.0 |
|
59 | + * |
|
60 | + * @param Wordlift_Entity_Post_Type_Service $entity_type_service |
|
61 | + * @param string $slug The entity post type slug. |
|
62 | + */ |
|
63 | + public function __construct( $entity_type_service, $slug ) { |
|
64 | + |
|
65 | + $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Link_Service' ); |
|
66 | + |
|
67 | + $this->entity_type_service = $entity_type_service; |
|
68 | + $this->slug = $slug; |
|
69 | + |
|
70 | + } |
|
71 | + |
|
72 | + /** |
|
73 | + * Intercept link generation to posts in order to customize links to entities. |
|
74 | + * |
|
75 | + * @since 3.6.0 |
|
76 | + * |
|
77 | + * @param string $post_link The post's permalink. |
|
78 | + * @param WP_Post $post The post in question. |
|
79 | + * |
|
80 | + * @return string The link to the post. |
|
81 | + */ |
|
82 | + public function post_type_link( $post_link, $post ) { |
|
83 | + |
|
84 | + // Return the post link if this is not our post type. |
|
85 | + if ( ! empty( $this->slug ) || $this->entity_type_service->get_post_type() !== get_post_type( $post ) ) { |
|
86 | + return $post_link; |
|
87 | + } |
|
88 | + |
|
89 | + // Replace /slug/post_name/ with /post_name/ |
|
90 | + // The slug comes from the Entity Type Service since that service is responsible for registering the default |
|
91 | + // slug. |
|
92 | + return str_replace( "/{$this->entity_type_service->get_slug()}/$post->post_name/", "/$post->post_name/", $post_link ); |
|
93 | + } |
|
94 | + |
|
95 | + /** |
|
96 | + * Alter the query to look for our own custom type. |
|
97 | + * |
|
98 | + * @since 3.6.0 |
|
99 | + * |
|
100 | + * @param WP_Query $query |
|
101 | + */ |
|
102 | + public function pre_get_posts( $query ) { |
|
103 | + |
|
104 | + // If a slug has been set, we don't need to alter the query. |
|
105 | + if ( ! empty( $this->slug ) ) { |
|
106 | + return; |
|
107 | + } |
|
108 | + |
|
109 | + // Check if it's a query we should extend with our own custom post type. |
|
110 | + // |
|
111 | + // The `$query->query` count could be > 2 if the preview parameter is passed too. |
|
112 | + // |
|
113 | + // See https://github.com/insideout10/wordlift-plugin/issues/439 |
|
114 | + if ( ! $query->is_main_query() || 2 > count( $query->query ) || ! isset( $query->query['page'] ) || empty( $query->query['name'] ) ) { |
|
115 | + return; |
|
116 | + } |
|
117 | + |
|
118 | + // Add our own post type to the query. |
|
119 | + $post_types = '' === $query->get( 'post_type' ) |
|
120 | + ? Wordlift_Entity_Service::valid_entity_post_types() |
|
121 | + : array_merge( (array) $query->get( 'post_type' ), (array) $this->entity_type_service->get_post_type() ); |
|
122 | + $query->set( 'post_type', $post_types ); |
|
123 | + |
|
124 | + } |
|
125 | + |
|
126 | + /** |
|
127 | + * Hook to WordPress' wp_unique_post_slug_is_bad_flat_slug filter. This is called when a page is saved. |
|
128 | + * |
|
129 | + * @since 3.6.0 |
|
130 | + * |
|
131 | + * @param bool $bad_slug Whether the post slug would be bad as a flat slug. |
|
132 | + * @param string $slug The post slug. |
|
133 | + * @param string $post_type Post type. |
|
134 | + * |
|
135 | + * @return bool Whether the slug is bad. |
|
136 | + */ |
|
137 | + public function wp_unique_post_slug_is_bad_flat_slug( $bad_slug, $slug, $post_type ) { |
|
138 | + |
|
139 | + // The list of post types that might have conflicting slugs. |
|
140 | + $post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
|
141 | + |
|
142 | + // Ignore post types different from the ones we need to check. |
|
143 | + if ( ! in_array( $post_type, $post_types, true ) ) { |
|
144 | + return $bad_slug; |
|
145 | + } |
|
146 | + |
|
147 | + // We remove the request post type since WordPress is already checking that the slug doesn't conflict. |
|
148 | + $exists = $this->slug_exists( $slug, array_diff( $post_types, array( $post_type ) ) ); |
|
149 | + |
|
150 | + $this->log->debug( "Checking if a slug exists [ post type :: $post_type ][ slug :: $slug ][ exists :: " . ( $exists ? 'yes' : 'no' ) . ' ]' ); |
|
151 | + |
|
152 | + return apply_filters( 'wl_unique_post_slug_is_bad_flat_slug', $exists, $bad_slug, $slug, $post_type ); |
|
153 | + } |
|
154 | + |
|
155 | + /** |
|
156 | + * Check whether a slug exists already for the specified post types. |
|
157 | + * |
|
158 | + * @since 3.6.0 |
|
159 | + * |
|
160 | + * @param string $slug The slug. |
|
161 | + * @param array $post_types An array of post types. |
|
162 | + * |
|
163 | + * @return bool True if the slug exists, otherwise false. |
|
164 | + */ |
|
165 | + private function slug_exists( $slug, $post_types ) { |
|
166 | + global $wpdb; |
|
167 | + |
|
168 | + // Loop through all post types and check |
|
169 | + // whether they have archive pages and if |
|
170 | + // the archive slug matches the post slug. |
|
171 | + // |
|
172 | + // Note that the condition below checks only post types used by WordLift. |
|
173 | + // We don't check other post types for archive pages, |
|
174 | + // because this is a job of WordPress. |
|
175 | + // |
|
176 | + // There is a open ticket that should solve this, when it's merged: |
|
177 | + // https://core.trac.wordpress.org/ticket/13459 |
|
178 | + $all_post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
|
179 | + foreach ( $all_post_types as $post_type ) { |
|
180 | + |
|
181 | + // Get the post type object for current post type. |
|
182 | + $post_type_object = get_post_type_object( $post_type ); |
|
183 | + |
|
184 | + if ( |
|
185 | + // Check whether the post type object is not empty. |
|
186 | + ! empty( $post_type_object ) && |
|
187 | + // And the post type has archive page. |
|
188 | + $post_type_object->has_archive && |
|
189 | + // And `rewrite` options exists.. |
|
190 | + ! empty( $post_type_object->rewrite ) && |
|
191 | + // And the `rewrite` slug property is not empty. |
|
192 | + ! empty( $post_type_object->rewrite['slug'] ) && |
|
193 | + // And if the rewrite slug equals to the slug. |
|
194 | + $post_type_object->rewrite['slug'] === $slug |
|
195 | + ) { |
|
196 | + // Return true which means that the slug is already in use. |
|
197 | + return true; |
|
198 | + } |
|
199 | + } |
|
200 | + |
|
201 | + return null !== $wpdb->get_var( |
|
202 | + $wpdb->prepare( |
|
203 | + sprintf( |
|
204 | + "SELECT post_name |
|
205 | 205 | FROM $wpdb->posts |
206 | 206 | WHERE post_name = %s |
207 | 207 | AND post_type IN (%s) |
208 | 208 | LIMIT 1 |
209 | 209 | ", |
210 | - '%s', |
|
211 | - implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) |
|
212 | - ), |
|
213 | - array_merge( array( $slug ), $post_types ) |
|
214 | - ) |
|
215 | - ); |
|
216 | - } |
|
210 | + '%s', |
|
211 | + implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) |
|
212 | + ), |
|
213 | + array_merge( array( $slug ), $post_types ) |
|
214 | + ) |
|
215 | + ); |
|
216 | + } |
|
217 | 217 | |
218 | 218 | } |
@@ -60,9 +60,9 @@ discard block |
||
60 | 60 | * @param Wordlift_Entity_Post_Type_Service $entity_type_service |
61 | 61 | * @param string $slug The entity post type slug. |
62 | 62 | */ |
63 | - public function __construct( $entity_type_service, $slug ) { |
|
63 | + public function __construct($entity_type_service, $slug) { |
|
64 | 64 | |
65 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Link_Service' ); |
|
65 | + $this->log = Wordlift_Log_Service::get_logger('Wordlift_Entity_Link_Service'); |
|
66 | 66 | |
67 | 67 | $this->entity_type_service = $entity_type_service; |
68 | 68 | $this->slug = $slug; |
@@ -79,17 +79,17 @@ discard block |
||
79 | 79 | * |
80 | 80 | * @return string The link to the post. |
81 | 81 | */ |
82 | - public function post_type_link( $post_link, $post ) { |
|
82 | + public function post_type_link($post_link, $post) { |
|
83 | 83 | |
84 | 84 | // Return the post link if this is not our post type. |
85 | - if ( ! empty( $this->slug ) || $this->entity_type_service->get_post_type() !== get_post_type( $post ) ) { |
|
85 | + if ( ! empty($this->slug) || $this->entity_type_service->get_post_type() !== get_post_type($post)) { |
|
86 | 86 | return $post_link; |
87 | 87 | } |
88 | 88 | |
89 | 89 | // Replace /slug/post_name/ with /post_name/ |
90 | 90 | // The slug comes from the Entity Type Service since that service is responsible for registering the default |
91 | 91 | // slug. |
92 | - return str_replace( "/{$this->entity_type_service->get_slug()}/$post->post_name/", "/$post->post_name/", $post_link ); |
|
92 | + return str_replace("/{$this->entity_type_service->get_slug()}/$post->post_name/", "/$post->post_name/", $post_link); |
|
93 | 93 | } |
94 | 94 | |
95 | 95 | /** |
@@ -99,10 +99,10 @@ discard block |
||
99 | 99 | * |
100 | 100 | * @param WP_Query $query |
101 | 101 | */ |
102 | - public function pre_get_posts( $query ) { |
|
102 | + public function pre_get_posts($query) { |
|
103 | 103 | |
104 | 104 | // If a slug has been set, we don't need to alter the query. |
105 | - if ( ! empty( $this->slug ) ) { |
|
105 | + if ( ! empty($this->slug)) { |
|
106 | 106 | return; |
107 | 107 | } |
108 | 108 | |
@@ -111,15 +111,15 @@ discard block |
||
111 | 111 | // The `$query->query` count could be > 2 if the preview parameter is passed too. |
112 | 112 | // |
113 | 113 | // See https://github.com/insideout10/wordlift-plugin/issues/439 |
114 | - if ( ! $query->is_main_query() || 2 > count( $query->query ) || ! isset( $query->query['page'] ) || empty( $query->query['name'] ) ) { |
|
114 | + if ( ! $query->is_main_query() || 2 > count($query->query) || ! isset($query->query['page']) || empty($query->query['name'])) { |
|
115 | 115 | return; |
116 | 116 | } |
117 | 117 | |
118 | 118 | // Add our own post type to the query. |
119 | - $post_types = '' === $query->get( 'post_type' ) |
|
119 | + $post_types = '' === $query->get('post_type') |
|
120 | 120 | ? Wordlift_Entity_Service::valid_entity_post_types() |
121 | - : array_merge( (array) $query->get( 'post_type' ), (array) $this->entity_type_service->get_post_type() ); |
|
122 | - $query->set( 'post_type', $post_types ); |
|
121 | + : array_merge((array) $query->get('post_type'), (array) $this->entity_type_service->get_post_type()); |
|
122 | + $query->set('post_type', $post_types); |
|
123 | 123 | |
124 | 124 | } |
125 | 125 | |
@@ -134,22 +134,22 @@ discard block |
||
134 | 134 | * |
135 | 135 | * @return bool Whether the slug is bad. |
136 | 136 | */ |
137 | - public function wp_unique_post_slug_is_bad_flat_slug( $bad_slug, $slug, $post_type ) { |
|
137 | + public function wp_unique_post_slug_is_bad_flat_slug($bad_slug, $slug, $post_type) { |
|
138 | 138 | |
139 | 139 | // The list of post types that might have conflicting slugs. |
140 | 140 | $post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
141 | 141 | |
142 | 142 | // Ignore post types different from the ones we need to check. |
143 | - if ( ! in_array( $post_type, $post_types, true ) ) { |
|
143 | + if ( ! in_array($post_type, $post_types, true)) { |
|
144 | 144 | return $bad_slug; |
145 | 145 | } |
146 | 146 | |
147 | 147 | // We remove the request post type since WordPress is already checking that the slug doesn't conflict. |
148 | - $exists = $this->slug_exists( $slug, array_diff( $post_types, array( $post_type ) ) ); |
|
148 | + $exists = $this->slug_exists($slug, array_diff($post_types, array($post_type))); |
|
149 | 149 | |
150 | - $this->log->debug( "Checking if a slug exists [ post type :: $post_type ][ slug :: $slug ][ exists :: " . ( $exists ? 'yes' : 'no' ) . ' ]' ); |
|
150 | + $this->log->debug("Checking if a slug exists [ post type :: $post_type ][ slug :: $slug ][ exists :: ".($exists ? 'yes' : 'no').' ]'); |
|
151 | 151 | |
152 | - return apply_filters( 'wl_unique_post_slug_is_bad_flat_slug', $exists, $bad_slug, $slug, $post_type ); |
|
152 | + return apply_filters('wl_unique_post_slug_is_bad_flat_slug', $exists, $bad_slug, $slug, $post_type); |
|
153 | 153 | } |
154 | 154 | |
155 | 155 | /** |
@@ -162,7 +162,7 @@ discard block |
||
162 | 162 | * |
163 | 163 | * @return bool True if the slug exists, otherwise false. |
164 | 164 | */ |
165 | - private function slug_exists( $slug, $post_types ) { |
|
165 | + private function slug_exists($slug, $post_types) { |
|
166 | 166 | global $wpdb; |
167 | 167 | |
168 | 168 | // Loop through all post types and check |
@@ -176,20 +176,20 @@ discard block |
||
176 | 176 | // There is a open ticket that should solve this, when it's merged: |
177 | 177 | // https://core.trac.wordpress.org/ticket/13459 |
178 | 178 | $all_post_types = Wordlift_Entity_Service::valid_entity_post_types(); |
179 | - foreach ( $all_post_types as $post_type ) { |
|
179 | + foreach ($all_post_types as $post_type) { |
|
180 | 180 | |
181 | 181 | // Get the post type object for current post type. |
182 | - $post_type_object = get_post_type_object( $post_type ); |
|
182 | + $post_type_object = get_post_type_object($post_type); |
|
183 | 183 | |
184 | 184 | if ( |
185 | 185 | // Check whether the post type object is not empty. |
186 | - ! empty( $post_type_object ) && |
|
186 | + ! empty($post_type_object) && |
|
187 | 187 | // And the post type has archive page. |
188 | 188 | $post_type_object->has_archive && |
189 | 189 | // And `rewrite` options exists.. |
190 | - ! empty( $post_type_object->rewrite ) && |
|
190 | + ! empty($post_type_object->rewrite) && |
|
191 | 191 | // And the `rewrite` slug property is not empty. |
192 | - ! empty( $post_type_object->rewrite['slug'] ) && |
|
192 | + ! empty($post_type_object->rewrite['slug']) && |
|
193 | 193 | // And if the rewrite slug equals to the slug. |
194 | 194 | $post_type_object->rewrite['slug'] === $slug |
195 | 195 | ) { |
@@ -208,9 +208,9 @@ discard block |
||
208 | 208 | LIMIT 1 |
209 | 209 | ", |
210 | 210 | '%s', |
211 | - implode( ',', array_fill( 0, count( $post_types ), '%s' ) ) |
|
211 | + implode(',', array_fill(0, count($post_types), '%s')) |
|
212 | 212 | ), |
213 | - array_merge( array( $slug ), $post_types ) |
|
213 | + array_merge(array($slug), $post_types) |
|
214 | 214 | ) |
215 | 215 | ); |
216 | 216 | } |
@@ -14,143 +14,143 @@ |
||
14 | 14 | */ |
15 | 15 | class Wordlift_Batch_Operation_Ajax_Adapter { |
16 | 16 | |
17 | - /** |
|
18 | - * The access levels. |
|
19 | - * |
|
20 | - * @since 3.20.0 |
|
21 | - */ |
|
22 | - const ACCESS_ANONYMOUS = 1; |
|
23 | - const ACCESS_ADMIN = 2; |
|
24 | - const ACCESS_ALL = 3; |
|
25 | - |
|
26 | - /** |
|
27 | - * A {@link Wordlift_Batch_Operation_Interface} instance. |
|
28 | - * |
|
29 | - * @since 3.20.0 |
|
30 | - * @access private |
|
31 | - * @var \Wordlift_Batch_Operation_Interface $operation A {@link Wordlift_Batch_Operation_Interface} instance. |
|
32 | - */ |
|
33 | - private $operation; |
|
34 | - |
|
35 | - /** |
|
36 | - * The ajax action name. |
|
37 | - * |
|
38 | - * @since 3.20.0 |
|
39 | - * @access private |
|
40 | - * @var string $action The ajax action name. |
|
41 | - */ |
|
42 | - private $action; |
|
43 | - |
|
44 | - /** |
|
45 | - * Wordlift_Batch_Operation_Ajax_Adapter constructor. |
|
46 | - * |
|
47 | - * @param \Wordlift_Batch_Operation_Interface $operation The batch operation. |
|
48 | - * @param string $action The action name. |
|
49 | - * @param int $access The access level. |
|
50 | - */ |
|
51 | - public function __construct( $operation, $action, $access = self::ACCESS_ADMIN ) { |
|
52 | - |
|
53 | - $this->operation = $operation; |
|
54 | - |
|
55 | - if ( $access & self::ACCESS_ADMIN ) { |
|
56 | - add_action( "wp_ajax_$action", array( $this, 'process' ) ); |
|
57 | - add_action( "wp_ajax_{$action}_count", array( $this, 'count' ) ); |
|
58 | - |
|
59 | - // Add the nonce for the `schemaorg_sync` action. |
|
60 | - add_filter( 'wl_admin_settings', array( $this, 'add_nonce' ) ); |
|
61 | - } |
|
62 | - |
|
63 | - if ( $access & self::ACCESS_ANONYMOUS ) { |
|
64 | - add_action( "wp_ajax_nopriv_$action", array( $this, 'process' ) ); |
|
65 | - add_action( "wp_ajax_nopriv_{$action}_count", array( $this, 'count' ) ); |
|
66 | - } |
|
67 | - |
|
68 | - $this->action = $action; |
|
69 | - } |
|
70 | - |
|
71 | - /** |
|
72 | - * Hook to `wl_admin_settings`, adds the nonce. |
|
73 | - * |
|
74 | - * @param array $params An array of settings. |
|
75 | - * |
|
76 | - * @return array The updated array of settings. |
|
77 | - * @since 3.20.0 |
|
78 | - */ |
|
79 | - public function add_nonce( $params ) { |
|
80 | - |
|
81 | - return array_merge( |
|
82 | - $params, |
|
83 | - array( |
|
84 | - "{$this->action}_nonce" => $this->create_nonce(), |
|
85 | - ) |
|
86 | - ); |
|
87 | - } |
|
88 | - |
|
89 | - /** |
|
90 | - * Process the requested operation. |
|
91 | - * |
|
92 | - * @since 3.20.0 |
|
93 | - */ |
|
94 | - public function process() { |
|
95 | - $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
96 | - // Validate the nonce. |
|
97 | - if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
98 | - wp_send_json_error( 'Invalid nonce.' ); |
|
99 | - } |
|
100 | - |
|
101 | - $offset = isset( $_POST['offset'] ) ? (int) $_POST['offset'] : 0; |
|
102 | - $limit = isset( $_POST['limit'] ) ? (int) $_POST['limit'] : 10; |
|
103 | - |
|
104 | - // Run the batch operation. |
|
105 | - $result = $this->operation->process( $offset, $limit ); |
|
106 | - |
|
107 | - // Send the results along with a potentially updated nonce. |
|
108 | - wp_send_json_success( |
|
109 | - array_merge( |
|
110 | - $result, |
|
111 | - array( |
|
112 | - '_nonce' => $this->create_nonce(), |
|
113 | - ) |
|
114 | - ) |
|
115 | - ); |
|
116 | - |
|
117 | - } |
|
118 | - |
|
119 | - /** |
|
120 | - * Count the number of elements that would be affected by the operation. |
|
121 | - * |
|
122 | - * @since 3.20.0 |
|
123 | - */ |
|
124 | - public function count() { |
|
125 | - |
|
126 | - // Validate the nonce. |
|
127 | - $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
128 | - if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
129 | - wp_send_json_error( 'Invalid nonce.' ); |
|
130 | - } |
|
131 | - |
|
132 | - // Run the batch operation. |
|
133 | - $result = $this->operation->count(); |
|
134 | - |
|
135 | - // Send the results along with a potentially updated nonce. |
|
136 | - wp_send_json_success( |
|
137 | - array( |
|
138 | - 'count' => $result, |
|
139 | - '_nonce' => $this->create_nonce(), |
|
140 | - ) |
|
141 | - ); |
|
142 | - |
|
143 | - } |
|
144 | - |
|
145 | - /** |
|
146 | - * Create a nonce for the ajax operation. |
|
147 | - * |
|
148 | - * @return string The nonce. |
|
149 | - * @since 3.20.0 |
|
150 | - */ |
|
151 | - public function create_nonce() { |
|
152 | - |
|
153 | - return wp_create_nonce( $this->action ); |
|
154 | - } |
|
17 | + /** |
|
18 | + * The access levels. |
|
19 | + * |
|
20 | + * @since 3.20.0 |
|
21 | + */ |
|
22 | + const ACCESS_ANONYMOUS = 1; |
|
23 | + const ACCESS_ADMIN = 2; |
|
24 | + const ACCESS_ALL = 3; |
|
25 | + |
|
26 | + /** |
|
27 | + * A {@link Wordlift_Batch_Operation_Interface} instance. |
|
28 | + * |
|
29 | + * @since 3.20.0 |
|
30 | + * @access private |
|
31 | + * @var \Wordlift_Batch_Operation_Interface $operation A {@link Wordlift_Batch_Operation_Interface} instance. |
|
32 | + */ |
|
33 | + private $operation; |
|
34 | + |
|
35 | + /** |
|
36 | + * The ajax action name. |
|
37 | + * |
|
38 | + * @since 3.20.0 |
|
39 | + * @access private |
|
40 | + * @var string $action The ajax action name. |
|
41 | + */ |
|
42 | + private $action; |
|
43 | + |
|
44 | + /** |
|
45 | + * Wordlift_Batch_Operation_Ajax_Adapter constructor. |
|
46 | + * |
|
47 | + * @param \Wordlift_Batch_Operation_Interface $operation The batch operation. |
|
48 | + * @param string $action The action name. |
|
49 | + * @param int $access The access level. |
|
50 | + */ |
|
51 | + public function __construct( $operation, $action, $access = self::ACCESS_ADMIN ) { |
|
52 | + |
|
53 | + $this->operation = $operation; |
|
54 | + |
|
55 | + if ( $access & self::ACCESS_ADMIN ) { |
|
56 | + add_action( "wp_ajax_$action", array( $this, 'process' ) ); |
|
57 | + add_action( "wp_ajax_{$action}_count", array( $this, 'count' ) ); |
|
58 | + |
|
59 | + // Add the nonce for the `schemaorg_sync` action. |
|
60 | + add_filter( 'wl_admin_settings', array( $this, 'add_nonce' ) ); |
|
61 | + } |
|
62 | + |
|
63 | + if ( $access & self::ACCESS_ANONYMOUS ) { |
|
64 | + add_action( "wp_ajax_nopriv_$action", array( $this, 'process' ) ); |
|
65 | + add_action( "wp_ajax_nopriv_{$action}_count", array( $this, 'count' ) ); |
|
66 | + } |
|
67 | + |
|
68 | + $this->action = $action; |
|
69 | + } |
|
70 | + |
|
71 | + /** |
|
72 | + * Hook to `wl_admin_settings`, adds the nonce. |
|
73 | + * |
|
74 | + * @param array $params An array of settings. |
|
75 | + * |
|
76 | + * @return array The updated array of settings. |
|
77 | + * @since 3.20.0 |
|
78 | + */ |
|
79 | + public function add_nonce( $params ) { |
|
80 | + |
|
81 | + return array_merge( |
|
82 | + $params, |
|
83 | + array( |
|
84 | + "{$this->action}_nonce" => $this->create_nonce(), |
|
85 | + ) |
|
86 | + ); |
|
87 | + } |
|
88 | + |
|
89 | + /** |
|
90 | + * Process the requested operation. |
|
91 | + * |
|
92 | + * @since 3.20.0 |
|
93 | + */ |
|
94 | + public function process() { |
|
95 | + $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
96 | + // Validate the nonce. |
|
97 | + if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
98 | + wp_send_json_error( 'Invalid nonce.' ); |
|
99 | + } |
|
100 | + |
|
101 | + $offset = isset( $_POST['offset'] ) ? (int) $_POST['offset'] : 0; |
|
102 | + $limit = isset( $_POST['limit'] ) ? (int) $_POST['limit'] : 10; |
|
103 | + |
|
104 | + // Run the batch operation. |
|
105 | + $result = $this->operation->process( $offset, $limit ); |
|
106 | + |
|
107 | + // Send the results along with a potentially updated nonce. |
|
108 | + wp_send_json_success( |
|
109 | + array_merge( |
|
110 | + $result, |
|
111 | + array( |
|
112 | + '_nonce' => $this->create_nonce(), |
|
113 | + ) |
|
114 | + ) |
|
115 | + ); |
|
116 | + |
|
117 | + } |
|
118 | + |
|
119 | + /** |
|
120 | + * Count the number of elements that would be affected by the operation. |
|
121 | + * |
|
122 | + * @since 3.20.0 |
|
123 | + */ |
|
124 | + public function count() { |
|
125 | + |
|
126 | + // Validate the nonce. |
|
127 | + $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
128 | + if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
129 | + wp_send_json_error( 'Invalid nonce.' ); |
|
130 | + } |
|
131 | + |
|
132 | + // Run the batch operation. |
|
133 | + $result = $this->operation->count(); |
|
134 | + |
|
135 | + // Send the results along with a potentially updated nonce. |
|
136 | + wp_send_json_success( |
|
137 | + array( |
|
138 | + 'count' => $result, |
|
139 | + '_nonce' => $this->create_nonce(), |
|
140 | + ) |
|
141 | + ); |
|
142 | + |
|
143 | + } |
|
144 | + |
|
145 | + /** |
|
146 | + * Create a nonce for the ajax operation. |
|
147 | + * |
|
148 | + * @return string The nonce. |
|
149 | + * @since 3.20.0 |
|
150 | + */ |
|
151 | + public function create_nonce() { |
|
152 | + |
|
153 | + return wp_create_nonce( $this->action ); |
|
154 | + } |
|
155 | 155 | |
156 | 156 | } |
@@ -48,21 +48,21 @@ discard block |
||
48 | 48 | * @param string $action The action name. |
49 | 49 | * @param int $access The access level. |
50 | 50 | */ |
51 | - public function __construct( $operation, $action, $access = self::ACCESS_ADMIN ) { |
|
51 | + public function __construct($operation, $action, $access = self::ACCESS_ADMIN) { |
|
52 | 52 | |
53 | 53 | $this->operation = $operation; |
54 | 54 | |
55 | - if ( $access & self::ACCESS_ADMIN ) { |
|
56 | - add_action( "wp_ajax_$action", array( $this, 'process' ) ); |
|
57 | - add_action( "wp_ajax_{$action}_count", array( $this, 'count' ) ); |
|
55 | + if ($access & self::ACCESS_ADMIN) { |
|
56 | + add_action("wp_ajax_$action", array($this, 'process')); |
|
57 | + add_action("wp_ajax_{$action}_count", array($this, 'count')); |
|
58 | 58 | |
59 | 59 | // Add the nonce for the `schemaorg_sync` action. |
60 | - add_filter( 'wl_admin_settings', array( $this, 'add_nonce' ) ); |
|
60 | + add_filter('wl_admin_settings', array($this, 'add_nonce')); |
|
61 | 61 | } |
62 | 62 | |
63 | - if ( $access & self::ACCESS_ANONYMOUS ) { |
|
64 | - add_action( "wp_ajax_nopriv_$action", array( $this, 'process' ) ); |
|
65 | - add_action( "wp_ajax_nopriv_{$action}_count", array( $this, 'count' ) ); |
|
63 | + if ($access & self::ACCESS_ANONYMOUS) { |
|
64 | + add_action("wp_ajax_nopriv_$action", array($this, 'process')); |
|
65 | + add_action("wp_ajax_nopriv_{$action}_count", array($this, 'count')); |
|
66 | 66 | } |
67 | 67 | |
68 | 68 | $this->action = $action; |
@@ -76,7 +76,7 @@ discard block |
||
76 | 76 | * @return array The updated array of settings. |
77 | 77 | * @since 3.20.0 |
78 | 78 | */ |
79 | - public function add_nonce( $params ) { |
|
79 | + public function add_nonce($params) { |
|
80 | 80 | |
81 | 81 | return array_merge( |
82 | 82 | $params, |
@@ -92,17 +92,17 @@ discard block |
||
92 | 92 | * @since 3.20.0 |
93 | 93 | */ |
94 | 94 | public function process() { |
95 | - $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
95 | + $nonce = isset($_POST['_nonce']) ? sanitize_text_field(wp_unslash((string) $_POST['_nonce'])) : ''; |
|
96 | 96 | // Validate the nonce. |
97 | - if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
98 | - wp_send_json_error( 'Invalid nonce.' ); |
|
97 | + if ( ! wp_verify_nonce($nonce, $this->action)) { |
|
98 | + wp_send_json_error('Invalid nonce.'); |
|
99 | 99 | } |
100 | 100 | |
101 | - $offset = isset( $_POST['offset'] ) ? (int) $_POST['offset'] : 0; |
|
102 | - $limit = isset( $_POST['limit'] ) ? (int) $_POST['limit'] : 10; |
|
101 | + $offset = isset($_POST['offset']) ? (int) $_POST['offset'] : 0; |
|
102 | + $limit = isset($_POST['limit']) ? (int) $_POST['limit'] : 10; |
|
103 | 103 | |
104 | 104 | // Run the batch operation. |
105 | - $result = $this->operation->process( $offset, $limit ); |
|
105 | + $result = $this->operation->process($offset, $limit); |
|
106 | 106 | |
107 | 107 | // Send the results along with a potentially updated nonce. |
108 | 108 | wp_send_json_success( |
@@ -124,9 +124,9 @@ discard block |
||
124 | 124 | public function count() { |
125 | 125 | |
126 | 126 | // Validate the nonce. |
127 | - $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['_nonce'] ) ) : ''; |
|
128 | - if ( ! wp_verify_nonce( $nonce, $this->action ) ) { |
|
129 | - wp_send_json_error( 'Invalid nonce.' ); |
|
127 | + $nonce = isset($_POST['_nonce']) ? sanitize_text_field(wp_unslash((string) $_POST['_nonce'])) : ''; |
|
128 | + if ( ! wp_verify_nonce($nonce, $this->action)) { |
|
129 | + wp_send_json_error('Invalid nonce.'); |
|
130 | 130 | } |
131 | 131 | |
132 | 132 | // Run the batch operation. |
@@ -150,7 +150,7 @@ discard block |
||
150 | 150 | */ |
151 | 151 | public function create_nonce() { |
152 | 152 | |
153 | - return wp_create_nonce( $this->action ); |
|
153 | + return wp_create_nonce($this->action); |
|
154 | 154 | } |
155 | 155 | |
156 | 156 | } |
@@ -8,149 +8,149 @@ |
||
8 | 8 | */ |
9 | 9 | class Wordlift_Remote_Image_Service { |
10 | 10 | |
11 | - /** |
|
12 | - * Save the image with the specified URL locally. |
|
13 | - * |
|
14 | - * @param string $url The image remote URL. |
|
15 | - * |
|
16 | - * @return array|false|WP_Error An array with information about the saved image (*path*: the local path to the image, *url*: the local |
|
17 | - * url, *content_type*: the image content type) or false on error. |
|
18 | - * @since 3.18.0 |
|
19 | - * @since 3.23.4 the function may return a WP_Error. |
|
20 | - */ |
|
21 | - public static function save_from_url( $url ) { |
|
22 | - |
|
23 | - // Required for REST API calls |
|
24 | - if ( ! function_exists( 'WP_Filesystem' ) ) { |
|
25 | - require_once ABSPATH . 'wp-admin/includes/file.php'; |
|
26 | - } |
|
27 | - |
|
28 | - // Load `WP_Filesystem`. |
|
29 | - add_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
30 | - WP_Filesystem(); |
|
31 | - global $wp_filesystem; |
|
32 | - |
|
33 | - // Parse the url. |
|
34 | - $parts = wp_parse_url( $url ); |
|
35 | - |
|
36 | - // Get the bare filename (filename w/o the extension). |
|
37 | - $basename = str_replace( |
|
38 | - DIRECTORY_SEPARATOR, |
|
39 | - '_', |
|
40 | - rawurldecode( |
|
41 | - pathinfo( $parts['path'], PATHINFO_FILENAME ) |
|
42 | - ) |
|
43 | - ); |
|
44 | - |
|
45 | - // Get the base dir. |
|
46 | - $wp_upload_dir = wp_upload_dir(); |
|
47 | - |
|
48 | - // Set the upload directory and URL. |
|
49 | - $upload_dir = $wp_upload_dir['basedir'] . '/wl' . $wp_upload_dir['subdir']; |
|
50 | - $upload_url = $wp_upload_dir['baseurl'] . '/wl' . $wp_upload_dir['subdir']; |
|
51 | - |
|
52 | - // Get the full path to the local filename. |
|
53 | - $image_full_path = $upload_dir . '/' . $basename; |
|
54 | - $image_full_url = $upload_url . '/' . $basename; |
|
55 | - |
|
56 | - // Create custom directory and bail on failure. |
|
57 | - if ( ! wp_mkdir_p( $upload_dir ) ) { |
|
58 | - Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
59 | - ->warn( "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
60 | - |
|
61 | - return new WP_Error( 'image_error', "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
62 | - }; |
|
63 | - |
|
64 | - $response = wp_remote_get( |
|
65 | - $url, |
|
66 | - array( |
|
67 | - 'user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36', |
|
68 | - ) |
|
69 | - ); |
|
70 | - |
|
71 | - // Bail if the response is not set. |
|
72 | - if ( self::is_response_error( $response ) ) { |
|
73 | - Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
74 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
75 | - ->warn( "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
76 | - |
|
77 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
78 | - return new WP_Error( 'image_error', "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
79 | - } |
|
80 | - |
|
81 | - // Get the content type of response. |
|
82 | - $content_type = wp_remote_retrieve_header( $response, 'content-type' ); |
|
83 | - |
|
84 | - // Get the file extension. |
|
85 | - $extension = self::get_extension_from_content_type( $content_type ); |
|
86 | - |
|
87 | - // Bail if the content type is not supported. |
|
88 | - if ( empty( $extension ) ) { |
|
89 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
90 | - return new WP_Error( 'image_error', "Unsupported content type [ $content_type ]:\n" . var_export( $response, true ) ); |
|
91 | - } |
|
92 | - |
|
93 | - // Complete the local filename. |
|
94 | - $image_full_path .= $extension; |
|
95 | - $image_full_url .= $extension; |
|
96 | - |
|
97 | - // Store the data locally. |
|
98 | - $wp_filesystem->put_contents( $image_full_path, wp_remote_retrieve_body( $response ) ); |
|
99 | - remove_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
100 | - |
|
101 | - // Return the path. |
|
102 | - return array( |
|
103 | - 'path' => $image_full_path, |
|
104 | - 'url' => $image_full_url, |
|
105 | - 'content_type' => $content_type, |
|
106 | - ); |
|
107 | - } |
|
108 | - |
|
109 | - // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore |
|
110 | - public static function _return_direct() { |
|
111 | - return 'direct'; |
|
112 | - } |
|
113 | - |
|
114 | - /** |
|
115 | - * Returns the file extension using the content type. |
|
116 | - * |
|
117 | - * @param string $content_type File content type. |
|
118 | - * |
|
119 | - * @return string|bool The file extension on success and |
|
120 | - * false on fail or if the content type is not supported. |
|
121 | - * @since 3.18.0 |
|
122 | - */ |
|
123 | - private static function get_extension_from_content_type( $content_type ) { |
|
124 | - |
|
125 | - // Return the extension if match. |
|
126 | - switch ( $content_type ) { |
|
127 | - case 'image/jpeg': |
|
128 | - case 'image/jpg': |
|
129 | - return '.jpg'; |
|
130 | - case 'image/gif': |
|
131 | - return '.gif'; |
|
132 | - case 'image/png': |
|
133 | - return '.png'; |
|
134 | - } |
|
135 | - |
|
136 | - // Otherwise return false. |
|
137 | - return false; |
|
138 | - } |
|
139 | - |
|
140 | - /** |
|
141 | - * Checks whether a response is an error. |
|
142 | - * |
|
143 | - * @param array|WP_Error $response The response. |
|
144 | - * |
|
145 | - * @return bool True if the response is an error, otherwise false. |
|
146 | - * @since 3.23.4 |
|
147 | - */ |
|
148 | - private static function is_response_error( $response ) { |
|
149 | - |
|
150 | - return ( is_wp_error( $response ) |
|
151 | - || 200 !== (int) $response['response']['code'] |
|
152 | - || ! isset( $response['body'] ) |
|
153 | - ); |
|
154 | - } |
|
11 | + /** |
|
12 | + * Save the image with the specified URL locally. |
|
13 | + * |
|
14 | + * @param string $url The image remote URL. |
|
15 | + * |
|
16 | + * @return array|false|WP_Error An array with information about the saved image (*path*: the local path to the image, *url*: the local |
|
17 | + * url, *content_type*: the image content type) or false on error. |
|
18 | + * @since 3.18.0 |
|
19 | + * @since 3.23.4 the function may return a WP_Error. |
|
20 | + */ |
|
21 | + public static function save_from_url( $url ) { |
|
22 | + |
|
23 | + // Required for REST API calls |
|
24 | + if ( ! function_exists( 'WP_Filesystem' ) ) { |
|
25 | + require_once ABSPATH . 'wp-admin/includes/file.php'; |
|
26 | + } |
|
27 | + |
|
28 | + // Load `WP_Filesystem`. |
|
29 | + add_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
30 | + WP_Filesystem(); |
|
31 | + global $wp_filesystem; |
|
32 | + |
|
33 | + // Parse the url. |
|
34 | + $parts = wp_parse_url( $url ); |
|
35 | + |
|
36 | + // Get the bare filename (filename w/o the extension). |
|
37 | + $basename = str_replace( |
|
38 | + DIRECTORY_SEPARATOR, |
|
39 | + '_', |
|
40 | + rawurldecode( |
|
41 | + pathinfo( $parts['path'], PATHINFO_FILENAME ) |
|
42 | + ) |
|
43 | + ); |
|
44 | + |
|
45 | + // Get the base dir. |
|
46 | + $wp_upload_dir = wp_upload_dir(); |
|
47 | + |
|
48 | + // Set the upload directory and URL. |
|
49 | + $upload_dir = $wp_upload_dir['basedir'] . '/wl' . $wp_upload_dir['subdir']; |
|
50 | + $upload_url = $wp_upload_dir['baseurl'] . '/wl' . $wp_upload_dir['subdir']; |
|
51 | + |
|
52 | + // Get the full path to the local filename. |
|
53 | + $image_full_path = $upload_dir . '/' . $basename; |
|
54 | + $image_full_url = $upload_url . '/' . $basename; |
|
55 | + |
|
56 | + // Create custom directory and bail on failure. |
|
57 | + if ( ! wp_mkdir_p( $upload_dir ) ) { |
|
58 | + Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
59 | + ->warn( "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
60 | + |
|
61 | + return new WP_Error( 'image_error', "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
62 | + }; |
|
63 | + |
|
64 | + $response = wp_remote_get( |
|
65 | + $url, |
|
66 | + array( |
|
67 | + 'user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36', |
|
68 | + ) |
|
69 | + ); |
|
70 | + |
|
71 | + // Bail if the response is not set. |
|
72 | + if ( self::is_response_error( $response ) ) { |
|
73 | + Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
74 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
75 | + ->warn( "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
76 | + |
|
77 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
78 | + return new WP_Error( 'image_error', "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
79 | + } |
|
80 | + |
|
81 | + // Get the content type of response. |
|
82 | + $content_type = wp_remote_retrieve_header( $response, 'content-type' ); |
|
83 | + |
|
84 | + // Get the file extension. |
|
85 | + $extension = self::get_extension_from_content_type( $content_type ); |
|
86 | + |
|
87 | + // Bail if the content type is not supported. |
|
88 | + if ( empty( $extension ) ) { |
|
89 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
|
90 | + return new WP_Error( 'image_error', "Unsupported content type [ $content_type ]:\n" . var_export( $response, true ) ); |
|
91 | + } |
|
92 | + |
|
93 | + // Complete the local filename. |
|
94 | + $image_full_path .= $extension; |
|
95 | + $image_full_url .= $extension; |
|
96 | + |
|
97 | + // Store the data locally. |
|
98 | + $wp_filesystem->put_contents( $image_full_path, wp_remote_retrieve_body( $response ) ); |
|
99 | + remove_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
100 | + |
|
101 | + // Return the path. |
|
102 | + return array( |
|
103 | + 'path' => $image_full_path, |
|
104 | + 'url' => $image_full_url, |
|
105 | + 'content_type' => $content_type, |
|
106 | + ); |
|
107 | + } |
|
108 | + |
|
109 | + // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore |
|
110 | + public static function _return_direct() { |
|
111 | + return 'direct'; |
|
112 | + } |
|
113 | + |
|
114 | + /** |
|
115 | + * Returns the file extension using the content type. |
|
116 | + * |
|
117 | + * @param string $content_type File content type. |
|
118 | + * |
|
119 | + * @return string|bool The file extension on success and |
|
120 | + * false on fail or if the content type is not supported. |
|
121 | + * @since 3.18.0 |
|
122 | + */ |
|
123 | + private static function get_extension_from_content_type( $content_type ) { |
|
124 | + |
|
125 | + // Return the extension if match. |
|
126 | + switch ( $content_type ) { |
|
127 | + case 'image/jpeg': |
|
128 | + case 'image/jpg': |
|
129 | + return '.jpg'; |
|
130 | + case 'image/gif': |
|
131 | + return '.gif'; |
|
132 | + case 'image/png': |
|
133 | + return '.png'; |
|
134 | + } |
|
135 | + |
|
136 | + // Otherwise return false. |
|
137 | + return false; |
|
138 | + } |
|
139 | + |
|
140 | + /** |
|
141 | + * Checks whether a response is an error. |
|
142 | + * |
|
143 | + * @param array|WP_Error $response The response. |
|
144 | + * |
|
145 | + * @return bool True if the response is an error, otherwise false. |
|
146 | + * @since 3.23.4 |
|
147 | + */ |
|
148 | + private static function is_response_error( $response ) { |
|
149 | + |
|
150 | + return ( is_wp_error( $response ) |
|
151 | + || 200 !== (int) $response['response']['code'] |
|
152 | + || ! isset( $response['body'] ) |
|
153 | + ); |
|
154 | + } |
|
155 | 155 | |
156 | 156 | } |
@@ -18,27 +18,27 @@ discard block |
||
18 | 18 | * @since 3.18.0 |
19 | 19 | * @since 3.23.4 the function may return a WP_Error. |
20 | 20 | */ |
21 | - public static function save_from_url( $url ) { |
|
21 | + public static function save_from_url($url) { |
|
22 | 22 | |
23 | 23 | // Required for REST API calls |
24 | - if ( ! function_exists( 'WP_Filesystem' ) ) { |
|
25 | - require_once ABSPATH . 'wp-admin/includes/file.php'; |
|
24 | + if ( ! function_exists('WP_Filesystem')) { |
|
25 | + require_once ABSPATH.'wp-admin/includes/file.php'; |
|
26 | 26 | } |
27 | 27 | |
28 | 28 | // Load `WP_Filesystem`. |
29 | - add_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
29 | + add_filter('filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct'); |
|
30 | 30 | WP_Filesystem(); |
31 | 31 | global $wp_filesystem; |
32 | 32 | |
33 | 33 | // Parse the url. |
34 | - $parts = wp_parse_url( $url ); |
|
34 | + $parts = wp_parse_url($url); |
|
35 | 35 | |
36 | 36 | // Get the bare filename (filename w/o the extension). |
37 | 37 | $basename = str_replace( |
38 | 38 | DIRECTORY_SEPARATOR, |
39 | 39 | '_', |
40 | 40 | rawurldecode( |
41 | - pathinfo( $parts['path'], PATHINFO_FILENAME ) |
|
41 | + pathinfo($parts['path'], PATHINFO_FILENAME) |
|
42 | 42 | ) |
43 | 43 | ); |
44 | 44 | |
@@ -46,19 +46,19 @@ discard block |
||
46 | 46 | $wp_upload_dir = wp_upload_dir(); |
47 | 47 | |
48 | 48 | // Set the upload directory and URL. |
49 | - $upload_dir = $wp_upload_dir['basedir'] . '/wl' . $wp_upload_dir['subdir']; |
|
50 | - $upload_url = $wp_upload_dir['baseurl'] . '/wl' . $wp_upload_dir['subdir']; |
|
49 | + $upload_dir = $wp_upload_dir['basedir'].'/wl'.$wp_upload_dir['subdir']; |
|
50 | + $upload_url = $wp_upload_dir['baseurl'].'/wl'.$wp_upload_dir['subdir']; |
|
51 | 51 | |
52 | 52 | // Get the full path to the local filename. |
53 | - $image_full_path = $upload_dir . '/' . $basename; |
|
54 | - $image_full_url = $upload_url . '/' . $basename; |
|
53 | + $image_full_path = $upload_dir.'/'.$basename; |
|
54 | + $image_full_url = $upload_url.'/'.$basename; |
|
55 | 55 | |
56 | 56 | // Create custom directory and bail on failure. |
57 | - if ( ! wp_mkdir_p( $upload_dir ) ) { |
|
58 | - Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
59 | - ->warn( "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
57 | + if ( ! wp_mkdir_p($upload_dir)) { |
|
58 | + Wordlift_Log_Service::get_logger('Wordlift_Remote_Image_Service') |
|
59 | + ->warn("save_image_from_url : failed creating upload dir $upload_dir \n"); |
|
60 | 60 | |
61 | - return new WP_Error( 'image_error', "save_image_from_url : failed creating upload dir $upload_dir \n" ); |
|
61 | + return new WP_Error('image_error', "save_image_from_url : failed creating upload dir $upload_dir \n"); |
|
62 | 62 | }; |
63 | 63 | |
64 | 64 | $response = wp_remote_get( |
@@ -69,25 +69,25 @@ discard block |
||
69 | 69 | ); |
70 | 70 | |
71 | 71 | // Bail if the response is not set. |
72 | - if ( self::is_response_error( $response ) ) { |
|
73 | - Wordlift_Log_Service::get_logger( 'Wordlift_Remote_Image_Service' ) |
|
72 | + if (self::is_response_error($response)) { |
|
73 | + Wordlift_Log_Service::get_logger('Wordlift_Remote_Image_Service') |
|
74 | 74 | // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
75 | - ->warn( "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
75 | + ->warn("save_image_from_url : failed to fetch the response from: $url\nThe response was:\n".var_export($response, true)); |
|
76 | 76 | |
77 | 77 | // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
78 | - return new WP_Error( 'image_error', "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n" . var_export( $response, true ) ); |
|
78 | + return new WP_Error('image_error', "save_image_from_url : failed to fetch the response from: $url\nThe response was:\n".var_export($response, true)); |
|
79 | 79 | } |
80 | 80 | |
81 | 81 | // Get the content type of response. |
82 | - $content_type = wp_remote_retrieve_header( $response, 'content-type' ); |
|
82 | + $content_type = wp_remote_retrieve_header($response, 'content-type'); |
|
83 | 83 | |
84 | 84 | // Get the file extension. |
85 | - $extension = self::get_extension_from_content_type( $content_type ); |
|
85 | + $extension = self::get_extension_from_content_type($content_type); |
|
86 | 86 | |
87 | 87 | // Bail if the content type is not supported. |
88 | - if ( empty( $extension ) ) { |
|
88 | + if (empty($extension)) { |
|
89 | 89 | // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export |
90 | - return new WP_Error( 'image_error', "Unsupported content type [ $content_type ]:\n" . var_export( $response, true ) ); |
|
90 | + return new WP_Error('image_error', "Unsupported content type [ $content_type ]:\n".var_export($response, true)); |
|
91 | 91 | } |
92 | 92 | |
93 | 93 | // Complete the local filename. |
@@ -95,8 +95,8 @@ discard block |
||
95 | 95 | $image_full_url .= $extension; |
96 | 96 | |
97 | 97 | // Store the data locally. |
98 | - $wp_filesystem->put_contents( $image_full_path, wp_remote_retrieve_body( $response ) ); |
|
99 | - remove_filter( 'filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct' ); |
|
98 | + $wp_filesystem->put_contents($image_full_path, wp_remote_retrieve_body($response)); |
|
99 | + remove_filter('filesystem_method', 'Wordlift_Remote_Image_Service::_return_direct'); |
|
100 | 100 | |
101 | 101 | // Return the path. |
102 | 102 | return array( |
@@ -120,10 +120,10 @@ discard block |
||
120 | 120 | * false on fail or if the content type is not supported. |
121 | 121 | * @since 3.18.0 |
122 | 122 | */ |
123 | - private static function get_extension_from_content_type( $content_type ) { |
|
123 | + private static function get_extension_from_content_type($content_type) { |
|
124 | 124 | |
125 | 125 | // Return the extension if match. |
126 | - switch ( $content_type ) { |
|
126 | + switch ($content_type) { |
|
127 | 127 | case 'image/jpeg': |
128 | 128 | case 'image/jpg': |
129 | 129 | return '.jpg'; |
@@ -145,11 +145,11 @@ discard block |
||
145 | 145 | * @return bool True if the response is an error, otherwise false. |
146 | 146 | * @since 3.23.4 |
147 | 147 | */ |
148 | - private static function is_response_error( $response ) { |
|
148 | + private static function is_response_error($response) { |
|
149 | 149 | |
150 | - return ( is_wp_error( $response ) |
|
150 | + return (is_wp_error($response) |
|
151 | 151 | || 200 !== (int) $response['response']['code'] |
152 | - || ! isset( $response['body'] ) |
|
152 | + || ! isset($response['body']) |
|
153 | 153 | ); |
154 | 154 | } |
155 | 155 |
@@ -19,147 +19,147 @@ discard block |
||
19 | 19 | */ |
20 | 20 | class Wordlift_Entity_Type_Service { |
21 | 21 | |
22 | - /** |
|
23 | - * The {@link Wordlift_Schema_Service} instance. |
|
24 | - * |
|
25 | - * @since 3.7.0 |
|
26 | - * @access private |
|
27 | - * @var \Wordlift_Schema_Service $schema_service The {@link Wordlift_Schema_Service} instance. |
|
28 | - */ |
|
29 | - private $schema_service; |
|
30 | - |
|
31 | - /** |
|
32 | - * A {@link Wordlift_Log_Service} instance. |
|
33 | - * |
|
34 | - * @since 3.8.0 |
|
35 | - * @access private |
|
36 | - * @var \Wordlift_Log_Service $log A {@link Wordlift_Log_Service} instance. |
|
37 | - */ |
|
38 | - private $log; |
|
39 | - |
|
40 | - /** |
|
41 | - * Wordlift_Entity_Type_Service constructor. |
|
42 | - * |
|
43 | - * @since 3.7.0 |
|
44 | - */ |
|
45 | - protected function __construct() { |
|
46 | - |
|
47 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Type_Service' ); |
|
48 | - |
|
49 | - $this->schema_service = Wordlift_Schema_Service::get_instance(); |
|
50 | - |
|
51 | - $this->prepare_post_types(); |
|
52 | - |
|
53 | - } |
|
54 | - |
|
55 | - /** |
|
56 | - * Prepare post types for Gutenberg use |
|
57 | - * |
|
58 | - * @since 3.26.0 |
|
59 | - */ |
|
60 | - private function prepare_post_types() { |
|
61 | - |
|
62 | - add_action( |
|
63 | - 'init', |
|
64 | - function () { |
|
65 | - // Add post type support for 'custom-fields' for all post types. Specifically needed in Gutenberg |
|
66 | - $post_types = get_post_types(); |
|
67 | - foreach ( $post_types as $post_type ) { |
|
68 | - add_post_type_support( $post_type, 'custom-fields' ); |
|
69 | - } |
|
70 | - } |
|
71 | - ); |
|
72 | - } |
|
73 | - |
|
74 | - /** |
|
75 | - * The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
76 | - * |
|
77 | - * @since 3.7.0 |
|
78 | - * @access private |
|
79 | - * @var \Wordlift_Entity_Type_Service $instance The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
80 | - */ |
|
81 | - private static $instance = null; |
|
82 | - |
|
83 | - /** |
|
84 | - * Get the {@link Wordlift_Entity_Type_Service} singleton instance. |
|
85 | - * |
|
86 | - * @return \Wordlift_Entity_Type_Service The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
87 | - * @since 3.7.0 |
|
88 | - */ |
|
89 | - public static function get_instance() { |
|
90 | - |
|
91 | - if ( ! isset( self::$instance ) ) { |
|
92 | - self::$instance = new self(); |
|
93 | - } |
|
94 | - |
|
95 | - return self::$instance; |
|
96 | - } |
|
97 | - |
|
98 | - /** |
|
99 | - * Get the types associated with the specified entity post id. |
|
100 | - * |
|
101 | - * We have a strategy to define the entity type, given that everything is |
|
102 | - * an entity, i.e. also posts/pages and custom post types. |
|
103 | - * |
|
104 | - * @param int $post_id The post id. |
|
105 | - * |
|
106 | - * @return array|null { |
|
107 | - * An array of type properties or null if no term is associated |
|
108 | - * |
|
109 | - * @type string css_class The css class, e.g. `wl-thing`. |
|
110 | - * @type string uri The schema.org class URI, e.g. `http://schema.org/Thing`. |
|
111 | - * @type array same_as An array of same as attributes. |
|
112 | - * @type array custom_fields An array of custom fields. |
|
113 | - * } |
|
114 | - * @since 3.33.9 The `linked_data` key has been removed. |
|
115 | - * |
|
116 | - * @since 3.20.0 This function will **not** return entity types introduced with 3.20.0. |
|
117 | - * |
|
118 | - * @since 3.18.0 The cases are the following: |
|
119 | - * 1. the post has a term from the Entity Types Taxonomy: the term defines |
|
120 | - * the entity type, e.g. Organization, Person, ... |
|
121 | - * 2. the post doesn't have a term from the Entity Types Taxonomy: |
|
122 | - * a) the post is a `wl_entity` custom post type, then the post is |
|
123 | - * assigned the `Thing` entity type by default. |
|
124 | - * b) the post is a `post` post type, then the post is |
|
125 | - * assigned the `Article` entity type by default. |
|
126 | - * c) the post is a custom post type then it is |
|
127 | - * assigned the `WebPage` entity type by default. |
|
128 | - */ |
|
129 | - public function get( $post_id ) { |
|
130 | - |
|
131 | - $this->log->trace( "Getting the post type for post $post_id..." ); |
|
132 | - |
|
133 | - // Get the post type. |
|
134 | - $post_type = get_post_type( $post_id ); |
|
135 | - |
|
136 | - // Return `web-page` for non entities. |
|
137 | - if ( ! self::is_valid_entity_post_type( $post_type ) ) { |
|
138 | - $this->log->info( "Returning `web-page` for post $post_id." ); |
|
139 | - |
|
140 | - return $this->schema_service->get_schema( 'web-page' ); |
|
141 | - } |
|
142 | - |
|
143 | - // Get the type from the associated classification. |
|
144 | - $terms = wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
145 | - |
|
146 | - // Return the schema type if there is a term found. |
|
147 | - if ( ! is_wp_error( $terms ) && ! empty( $terms ) ) { |
|
148 | - // Cycle through the terms and return the first one with a valid schema. |
|
149 | - foreach ( $terms as $term ) { |
|
150 | - $this->log->debug( "Found `{$term->slug}` term for post $post_id." ); |
|
151 | - |
|
152 | - // Try to get the schema for the term. |
|
153 | - $schema = $this->schema_service->get_schema( $term->slug ); |
|
154 | - |
|
155 | - // If found, return it, ignoring the other types. |
|
156 | - if ( null !== $schema ) { |
|
157 | - // Return the entity type with the specified id. |
|
158 | - return $schema; |
|
159 | - } |
|
160 | - } |
|
161 | - |
|
162 | - /* |
|
22 | + /** |
|
23 | + * The {@link Wordlift_Schema_Service} instance. |
|
24 | + * |
|
25 | + * @since 3.7.0 |
|
26 | + * @access private |
|
27 | + * @var \Wordlift_Schema_Service $schema_service The {@link Wordlift_Schema_Service} instance. |
|
28 | + */ |
|
29 | + private $schema_service; |
|
30 | + |
|
31 | + /** |
|
32 | + * A {@link Wordlift_Log_Service} instance. |
|
33 | + * |
|
34 | + * @since 3.8.0 |
|
35 | + * @access private |
|
36 | + * @var \Wordlift_Log_Service $log A {@link Wordlift_Log_Service} instance. |
|
37 | + */ |
|
38 | + private $log; |
|
39 | + |
|
40 | + /** |
|
41 | + * Wordlift_Entity_Type_Service constructor. |
|
42 | + * |
|
43 | + * @since 3.7.0 |
|
44 | + */ |
|
45 | + protected function __construct() { |
|
46 | + |
|
47 | + $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Type_Service' ); |
|
48 | + |
|
49 | + $this->schema_service = Wordlift_Schema_Service::get_instance(); |
|
50 | + |
|
51 | + $this->prepare_post_types(); |
|
52 | + |
|
53 | + } |
|
54 | + |
|
55 | + /** |
|
56 | + * Prepare post types for Gutenberg use |
|
57 | + * |
|
58 | + * @since 3.26.0 |
|
59 | + */ |
|
60 | + private function prepare_post_types() { |
|
61 | + |
|
62 | + add_action( |
|
63 | + 'init', |
|
64 | + function () { |
|
65 | + // Add post type support for 'custom-fields' for all post types. Specifically needed in Gutenberg |
|
66 | + $post_types = get_post_types(); |
|
67 | + foreach ( $post_types as $post_type ) { |
|
68 | + add_post_type_support( $post_type, 'custom-fields' ); |
|
69 | + } |
|
70 | + } |
|
71 | + ); |
|
72 | + } |
|
73 | + |
|
74 | + /** |
|
75 | + * The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
76 | + * |
|
77 | + * @since 3.7.0 |
|
78 | + * @access private |
|
79 | + * @var \Wordlift_Entity_Type_Service $instance The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
80 | + */ |
|
81 | + private static $instance = null; |
|
82 | + |
|
83 | + /** |
|
84 | + * Get the {@link Wordlift_Entity_Type_Service} singleton instance. |
|
85 | + * |
|
86 | + * @return \Wordlift_Entity_Type_Service The {@link Wordlift_Entity_Type_Service} singleton instance. |
|
87 | + * @since 3.7.0 |
|
88 | + */ |
|
89 | + public static function get_instance() { |
|
90 | + |
|
91 | + if ( ! isset( self::$instance ) ) { |
|
92 | + self::$instance = new self(); |
|
93 | + } |
|
94 | + |
|
95 | + return self::$instance; |
|
96 | + } |
|
97 | + |
|
98 | + /** |
|
99 | + * Get the types associated with the specified entity post id. |
|
100 | + * |
|
101 | + * We have a strategy to define the entity type, given that everything is |
|
102 | + * an entity, i.e. also posts/pages and custom post types. |
|
103 | + * |
|
104 | + * @param int $post_id The post id. |
|
105 | + * |
|
106 | + * @return array|null { |
|
107 | + * An array of type properties or null if no term is associated |
|
108 | + * |
|
109 | + * @type string css_class The css class, e.g. `wl-thing`. |
|
110 | + * @type string uri The schema.org class URI, e.g. `http://schema.org/Thing`. |
|
111 | + * @type array same_as An array of same as attributes. |
|
112 | + * @type array custom_fields An array of custom fields. |
|
113 | + * } |
|
114 | + * @since 3.33.9 The `linked_data` key has been removed. |
|
115 | + * |
|
116 | + * @since 3.20.0 This function will **not** return entity types introduced with 3.20.0. |
|
117 | + * |
|
118 | + * @since 3.18.0 The cases are the following: |
|
119 | + * 1. the post has a term from the Entity Types Taxonomy: the term defines |
|
120 | + * the entity type, e.g. Organization, Person, ... |
|
121 | + * 2. the post doesn't have a term from the Entity Types Taxonomy: |
|
122 | + * a) the post is a `wl_entity` custom post type, then the post is |
|
123 | + * assigned the `Thing` entity type by default. |
|
124 | + * b) the post is a `post` post type, then the post is |
|
125 | + * assigned the `Article` entity type by default. |
|
126 | + * c) the post is a custom post type then it is |
|
127 | + * assigned the `WebPage` entity type by default. |
|
128 | + */ |
|
129 | + public function get( $post_id ) { |
|
130 | + |
|
131 | + $this->log->trace( "Getting the post type for post $post_id..." ); |
|
132 | + |
|
133 | + // Get the post type. |
|
134 | + $post_type = get_post_type( $post_id ); |
|
135 | + |
|
136 | + // Return `web-page` for non entities. |
|
137 | + if ( ! self::is_valid_entity_post_type( $post_type ) ) { |
|
138 | + $this->log->info( "Returning `web-page` for post $post_id." ); |
|
139 | + |
|
140 | + return $this->schema_service->get_schema( 'web-page' ); |
|
141 | + } |
|
142 | + |
|
143 | + // Get the type from the associated classification. |
|
144 | + $terms = wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
145 | + |
|
146 | + // Return the schema type if there is a term found. |
|
147 | + if ( ! is_wp_error( $terms ) && ! empty( $terms ) ) { |
|
148 | + // Cycle through the terms and return the first one with a valid schema. |
|
149 | + foreach ( $terms as $term ) { |
|
150 | + $this->log->debug( "Found `{$term->slug}` term for post $post_id." ); |
|
151 | + |
|
152 | + // Try to get the schema for the term. |
|
153 | + $schema = $this->schema_service->get_schema( $term->slug ); |
|
154 | + |
|
155 | + // If found, return it, ignoring the other types. |
|
156 | + if ( null !== $schema ) { |
|
157 | + // Return the entity type with the specified id. |
|
158 | + return $schema; |
|
159 | + } |
|
160 | + } |
|
161 | + |
|
162 | + /* |
|
163 | 163 | * When a schema isn't found, we return `thing`. Schema may not be found because |
164 | 164 | * the new schema classes that we support since #852 aren't configured in the schema |
165 | 165 | * service. |
@@ -169,93 +169,93 @@ discard block |
||
169 | 169 | * @since 3.20.0 |
170 | 170 | */ |
171 | 171 | |
172 | - return $this->schema_service->get_schema( 'thing' ); |
|
173 | - } |
|
174 | - |
|
175 | - // If it's a page or post return `Article`. |
|
176 | - if ( in_array( $post_type, array( 'post', 'page' ), true ) ) { |
|
177 | - $this->log->debug( "Post $post_id has no terms, and it's a `post` type, returning `Article`." ); |
|
178 | - |
|
179 | - // Return "Article" schema type for posts. |
|
180 | - return $this->schema_service->get_schema( 'article' ); |
|
181 | - } |
|
182 | - |
|
183 | - // Return "Thing" schema type for entities. |
|
184 | - $this->log->debug( "Post $post_id has no terms, but it's a `wl_entity` type, returning `Thing`." ); |
|
185 | - |
|
186 | - // Return the entity type with the specified id. |
|
187 | - return $this->schema_service->get_schema( 'thing' ); |
|
188 | - |
|
189 | - } |
|
190 | - |
|
191 | - /** |
|
192 | - * Get the term ids of the entity types associated to the specified post. |
|
193 | - * |
|
194 | - * @param int $post_id The post id. |
|
195 | - * |
|
196 | - * @return array|WP_Error An array of entity types ids or a {@link WP_Error}. |
|
197 | - * @since 3.20.0 |
|
198 | - */ |
|
199 | - public function get_ids( $post_id ) { |
|
200 | - |
|
201 | - return wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, array( 'fields' => 'ids' ) ); |
|
202 | - } |
|
203 | - |
|
204 | - /** |
|
205 | - * Get the camel case names of the entity types associated to the specified post. |
|
206 | - * |
|
207 | - * @param int $post_id The post id. |
|
208 | - * |
|
209 | - * @return array|WP_Error An array of entity types camel case names or a {@link WP_Error}. |
|
210 | - * @since 3.20.0 |
|
211 | - */ |
|
212 | - public function get_names( $post_id ) { |
|
213 | - |
|
214 | - $ids = $this->get_ids( $post_id ); |
|
215 | - |
|
216 | - // Filter out invalid terms (ones without _wl_name term meta) |
|
217 | - return array_values( |
|
218 | - array_filter( |
|
219 | - array_map( |
|
220 | - function ( $id ) { |
|
221 | - return get_term_meta( $id, '_wl_name', true ); |
|
222 | - }, |
|
223 | - $ids |
|
224 | - ) |
|
225 | - ) |
|
226 | - ); |
|
227 | - } |
|
228 | - |
|
229 | - /** |
|
230 | - * Set the main type for the specified entity post, given the type URI. |
|
231 | - * |
|
232 | - * @param int $post_id The post id. |
|
233 | - * @param string $type_uri The type URI. |
|
234 | - * @param bool $replace Whether the provided type must replace the existing types, by default `true`. |
|
235 | - * |
|
236 | - * @since 3.8.0 |
|
237 | - */ |
|
238 | - public function set( $post_id, $type_uri, $replace = true ) { |
|
239 | - |
|
240 | - // If the type URI is empty we remove the type. |
|
241 | - if ( empty( $type_uri ) ) { |
|
242 | - $this->log->debug( "Removing entity type for post $post_id..." ); |
|
243 | - |
|
244 | - wp_set_object_terms( $post_id, null, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
245 | - |
|
246 | - return; |
|
247 | - } |
|
248 | - |
|
249 | - $this->log->debug( "Setting entity type for post $post_id..." ); |
|
250 | - |
|
251 | - // if the `$type_uri` starts with `wl-`, we're looking at the class name, which is `wl-` + slug. |
|
252 | - $term = ( 0 === strpos( $type_uri, 'wl-' ) ) |
|
253 | - // Get term by slug. |
|
254 | - ? $this->get_term_by_slug( substr( $type_uri, 3 ) ) |
|
255 | - // Get term by URI. |
|
256 | - : $this->get_term_by_uri( $type_uri ); |
|
257 | - |
|
258 | - /* |
|
172 | + return $this->schema_service->get_schema( 'thing' ); |
|
173 | + } |
|
174 | + |
|
175 | + // If it's a page or post return `Article`. |
|
176 | + if ( in_array( $post_type, array( 'post', 'page' ), true ) ) { |
|
177 | + $this->log->debug( "Post $post_id has no terms, and it's a `post` type, returning `Article`." ); |
|
178 | + |
|
179 | + // Return "Article" schema type for posts. |
|
180 | + return $this->schema_service->get_schema( 'article' ); |
|
181 | + } |
|
182 | + |
|
183 | + // Return "Thing" schema type for entities. |
|
184 | + $this->log->debug( "Post $post_id has no terms, but it's a `wl_entity` type, returning `Thing`." ); |
|
185 | + |
|
186 | + // Return the entity type with the specified id. |
|
187 | + return $this->schema_service->get_schema( 'thing' ); |
|
188 | + |
|
189 | + } |
|
190 | + |
|
191 | + /** |
|
192 | + * Get the term ids of the entity types associated to the specified post. |
|
193 | + * |
|
194 | + * @param int $post_id The post id. |
|
195 | + * |
|
196 | + * @return array|WP_Error An array of entity types ids or a {@link WP_Error}. |
|
197 | + * @since 3.20.0 |
|
198 | + */ |
|
199 | + public function get_ids( $post_id ) { |
|
200 | + |
|
201 | + return wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, array( 'fields' => 'ids' ) ); |
|
202 | + } |
|
203 | + |
|
204 | + /** |
|
205 | + * Get the camel case names of the entity types associated to the specified post. |
|
206 | + * |
|
207 | + * @param int $post_id The post id. |
|
208 | + * |
|
209 | + * @return array|WP_Error An array of entity types camel case names or a {@link WP_Error}. |
|
210 | + * @since 3.20.0 |
|
211 | + */ |
|
212 | + public function get_names( $post_id ) { |
|
213 | + |
|
214 | + $ids = $this->get_ids( $post_id ); |
|
215 | + |
|
216 | + // Filter out invalid terms (ones without _wl_name term meta) |
|
217 | + return array_values( |
|
218 | + array_filter( |
|
219 | + array_map( |
|
220 | + function ( $id ) { |
|
221 | + return get_term_meta( $id, '_wl_name', true ); |
|
222 | + }, |
|
223 | + $ids |
|
224 | + ) |
|
225 | + ) |
|
226 | + ); |
|
227 | + } |
|
228 | + |
|
229 | + /** |
|
230 | + * Set the main type for the specified entity post, given the type URI. |
|
231 | + * |
|
232 | + * @param int $post_id The post id. |
|
233 | + * @param string $type_uri The type URI. |
|
234 | + * @param bool $replace Whether the provided type must replace the existing types, by default `true`. |
|
235 | + * |
|
236 | + * @since 3.8.0 |
|
237 | + */ |
|
238 | + public function set( $post_id, $type_uri, $replace = true ) { |
|
239 | + |
|
240 | + // If the type URI is empty we remove the type. |
|
241 | + if ( empty( $type_uri ) ) { |
|
242 | + $this->log->debug( "Removing entity type for post $post_id..." ); |
|
243 | + |
|
244 | + wp_set_object_terms( $post_id, null, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
245 | + |
|
246 | + return; |
|
247 | + } |
|
248 | + |
|
249 | + $this->log->debug( "Setting entity type for post $post_id..." ); |
|
250 | + |
|
251 | + // if the `$type_uri` starts with `wl-`, we're looking at the class name, which is `wl-` + slug. |
|
252 | + $term = ( 0 === strpos( $type_uri, 'wl-' ) ) |
|
253 | + // Get term by slug. |
|
254 | + ? $this->get_term_by_slug( substr( $type_uri, 3 ) ) |
|
255 | + // Get term by URI. |
|
256 | + : $this->get_term_by_uri( $type_uri ); |
|
257 | + |
|
258 | + /* |
|
259 | 259 | * We always want to assign a type to an entity otherwise it won't show in the Vocabulary and it won't be |
260 | 260 | * connected to Articles via mentions. We realized that the client JS code is passing `wl-other` when the |
261 | 261 | * entity type isn't "notable". In which case we couldn't find an entity type. |
@@ -266,246 +266,246 @@ discard block |
||
266 | 266 | * |
267 | 267 | * @since 3.23.4 |
268 | 268 | */ |
269 | - if ( false === $term ) { |
|
270 | - $this->log->warn( "No term found for URI $type_uri, will use Thing." ); |
|
271 | - |
|
272 | - $term = $this->get_term_by_slug( 'thing' ); |
|
273 | - |
|
274 | - // We still need to be able to bali out here, for example WordPress 5.1 tests create posts before our taxonomy |
|
275 | - // is installed. |
|
276 | - if ( false === $term ) { |
|
277 | - return; |
|
278 | - } |
|
279 | - } |
|
280 | - |
|
281 | - $this->log->debug( "Setting entity type [ post id :: $post_id ][ term id :: $term->term_id ][ term slug :: $term->slug ][ type uri :: $type_uri ]..." ); |
|
282 | - |
|
283 | - // `$replace` is passed to decide whether to replace or append the term. |
|
284 | - wp_set_object_terms( $post_id, $term->term_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, ! $replace ); |
|
285 | - |
|
286 | - } |
|
287 | - |
|
288 | - /** |
|
289 | - * Get an entity type term given its slug. |
|
290 | - * |
|
291 | - * @param string $slug The slug. |
|
292 | - * |
|
293 | - * @return false|WP_Term WP_Term instance on success. Will return false if `$taxonomy` does not exist |
|
294 | - * or `$term` was not found. |
|
295 | - * @since 3.20.0 |
|
296 | - */ |
|
297 | - private function get_term_by_slug( $slug ) { |
|
298 | - |
|
299 | - return get_term_by( 'slug', $slug, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
300 | - } |
|
301 | - |
|
302 | - /** |
|
303 | - * Get an entity type term given its URI. |
|
304 | - * |
|
305 | - * @param string $uri The uri. |
|
306 | - * |
|
307 | - * @return false|WP_Term WP_Term instance on success. Will return false if `$taxonomy` does not exist |
|
308 | - * or `$term` was not found. |
|
309 | - * @since 3.20.0 |
|
310 | - */ |
|
311 | - public function get_term_by_uri( $uri ) { |
|
312 | - |
|
313 | - $terms = get_terms( |
|
314 | - Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
315 | - array( |
|
316 | - 'fields' => 'all', |
|
317 | - 'get' => 'all', |
|
318 | - 'number' => 1, |
|
319 | - 'meta_query' => array( |
|
320 | - array( |
|
321 | - // Don't use a reference to Wordlift_Schemaorg_Class_Service, unless |
|
322 | - // `WL_ALL_ENTITY_TYPES` is set to true. |
|
323 | - 'key' => '_wl_uri', |
|
324 | - 'value' => $uri, |
|
325 | - ), |
|
326 | - ), |
|
327 | - 'orderby' => 'term_id', |
|
328 | - 'order' => 'ASC', |
|
329 | - ) |
|
330 | - ); |
|
331 | - |
|
332 | - return is_array( $terms ) && ! empty( $terms ) ? $terms[0] : false; |
|
333 | - } |
|
334 | - |
|
335 | - /** |
|
336 | - * Check whether an entity type is set for the {@link WP_Post} with the |
|
337 | - * specified id. |
|
338 | - * |
|
339 | - * @param int $post_id The {@link WP_Post}'s `id`. |
|
340 | - * @param string $uri The entity type URI. |
|
341 | - * |
|
342 | - * @return bool True if an entity type is set otherwise false. |
|
343 | - * @since 3.15.0 |
|
344 | - */ |
|
345 | - public function has_entity_type( $post_id, $uri = null ) { |
|
346 | - |
|
347 | - $this->log->debug( "Checking if post $post_id has an entity type [ $uri ]..." ); |
|
348 | - |
|
349 | - // If an URI hasn't been specified just check whether we have at least |
|
350 | - // one entity type. |
|
351 | - if ( null === $uri ) { |
|
352 | - return has_term( '', Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, $post_id ); |
|
353 | - } |
|
354 | - |
|
355 | - $has_entity_type = ( null !== $this->has_post_term_by_uri( $post_id, $uri ) ); |
|
356 | - |
|
357 | - $this->log->debug( "Post $post_id has $uri type: " . ( $has_entity_type ? 'yes' : 'no' ) ); |
|
358 | - |
|
359 | - // Check whether the post has an entity type with that URI. |
|
360 | - return $has_entity_type; |
|
361 | - } |
|
362 | - |
|
363 | - /** |
|
364 | - * Get the list of entity types' terms for the specified {@link WP_Post}. |
|
365 | - * |
|
366 | - * @param int $post_id The {@link WP_Post} id. |
|
367 | - * |
|
368 | - * @return array|WP_Error An array of entity types' terms or {@link WP_Error}. |
|
369 | - * @since 3.15.0 |
|
370 | - */ |
|
371 | - private function get_post_terms( $post_id ) { |
|
372 | - |
|
373 | - return wp_get_object_terms( |
|
374 | - $post_id, |
|
375 | - Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
376 | - array( |
|
377 | - 'hide_empty' => false, |
|
378 | - // Because of #334 (and the AAM plugin) we changed fields from 'id=>slug' to 'all'. |
|
379 | - // An issue has been opened with the AAM plugin author as well. |
|
380 | - // |
|
381 | - // see https://github.com/insideout10/wordlift-plugin/issues/334 |
|
382 | - // see https://wordpress.org/support/topic/idslug-not-working-anymore?replies=1#post-8806863 |
|
383 | - 'fields' => 'all', |
|
384 | - ) |
|
385 | - ); |
|
386 | - } |
|
387 | - |
|
388 | - /** |
|
389 | - * Get an entity type term given its URI. |
|
390 | - * |
|
391 | - * @param int $post_id The {@link WP_Post} id. |
|
392 | - * @param string $uri The entity type URI. |
|
393 | - * |
|
394 | - * @return bool True if the post has that type URI bound to it otherwise false. |
|
395 | - * @since 3.15.0 |
|
396 | - * |
|
397 | - * @since 3.20.0 function renamed to `has_post_term_by_uri` and return type changed to `bool`. |
|
398 | - */ |
|
399 | - private function has_post_term_by_uri( $post_id, $uri ) { |
|
400 | - |
|
401 | - // Get the post terms bound to the specified post. |
|
402 | - $terms = $this->get_post_terms( $post_id ); |
|
403 | - |
|
404 | - // Look for a term if the specified URI. |
|
405 | - foreach ( $terms as $term ) { |
|
406 | - $term_uri = get_term_meta( $term->term_id, '_wl_uri', true ); |
|
407 | - |
|
408 | - if ( $uri === $term_uri ) { |
|
409 | - return true; |
|
410 | - } |
|
411 | - } |
|
412 | - |
|
413 | - // Return null. |
|
414 | - return false; |
|
415 | - } |
|
416 | - |
|
417 | - /** |
|
418 | - * Get the custom fields for a specific post. |
|
419 | - * |
|
420 | - * @param int $post_id The post ID. |
|
421 | - * |
|
422 | - * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
|
423 | - * @since 3.25.2 |
|
424 | - */ |
|
425 | - public function get_custom_fields_for_post( $post_id ) { |
|
426 | - |
|
427 | - // Return custom fields for this specific entity's type. |
|
428 | - $types = $this->get_ids( $post_id ); |
|
429 | - |
|
430 | - /** @var WP_Term[] $terms */ |
|
431 | - $terms = array_filter( |
|
432 | - array_map( |
|
433 | - function ( $item ) { |
|
434 | - return get_term( $item ); |
|
435 | - }, |
|
436 | - $types |
|
437 | - ), |
|
438 | - function ( $item ) { |
|
439 | - return isset( $item ) && is_a( $item, 'WP_Term' ); |
|
440 | - } |
|
441 | - ); |
|
442 | - |
|
443 | - $term_slugs = array_map( |
|
444 | - function ( $item ) { |
|
445 | - return $item->slug; |
|
446 | - }, |
|
447 | - $terms |
|
448 | - ); |
|
449 | - |
|
450 | - $term_slugs[] = 'thing'; |
|
451 | - |
|
452 | - return $this->get_custom_fields_by_term_slugs( $term_slugs ); |
|
453 | - } |
|
454 | - |
|
455 | - /** |
|
456 | - * Get the custom fields for a specific term. |
|
457 | - * |
|
458 | - * @param int $term_id The term ID. |
|
459 | - * |
|
460 | - * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
|
461 | - * @since 3.32.0 |
|
462 | - */ |
|
463 | - public function get_custom_fields_for_term( $term_id ) { |
|
464 | - $selected_entity_types = get_term_meta( $term_id, 'wl_entity_type' ); |
|
465 | - $selected_entity_types[] = 'thing'; |
|
466 | - $selected_entity_types = array_unique( $selected_entity_types ); |
|
467 | - |
|
468 | - return $this->get_custom_fields_by_term_slugs( $selected_entity_types ); |
|
469 | - } |
|
470 | - |
|
471 | - /** |
|
472 | - * Determines whether a post type can be used for entities. |
|
473 | - * |
|
474 | - * Criteria is that the post type is public. The list of valid post types |
|
475 | - * can be overridden with a filter. |
|
476 | - * |
|
477 | - * @param string $post_type A post type name. |
|
478 | - * |
|
479 | - * @return bool Return true if the post type can be used for entities, otherwise false. |
|
480 | - * @since 3.15.0 |
|
481 | - */ |
|
482 | - public static function is_valid_entity_post_type( $post_type ) { |
|
483 | - |
|
484 | - return in_array( $post_type, Wordlift_Entity_Service::valid_entity_post_types(), true ); |
|
485 | - } |
|
486 | - |
|
487 | - /** |
|
488 | - * @param $term_slugs |
|
489 | - * |
|
490 | - * @return array |
|
491 | - */ |
|
492 | - private function get_custom_fields_by_term_slugs( $term_slugs ) { |
|
493 | - $schema_service = Wordlift_Schema_Service::get_instance(); |
|
494 | - |
|
495 | - return array_reduce( |
|
496 | - $term_slugs, |
|
497 | - function ( $carry, $item ) use ( $schema_service ) { |
|
498 | - |
|
499 | - $schema = $schema_service->get_schema( $item ); |
|
500 | - |
|
501 | - if ( ! isset( $schema['custom_fields'] ) ) { |
|
502 | - return $carry; |
|
503 | - } |
|
504 | - |
|
505 | - return $carry + $schema['custom_fields']; |
|
506 | - }, |
|
507 | - array() |
|
508 | - ); |
|
509 | - } |
|
269 | + if ( false === $term ) { |
|
270 | + $this->log->warn( "No term found for URI $type_uri, will use Thing." ); |
|
271 | + |
|
272 | + $term = $this->get_term_by_slug( 'thing' ); |
|
273 | + |
|
274 | + // We still need to be able to bali out here, for example WordPress 5.1 tests create posts before our taxonomy |
|
275 | + // is installed. |
|
276 | + if ( false === $term ) { |
|
277 | + return; |
|
278 | + } |
|
279 | + } |
|
280 | + |
|
281 | + $this->log->debug( "Setting entity type [ post id :: $post_id ][ term id :: $term->term_id ][ term slug :: $term->slug ][ type uri :: $type_uri ]..." ); |
|
282 | + |
|
283 | + // `$replace` is passed to decide whether to replace or append the term. |
|
284 | + wp_set_object_terms( $post_id, $term->term_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, ! $replace ); |
|
285 | + |
|
286 | + } |
|
287 | + |
|
288 | + /** |
|
289 | + * Get an entity type term given its slug. |
|
290 | + * |
|
291 | + * @param string $slug The slug. |
|
292 | + * |
|
293 | + * @return false|WP_Term WP_Term instance on success. Will return false if `$taxonomy` does not exist |
|
294 | + * or `$term` was not found. |
|
295 | + * @since 3.20.0 |
|
296 | + */ |
|
297 | + private function get_term_by_slug( $slug ) { |
|
298 | + |
|
299 | + return get_term_by( 'slug', $slug, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
300 | + } |
|
301 | + |
|
302 | + /** |
|
303 | + * Get an entity type term given its URI. |
|
304 | + * |
|
305 | + * @param string $uri The uri. |
|
306 | + * |
|
307 | + * @return false|WP_Term WP_Term instance on success. Will return false if `$taxonomy` does not exist |
|
308 | + * or `$term` was not found. |
|
309 | + * @since 3.20.0 |
|
310 | + */ |
|
311 | + public function get_term_by_uri( $uri ) { |
|
312 | + |
|
313 | + $terms = get_terms( |
|
314 | + Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
315 | + array( |
|
316 | + 'fields' => 'all', |
|
317 | + 'get' => 'all', |
|
318 | + 'number' => 1, |
|
319 | + 'meta_query' => array( |
|
320 | + array( |
|
321 | + // Don't use a reference to Wordlift_Schemaorg_Class_Service, unless |
|
322 | + // `WL_ALL_ENTITY_TYPES` is set to true. |
|
323 | + 'key' => '_wl_uri', |
|
324 | + 'value' => $uri, |
|
325 | + ), |
|
326 | + ), |
|
327 | + 'orderby' => 'term_id', |
|
328 | + 'order' => 'ASC', |
|
329 | + ) |
|
330 | + ); |
|
331 | + |
|
332 | + return is_array( $terms ) && ! empty( $terms ) ? $terms[0] : false; |
|
333 | + } |
|
334 | + |
|
335 | + /** |
|
336 | + * Check whether an entity type is set for the {@link WP_Post} with the |
|
337 | + * specified id. |
|
338 | + * |
|
339 | + * @param int $post_id The {@link WP_Post}'s `id`. |
|
340 | + * @param string $uri The entity type URI. |
|
341 | + * |
|
342 | + * @return bool True if an entity type is set otherwise false. |
|
343 | + * @since 3.15.0 |
|
344 | + */ |
|
345 | + public function has_entity_type( $post_id, $uri = null ) { |
|
346 | + |
|
347 | + $this->log->debug( "Checking if post $post_id has an entity type [ $uri ]..." ); |
|
348 | + |
|
349 | + // If an URI hasn't been specified just check whether we have at least |
|
350 | + // one entity type. |
|
351 | + if ( null === $uri ) { |
|
352 | + return has_term( '', Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, $post_id ); |
|
353 | + } |
|
354 | + |
|
355 | + $has_entity_type = ( null !== $this->has_post_term_by_uri( $post_id, $uri ) ); |
|
356 | + |
|
357 | + $this->log->debug( "Post $post_id has $uri type: " . ( $has_entity_type ? 'yes' : 'no' ) ); |
|
358 | + |
|
359 | + // Check whether the post has an entity type with that URI. |
|
360 | + return $has_entity_type; |
|
361 | + } |
|
362 | + |
|
363 | + /** |
|
364 | + * Get the list of entity types' terms for the specified {@link WP_Post}. |
|
365 | + * |
|
366 | + * @param int $post_id The {@link WP_Post} id. |
|
367 | + * |
|
368 | + * @return array|WP_Error An array of entity types' terms or {@link WP_Error}. |
|
369 | + * @since 3.15.0 |
|
370 | + */ |
|
371 | + private function get_post_terms( $post_id ) { |
|
372 | + |
|
373 | + return wp_get_object_terms( |
|
374 | + $post_id, |
|
375 | + Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
|
376 | + array( |
|
377 | + 'hide_empty' => false, |
|
378 | + // Because of #334 (and the AAM plugin) we changed fields from 'id=>slug' to 'all'. |
|
379 | + // An issue has been opened with the AAM plugin author as well. |
|
380 | + // |
|
381 | + // see https://github.com/insideout10/wordlift-plugin/issues/334 |
|
382 | + // see https://wordpress.org/support/topic/idslug-not-working-anymore?replies=1#post-8806863 |
|
383 | + 'fields' => 'all', |
|
384 | + ) |
|
385 | + ); |
|
386 | + } |
|
387 | + |
|
388 | + /** |
|
389 | + * Get an entity type term given its URI. |
|
390 | + * |
|
391 | + * @param int $post_id The {@link WP_Post} id. |
|
392 | + * @param string $uri The entity type URI. |
|
393 | + * |
|
394 | + * @return bool True if the post has that type URI bound to it otherwise false. |
|
395 | + * @since 3.15.0 |
|
396 | + * |
|
397 | + * @since 3.20.0 function renamed to `has_post_term_by_uri` and return type changed to `bool`. |
|
398 | + */ |
|
399 | + private function has_post_term_by_uri( $post_id, $uri ) { |
|
400 | + |
|
401 | + // Get the post terms bound to the specified post. |
|
402 | + $terms = $this->get_post_terms( $post_id ); |
|
403 | + |
|
404 | + // Look for a term if the specified URI. |
|
405 | + foreach ( $terms as $term ) { |
|
406 | + $term_uri = get_term_meta( $term->term_id, '_wl_uri', true ); |
|
407 | + |
|
408 | + if ( $uri === $term_uri ) { |
|
409 | + return true; |
|
410 | + } |
|
411 | + } |
|
412 | + |
|
413 | + // Return null. |
|
414 | + return false; |
|
415 | + } |
|
416 | + |
|
417 | + /** |
|
418 | + * Get the custom fields for a specific post. |
|
419 | + * |
|
420 | + * @param int $post_id The post ID. |
|
421 | + * |
|
422 | + * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
|
423 | + * @since 3.25.2 |
|
424 | + */ |
|
425 | + public function get_custom_fields_for_post( $post_id ) { |
|
426 | + |
|
427 | + // Return custom fields for this specific entity's type. |
|
428 | + $types = $this->get_ids( $post_id ); |
|
429 | + |
|
430 | + /** @var WP_Term[] $terms */ |
|
431 | + $terms = array_filter( |
|
432 | + array_map( |
|
433 | + function ( $item ) { |
|
434 | + return get_term( $item ); |
|
435 | + }, |
|
436 | + $types |
|
437 | + ), |
|
438 | + function ( $item ) { |
|
439 | + return isset( $item ) && is_a( $item, 'WP_Term' ); |
|
440 | + } |
|
441 | + ); |
|
442 | + |
|
443 | + $term_slugs = array_map( |
|
444 | + function ( $item ) { |
|
445 | + return $item->slug; |
|
446 | + }, |
|
447 | + $terms |
|
448 | + ); |
|
449 | + |
|
450 | + $term_slugs[] = 'thing'; |
|
451 | + |
|
452 | + return $this->get_custom_fields_by_term_slugs( $term_slugs ); |
|
453 | + } |
|
454 | + |
|
455 | + /** |
|
456 | + * Get the custom fields for a specific term. |
|
457 | + * |
|
458 | + * @param int $term_id The term ID. |
|
459 | + * |
|
460 | + * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
|
461 | + * @since 3.32.0 |
|
462 | + */ |
|
463 | + public function get_custom_fields_for_term( $term_id ) { |
|
464 | + $selected_entity_types = get_term_meta( $term_id, 'wl_entity_type' ); |
|
465 | + $selected_entity_types[] = 'thing'; |
|
466 | + $selected_entity_types = array_unique( $selected_entity_types ); |
|
467 | + |
|
468 | + return $this->get_custom_fields_by_term_slugs( $selected_entity_types ); |
|
469 | + } |
|
470 | + |
|
471 | + /** |
|
472 | + * Determines whether a post type can be used for entities. |
|
473 | + * |
|
474 | + * Criteria is that the post type is public. The list of valid post types |
|
475 | + * can be overridden with a filter. |
|
476 | + * |
|
477 | + * @param string $post_type A post type name. |
|
478 | + * |
|
479 | + * @return bool Return true if the post type can be used for entities, otherwise false. |
|
480 | + * @since 3.15.0 |
|
481 | + */ |
|
482 | + public static function is_valid_entity_post_type( $post_type ) { |
|
483 | + |
|
484 | + return in_array( $post_type, Wordlift_Entity_Service::valid_entity_post_types(), true ); |
|
485 | + } |
|
486 | + |
|
487 | + /** |
|
488 | + * @param $term_slugs |
|
489 | + * |
|
490 | + * @return array |
|
491 | + */ |
|
492 | + private function get_custom_fields_by_term_slugs( $term_slugs ) { |
|
493 | + $schema_service = Wordlift_Schema_Service::get_instance(); |
|
494 | + |
|
495 | + return array_reduce( |
|
496 | + $term_slugs, |
|
497 | + function ( $carry, $item ) use ( $schema_service ) { |
|
498 | + |
|
499 | + $schema = $schema_service->get_schema( $item ); |
|
500 | + |
|
501 | + if ( ! isset( $schema['custom_fields'] ) ) { |
|
502 | + return $carry; |
|
503 | + } |
|
504 | + |
|
505 | + return $carry + $schema['custom_fields']; |
|
506 | + }, |
|
507 | + array() |
|
508 | + ); |
|
509 | + } |
|
510 | 510 | |
511 | 511 | } |
@@ -44,7 +44,7 @@ discard block |
||
44 | 44 | */ |
45 | 45 | protected function __construct() { |
46 | 46 | |
47 | - $this->log = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Type_Service' ); |
|
47 | + $this->log = Wordlift_Log_Service::get_logger('Wordlift_Entity_Type_Service'); |
|
48 | 48 | |
49 | 49 | $this->schema_service = Wordlift_Schema_Service::get_instance(); |
50 | 50 | |
@@ -61,11 +61,11 @@ discard block |
||
61 | 61 | |
62 | 62 | add_action( |
63 | 63 | 'init', |
64 | - function () { |
|
64 | + function() { |
|
65 | 65 | // Add post type support for 'custom-fields' for all post types. Specifically needed in Gutenberg |
66 | 66 | $post_types = get_post_types(); |
67 | - foreach ( $post_types as $post_type ) { |
|
68 | - add_post_type_support( $post_type, 'custom-fields' ); |
|
67 | + foreach ($post_types as $post_type) { |
|
68 | + add_post_type_support($post_type, 'custom-fields'); |
|
69 | 69 | } |
70 | 70 | } |
71 | 71 | ); |
@@ -88,7 +88,7 @@ discard block |
||
88 | 88 | */ |
89 | 89 | public static function get_instance() { |
90 | 90 | |
91 | - if ( ! isset( self::$instance ) ) { |
|
91 | + if ( ! isset(self::$instance)) { |
|
92 | 92 | self::$instance = new self(); |
93 | 93 | } |
94 | 94 | |
@@ -126,34 +126,34 @@ discard block |
||
126 | 126 | * c) the post is a custom post type then it is |
127 | 127 | * assigned the `WebPage` entity type by default. |
128 | 128 | */ |
129 | - public function get( $post_id ) { |
|
129 | + public function get($post_id) { |
|
130 | 130 | |
131 | - $this->log->trace( "Getting the post type for post $post_id..." ); |
|
131 | + $this->log->trace("Getting the post type for post $post_id..."); |
|
132 | 132 | |
133 | 133 | // Get the post type. |
134 | - $post_type = get_post_type( $post_id ); |
|
134 | + $post_type = get_post_type($post_id); |
|
135 | 135 | |
136 | 136 | // Return `web-page` for non entities. |
137 | - if ( ! self::is_valid_entity_post_type( $post_type ) ) { |
|
138 | - $this->log->info( "Returning `web-page` for post $post_id." ); |
|
137 | + if ( ! self::is_valid_entity_post_type($post_type)) { |
|
138 | + $this->log->info("Returning `web-page` for post $post_id."); |
|
139 | 139 | |
140 | - return $this->schema_service->get_schema( 'web-page' ); |
|
140 | + return $this->schema_service->get_schema('web-page'); |
|
141 | 141 | } |
142 | 142 | |
143 | 143 | // Get the type from the associated classification. |
144 | - $terms = wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
144 | + $terms = wp_get_object_terms($post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME); |
|
145 | 145 | |
146 | 146 | // Return the schema type if there is a term found. |
147 | - if ( ! is_wp_error( $terms ) && ! empty( $terms ) ) { |
|
147 | + if ( ! is_wp_error($terms) && ! empty($terms)) { |
|
148 | 148 | // Cycle through the terms and return the first one with a valid schema. |
149 | - foreach ( $terms as $term ) { |
|
150 | - $this->log->debug( "Found `{$term->slug}` term for post $post_id." ); |
|
149 | + foreach ($terms as $term) { |
|
150 | + $this->log->debug("Found `{$term->slug}` term for post $post_id."); |
|
151 | 151 | |
152 | 152 | // Try to get the schema for the term. |
153 | - $schema = $this->schema_service->get_schema( $term->slug ); |
|
153 | + $schema = $this->schema_service->get_schema($term->slug); |
|
154 | 154 | |
155 | 155 | // If found, return it, ignoring the other types. |
156 | - if ( null !== $schema ) { |
|
156 | + if (null !== $schema) { |
|
157 | 157 | // Return the entity type with the specified id. |
158 | 158 | return $schema; |
159 | 159 | } |
@@ -169,22 +169,22 @@ discard block |
||
169 | 169 | * @since 3.20.0 |
170 | 170 | */ |
171 | 171 | |
172 | - return $this->schema_service->get_schema( 'thing' ); |
|
172 | + return $this->schema_service->get_schema('thing'); |
|
173 | 173 | } |
174 | 174 | |
175 | 175 | // If it's a page or post return `Article`. |
176 | - if ( in_array( $post_type, array( 'post', 'page' ), true ) ) { |
|
177 | - $this->log->debug( "Post $post_id has no terms, and it's a `post` type, returning `Article`." ); |
|
176 | + if (in_array($post_type, array('post', 'page'), true)) { |
|
177 | + $this->log->debug("Post $post_id has no terms, and it's a `post` type, returning `Article`."); |
|
178 | 178 | |
179 | 179 | // Return "Article" schema type for posts. |
180 | - return $this->schema_service->get_schema( 'article' ); |
|
180 | + return $this->schema_service->get_schema('article'); |
|
181 | 181 | } |
182 | 182 | |
183 | 183 | // Return "Thing" schema type for entities. |
184 | - $this->log->debug( "Post $post_id has no terms, but it's a `wl_entity` type, returning `Thing`." ); |
|
184 | + $this->log->debug("Post $post_id has no terms, but it's a `wl_entity` type, returning `Thing`."); |
|
185 | 185 | |
186 | 186 | // Return the entity type with the specified id. |
187 | - return $this->schema_service->get_schema( 'thing' ); |
|
187 | + return $this->schema_service->get_schema('thing'); |
|
188 | 188 | |
189 | 189 | } |
190 | 190 | |
@@ -196,9 +196,9 @@ discard block |
||
196 | 196 | * @return array|WP_Error An array of entity types ids or a {@link WP_Error}. |
197 | 197 | * @since 3.20.0 |
198 | 198 | */ |
199 | - public function get_ids( $post_id ) { |
|
199 | + public function get_ids($post_id) { |
|
200 | 200 | |
201 | - return wp_get_object_terms( $post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, array( 'fields' => 'ids' ) ); |
|
201 | + return wp_get_object_terms($post_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, array('fields' => 'ids')); |
|
202 | 202 | } |
203 | 203 | |
204 | 204 | /** |
@@ -209,16 +209,16 @@ discard block |
||
209 | 209 | * @return array|WP_Error An array of entity types camel case names or a {@link WP_Error}. |
210 | 210 | * @since 3.20.0 |
211 | 211 | */ |
212 | - public function get_names( $post_id ) { |
|
212 | + public function get_names($post_id) { |
|
213 | 213 | |
214 | - $ids = $this->get_ids( $post_id ); |
|
214 | + $ids = $this->get_ids($post_id); |
|
215 | 215 | |
216 | 216 | // Filter out invalid terms (ones without _wl_name term meta) |
217 | 217 | return array_values( |
218 | 218 | array_filter( |
219 | 219 | array_map( |
220 | - function ( $id ) { |
|
221 | - return get_term_meta( $id, '_wl_name', true ); |
|
220 | + function($id) { |
|
221 | + return get_term_meta($id, '_wl_name', true); |
|
222 | 222 | }, |
223 | 223 | $ids |
224 | 224 | ) |
@@ -235,25 +235,25 @@ discard block |
||
235 | 235 | * |
236 | 236 | * @since 3.8.0 |
237 | 237 | */ |
238 | - public function set( $post_id, $type_uri, $replace = true ) { |
|
238 | + public function set($post_id, $type_uri, $replace = true) { |
|
239 | 239 | |
240 | 240 | // If the type URI is empty we remove the type. |
241 | - if ( empty( $type_uri ) ) { |
|
242 | - $this->log->debug( "Removing entity type for post $post_id..." ); |
|
241 | + if (empty($type_uri)) { |
|
242 | + $this->log->debug("Removing entity type for post $post_id..."); |
|
243 | 243 | |
244 | - wp_set_object_terms( $post_id, null, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
244 | + wp_set_object_terms($post_id, null, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME); |
|
245 | 245 | |
246 | 246 | return; |
247 | 247 | } |
248 | 248 | |
249 | - $this->log->debug( "Setting entity type for post $post_id..." ); |
|
249 | + $this->log->debug("Setting entity type for post $post_id..."); |
|
250 | 250 | |
251 | 251 | // if the `$type_uri` starts with `wl-`, we're looking at the class name, which is `wl-` + slug. |
252 | - $term = ( 0 === strpos( $type_uri, 'wl-' ) ) |
|
252 | + $term = (0 === strpos($type_uri, 'wl-')) |
|
253 | 253 | // Get term by slug. |
254 | - ? $this->get_term_by_slug( substr( $type_uri, 3 ) ) |
|
254 | + ? $this->get_term_by_slug(substr($type_uri, 3)) |
|
255 | 255 | // Get term by URI. |
256 | - : $this->get_term_by_uri( $type_uri ); |
|
256 | + : $this->get_term_by_uri($type_uri); |
|
257 | 257 | |
258 | 258 | /* |
259 | 259 | * We always want to assign a type to an entity otherwise it won't show in the Vocabulary and it won't be |
@@ -266,22 +266,22 @@ discard block |
||
266 | 266 | * |
267 | 267 | * @since 3.23.4 |
268 | 268 | */ |
269 | - if ( false === $term ) { |
|
270 | - $this->log->warn( "No term found for URI $type_uri, will use Thing." ); |
|
269 | + if (false === $term) { |
|
270 | + $this->log->warn("No term found for URI $type_uri, will use Thing."); |
|
271 | 271 | |
272 | - $term = $this->get_term_by_slug( 'thing' ); |
|
272 | + $term = $this->get_term_by_slug('thing'); |
|
273 | 273 | |
274 | 274 | // We still need to be able to bali out here, for example WordPress 5.1 tests create posts before our taxonomy |
275 | 275 | // is installed. |
276 | - if ( false === $term ) { |
|
276 | + if (false === $term) { |
|
277 | 277 | return; |
278 | 278 | } |
279 | 279 | } |
280 | 280 | |
281 | - $this->log->debug( "Setting entity type [ post id :: $post_id ][ term id :: $term->term_id ][ term slug :: $term->slug ][ type uri :: $type_uri ]..." ); |
|
281 | + $this->log->debug("Setting entity type [ post id :: $post_id ][ term id :: $term->term_id ][ term slug :: $term->slug ][ type uri :: $type_uri ]..."); |
|
282 | 282 | |
283 | 283 | // `$replace` is passed to decide whether to replace or append the term. |
284 | - wp_set_object_terms( $post_id, $term->term_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, ! $replace ); |
|
284 | + wp_set_object_terms($post_id, $term->term_id, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, ! $replace); |
|
285 | 285 | |
286 | 286 | } |
287 | 287 | |
@@ -294,9 +294,9 @@ discard block |
||
294 | 294 | * or `$term` was not found. |
295 | 295 | * @since 3.20.0 |
296 | 296 | */ |
297 | - private function get_term_by_slug( $slug ) { |
|
297 | + private function get_term_by_slug($slug) { |
|
298 | 298 | |
299 | - return get_term_by( 'slug', $slug, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME ); |
|
299 | + return get_term_by('slug', $slug, Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME); |
|
300 | 300 | } |
301 | 301 | |
302 | 302 | /** |
@@ -308,7 +308,7 @@ discard block |
||
308 | 308 | * or `$term` was not found. |
309 | 309 | * @since 3.20.0 |
310 | 310 | */ |
311 | - public function get_term_by_uri( $uri ) { |
|
311 | + public function get_term_by_uri($uri) { |
|
312 | 312 | |
313 | 313 | $terms = get_terms( |
314 | 314 | Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, |
@@ -329,7 +329,7 @@ discard block |
||
329 | 329 | ) |
330 | 330 | ); |
331 | 331 | |
332 | - return is_array( $terms ) && ! empty( $terms ) ? $terms[0] : false; |
|
332 | + return is_array($terms) && ! empty($terms) ? $terms[0] : false; |
|
333 | 333 | } |
334 | 334 | |
335 | 335 | /** |
@@ -342,19 +342,19 @@ discard block |
||
342 | 342 | * @return bool True if an entity type is set otherwise false. |
343 | 343 | * @since 3.15.0 |
344 | 344 | */ |
345 | - public function has_entity_type( $post_id, $uri = null ) { |
|
345 | + public function has_entity_type($post_id, $uri = null) { |
|
346 | 346 | |
347 | - $this->log->debug( "Checking if post $post_id has an entity type [ $uri ]..." ); |
|
347 | + $this->log->debug("Checking if post $post_id has an entity type [ $uri ]..."); |
|
348 | 348 | |
349 | 349 | // If an URI hasn't been specified just check whether we have at least |
350 | 350 | // one entity type. |
351 | - if ( null === $uri ) { |
|
352 | - return has_term( '', Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, $post_id ); |
|
351 | + if (null === $uri) { |
|
352 | + return has_term('', Wordlift_Entity_Type_Taxonomy_Service::TAXONOMY_NAME, $post_id); |
|
353 | 353 | } |
354 | 354 | |
355 | - $has_entity_type = ( null !== $this->has_post_term_by_uri( $post_id, $uri ) ); |
|
355 | + $has_entity_type = (null !== $this->has_post_term_by_uri($post_id, $uri)); |
|
356 | 356 | |
357 | - $this->log->debug( "Post $post_id has $uri type: " . ( $has_entity_type ? 'yes' : 'no' ) ); |
|
357 | + $this->log->debug("Post $post_id has $uri type: ".($has_entity_type ? 'yes' : 'no')); |
|
358 | 358 | |
359 | 359 | // Check whether the post has an entity type with that URI. |
360 | 360 | return $has_entity_type; |
@@ -368,7 +368,7 @@ discard block |
||
368 | 368 | * @return array|WP_Error An array of entity types' terms or {@link WP_Error}. |
369 | 369 | * @since 3.15.0 |
370 | 370 | */ |
371 | - private function get_post_terms( $post_id ) { |
|
371 | + private function get_post_terms($post_id) { |
|
372 | 372 | |
373 | 373 | return wp_get_object_terms( |
374 | 374 | $post_id, |
@@ -396,16 +396,16 @@ discard block |
||
396 | 396 | * |
397 | 397 | * @since 3.20.0 function renamed to `has_post_term_by_uri` and return type changed to `bool`. |
398 | 398 | */ |
399 | - private function has_post_term_by_uri( $post_id, $uri ) { |
|
399 | + private function has_post_term_by_uri($post_id, $uri) { |
|
400 | 400 | |
401 | 401 | // Get the post terms bound to the specified post. |
402 | - $terms = $this->get_post_terms( $post_id ); |
|
402 | + $terms = $this->get_post_terms($post_id); |
|
403 | 403 | |
404 | 404 | // Look for a term if the specified URI. |
405 | - foreach ( $terms as $term ) { |
|
406 | - $term_uri = get_term_meta( $term->term_id, '_wl_uri', true ); |
|
405 | + foreach ($terms as $term) { |
|
406 | + $term_uri = get_term_meta($term->term_id, '_wl_uri', true); |
|
407 | 407 | |
408 | - if ( $uri === $term_uri ) { |
|
408 | + if ($uri === $term_uri) { |
|
409 | 409 | return true; |
410 | 410 | } |
411 | 411 | } |
@@ -422,26 +422,26 @@ discard block |
||
422 | 422 | * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
423 | 423 | * @since 3.25.2 |
424 | 424 | */ |
425 | - public function get_custom_fields_for_post( $post_id ) { |
|
425 | + public function get_custom_fields_for_post($post_id) { |
|
426 | 426 | |
427 | 427 | // Return custom fields for this specific entity's type. |
428 | - $types = $this->get_ids( $post_id ); |
|
428 | + $types = $this->get_ids($post_id); |
|
429 | 429 | |
430 | 430 | /** @var WP_Term[] $terms */ |
431 | 431 | $terms = array_filter( |
432 | 432 | array_map( |
433 | - function ( $item ) { |
|
434 | - return get_term( $item ); |
|
433 | + function($item) { |
|
434 | + return get_term($item); |
|
435 | 435 | }, |
436 | 436 | $types |
437 | 437 | ), |
438 | - function ( $item ) { |
|
439 | - return isset( $item ) && is_a( $item, 'WP_Term' ); |
|
438 | + function($item) { |
|
439 | + return isset($item) && is_a($item, 'WP_Term'); |
|
440 | 440 | } |
441 | 441 | ); |
442 | 442 | |
443 | 443 | $term_slugs = array_map( |
444 | - function ( $item ) { |
|
444 | + function($item) { |
|
445 | 445 | return $item->slug; |
446 | 446 | }, |
447 | 447 | $terms |
@@ -449,7 +449,7 @@ discard block |
||
449 | 449 | |
450 | 450 | $term_slugs[] = 'thing'; |
451 | 451 | |
452 | - return $this->get_custom_fields_by_term_slugs( $term_slugs ); |
|
452 | + return $this->get_custom_fields_by_term_slugs($term_slugs); |
|
453 | 453 | } |
454 | 454 | |
455 | 455 | /** |
@@ -460,12 +460,12 @@ discard block |
||
460 | 460 | * @return array An array of custom fields (see `custom_fields` in Wordlift_Schema_Service). |
461 | 461 | * @since 3.32.0 |
462 | 462 | */ |
463 | - public function get_custom_fields_for_term( $term_id ) { |
|
464 | - $selected_entity_types = get_term_meta( $term_id, 'wl_entity_type' ); |
|
463 | + public function get_custom_fields_for_term($term_id) { |
|
464 | + $selected_entity_types = get_term_meta($term_id, 'wl_entity_type'); |
|
465 | 465 | $selected_entity_types[] = 'thing'; |
466 | - $selected_entity_types = array_unique( $selected_entity_types ); |
|
466 | + $selected_entity_types = array_unique($selected_entity_types); |
|
467 | 467 | |
468 | - return $this->get_custom_fields_by_term_slugs( $selected_entity_types ); |
|
468 | + return $this->get_custom_fields_by_term_slugs($selected_entity_types); |
|
469 | 469 | } |
470 | 470 | |
471 | 471 | /** |
@@ -479,9 +479,9 @@ discard block |
||
479 | 479 | * @return bool Return true if the post type can be used for entities, otherwise false. |
480 | 480 | * @since 3.15.0 |
481 | 481 | */ |
482 | - public static function is_valid_entity_post_type( $post_type ) { |
|
482 | + public static function is_valid_entity_post_type($post_type) { |
|
483 | 483 | |
484 | - return in_array( $post_type, Wordlift_Entity_Service::valid_entity_post_types(), true ); |
|
484 | + return in_array($post_type, Wordlift_Entity_Service::valid_entity_post_types(), true); |
|
485 | 485 | } |
486 | 486 | |
487 | 487 | /** |
@@ -489,16 +489,16 @@ discard block |
||
489 | 489 | * |
490 | 490 | * @return array |
491 | 491 | */ |
492 | - private function get_custom_fields_by_term_slugs( $term_slugs ) { |
|
492 | + private function get_custom_fields_by_term_slugs($term_slugs) { |
|
493 | 493 | $schema_service = Wordlift_Schema_Service::get_instance(); |
494 | 494 | |
495 | 495 | return array_reduce( |
496 | 496 | $term_slugs, |
497 | - function ( $carry, $item ) use ( $schema_service ) { |
|
497 | + function($carry, $item) use ($schema_service) { |
|
498 | 498 | |
499 | - $schema = $schema_service->get_schema( $item ); |
|
499 | + $schema = $schema_service->get_schema($item); |
|
500 | 500 | |
501 | - if ( ! isset( $schema['custom_fields'] ) ) { |
|
501 | + if ( ! isset($schema['custom_fields'])) { |
|
502 | 502 | return $carry; |
503 | 503 | } |
504 | 504 |
@@ -13,7 +13,7 @@ discard block |
||
13 | 13 | use Wordlift\Autocomplete\Autocomplete_Service; |
14 | 14 | |
15 | 15 | if ( ! defined( 'ABSPATH' ) ) { |
16 | - exit; |
|
16 | + exit; |
|
17 | 17 | } |
18 | 18 | |
19 | 19 | /** |
@@ -23,79 +23,79 @@ discard block |
||
23 | 23 | */ |
24 | 24 | class Wordlift_Autocomplete_Adapter { |
25 | 25 | |
26 | - /** |
|
27 | - * The {@link Autocomplete_Service} instance. |
|
28 | - * |
|
29 | - * @since 3.15.0 |
|
30 | - * @access private |
|
31 | - * @var Autocomplete_Service $configuration_service The {@link Autocomplete_Service} instance. |
|
32 | - */ |
|
33 | - private $autocomplete_service; |
|
34 | - |
|
35 | - /** |
|
36 | - * Wordlift_Autocomplete_Adapter constructor. |
|
37 | - * |
|
38 | - * @param Autocomplete_Service $autocomplete_service The {@link Autocomplete_Service} instance. |
|
39 | - * |
|
40 | - * @since 3.14.2 |
|
41 | - */ |
|
42 | - public function __construct( $autocomplete_service ) { |
|
43 | - $this->autocomplete_service = $autocomplete_service; |
|
44 | - } |
|
45 | - |
|
46 | - /** |
|
47 | - * Handle the autocomplete ajax request. |
|
48 | - * |
|
49 | - * @since 3.15.0 |
|
50 | - */ |
|
51 | - public function wl_autocomplete() { |
|
52 | - |
|
53 | - check_ajax_referer( 'wl_autocomplete' ); |
|
54 | - |
|
55 | - // Return error if the query param is empty. |
|
56 | - if ( ! empty( $_REQUEST['query'] ) ) { // Input var okay. |
|
57 | - $query = sanitize_text_field( wp_unslash( $_REQUEST['query'] ) ); // Input var okay. |
|
58 | - } else { |
|
59 | - wp_send_json_error( |
|
60 | - array( |
|
61 | - 'message' => __( 'The query param is empty.', 'wordlift' ), |
|
62 | - ) |
|
63 | - ); |
|
64 | - } |
|
65 | - |
|
66 | - // Get the exclude parameter. |
|
67 | - $exclude = ! empty( $_REQUEST['exclude'] ) |
|
68 | - ? sanitize_text_field( wp_unslash( $_REQUEST['exclude'] ) ) : ''; |
|
69 | - |
|
70 | - $scope = ! empty( $_REQUEST['scope'] ) |
|
71 | - ? sanitize_text_field( wp_unslash( $_REQUEST['scope'] ) ) : WL_AUTOCOMPLETE_SCOPE; |
|
72 | - |
|
73 | - /** |
|
74 | - * @since 3.26.1 |
|
75 | - * Providing a way for term pages to show and save local entities. |
|
76 | - */ |
|
77 | - $show_local_entities = false; |
|
78 | - |
|
79 | - if ( isset( $_REQUEST['show_local_entities'] ) |
|
80 | - && ! empty( $_REQUEST['show_local_entities'] ) ) { // Make request. |
|
81 | - $show_local_entities = filter_var( wp_unslash( $_REQUEST['show_local_entities'] ), FILTER_VALIDATE_BOOLEAN ); |
|
82 | - } |
|
83 | - |
|
84 | - // Add the filter to check if we need to show local entities or not. |
|
85 | - add_filter( |
|
86 | - 'wl_show_local_entities', |
|
87 | - // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable |
|
88 | - function ( $state ) use ( $show_local_entities ) { |
|
89 | - return $show_local_entities; |
|
90 | - } |
|
91 | - ); |
|
92 | - |
|
93 | - $results = $this->autocomplete_service->query( $query, $scope, $exclude ); |
|
94 | - |
|
95 | - // Clear any buffer. |
|
96 | - ob_clean(); |
|
97 | - |
|
98 | - wp_send_json_success( $results ); |
|
99 | - |
|
100 | - } |
|
26 | + /** |
|
27 | + * The {@link Autocomplete_Service} instance. |
|
28 | + * |
|
29 | + * @since 3.15.0 |
|
30 | + * @access private |
|
31 | + * @var Autocomplete_Service $configuration_service The {@link Autocomplete_Service} instance. |
|
32 | + */ |
|
33 | + private $autocomplete_service; |
|
34 | + |
|
35 | + /** |
|
36 | + * Wordlift_Autocomplete_Adapter constructor. |
|
37 | + * |
|
38 | + * @param Autocomplete_Service $autocomplete_service The {@link Autocomplete_Service} instance. |
|
39 | + * |
|
40 | + * @since 3.14.2 |
|
41 | + */ |
|
42 | + public function __construct( $autocomplete_service ) { |
|
43 | + $this->autocomplete_service = $autocomplete_service; |
|
44 | + } |
|
45 | + |
|
46 | + /** |
|
47 | + * Handle the autocomplete ajax request. |
|
48 | + * |
|
49 | + * @since 3.15.0 |
|
50 | + */ |
|
51 | + public function wl_autocomplete() { |
|
52 | + |
|
53 | + check_ajax_referer( 'wl_autocomplete' ); |
|
54 | + |
|
55 | + // Return error if the query param is empty. |
|
56 | + if ( ! empty( $_REQUEST['query'] ) ) { // Input var okay. |
|
57 | + $query = sanitize_text_field( wp_unslash( $_REQUEST['query'] ) ); // Input var okay. |
|
58 | + } else { |
|
59 | + wp_send_json_error( |
|
60 | + array( |
|
61 | + 'message' => __( 'The query param is empty.', 'wordlift' ), |
|
62 | + ) |
|
63 | + ); |
|
64 | + } |
|
65 | + |
|
66 | + // Get the exclude parameter. |
|
67 | + $exclude = ! empty( $_REQUEST['exclude'] ) |
|
68 | + ? sanitize_text_field( wp_unslash( $_REQUEST['exclude'] ) ) : ''; |
|
69 | + |
|
70 | + $scope = ! empty( $_REQUEST['scope'] ) |
|
71 | + ? sanitize_text_field( wp_unslash( $_REQUEST['scope'] ) ) : WL_AUTOCOMPLETE_SCOPE; |
|
72 | + |
|
73 | + /** |
|
74 | + * @since 3.26.1 |
|
75 | + * Providing a way for term pages to show and save local entities. |
|
76 | + */ |
|
77 | + $show_local_entities = false; |
|
78 | + |
|
79 | + if ( isset( $_REQUEST['show_local_entities'] ) |
|
80 | + && ! empty( $_REQUEST['show_local_entities'] ) ) { // Make request. |
|
81 | + $show_local_entities = filter_var( wp_unslash( $_REQUEST['show_local_entities'] ), FILTER_VALIDATE_BOOLEAN ); |
|
82 | + } |
|
83 | + |
|
84 | + // Add the filter to check if we need to show local entities or not. |
|
85 | + add_filter( |
|
86 | + 'wl_show_local_entities', |
|
87 | + // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable |
|
88 | + function ( $state ) use ( $show_local_entities ) { |
|
89 | + return $show_local_entities; |
|
90 | + } |
|
91 | + ); |
|
92 | + |
|
93 | + $results = $this->autocomplete_service->query( $query, $scope, $exclude ); |
|
94 | + |
|
95 | + // Clear any buffer. |
|
96 | + ob_clean(); |
|
97 | + |
|
98 | + wp_send_json_success( $results ); |
|
99 | + |
|
100 | + } |
|
101 | 101 | } |
@@ -12,7 +12,7 @@ discard block |
||
12 | 12 | |
13 | 13 | use Wordlift\Autocomplete\Autocomplete_Service; |
14 | 14 | |
15 | -if ( ! defined( 'ABSPATH' ) ) { |
|
15 | +if ( ! defined('ABSPATH')) { |
|
16 | 16 | exit; |
17 | 17 | } |
18 | 18 | |
@@ -39,7 +39,7 @@ discard block |
||
39 | 39 | * |
40 | 40 | * @since 3.14.2 |
41 | 41 | */ |
42 | - public function __construct( $autocomplete_service ) { |
|
42 | + public function __construct($autocomplete_service) { |
|
43 | 43 | $this->autocomplete_service = $autocomplete_service; |
44 | 44 | } |
45 | 45 | |
@@ -50,25 +50,25 @@ discard block |
||
50 | 50 | */ |
51 | 51 | public function wl_autocomplete() { |
52 | 52 | |
53 | - check_ajax_referer( 'wl_autocomplete' ); |
|
53 | + check_ajax_referer('wl_autocomplete'); |
|
54 | 54 | |
55 | 55 | // Return error if the query param is empty. |
56 | - if ( ! empty( $_REQUEST['query'] ) ) { // Input var okay. |
|
57 | - $query = sanitize_text_field( wp_unslash( $_REQUEST['query'] ) ); // Input var okay. |
|
56 | + if ( ! empty($_REQUEST['query'])) { // Input var okay. |
|
57 | + $query = sanitize_text_field(wp_unslash($_REQUEST['query'])); // Input var okay. |
|
58 | 58 | } else { |
59 | 59 | wp_send_json_error( |
60 | 60 | array( |
61 | - 'message' => __( 'The query param is empty.', 'wordlift' ), |
|
61 | + 'message' => __('The query param is empty.', 'wordlift'), |
|
62 | 62 | ) |
63 | 63 | ); |
64 | 64 | } |
65 | 65 | |
66 | 66 | // Get the exclude parameter. |
67 | - $exclude = ! empty( $_REQUEST['exclude'] ) |
|
68 | - ? sanitize_text_field( wp_unslash( $_REQUEST['exclude'] ) ) : ''; |
|
67 | + $exclude = ! empty($_REQUEST['exclude']) |
|
68 | + ? sanitize_text_field(wp_unslash($_REQUEST['exclude'])) : ''; |
|
69 | 69 | |
70 | - $scope = ! empty( $_REQUEST['scope'] ) |
|
71 | - ? sanitize_text_field( wp_unslash( $_REQUEST['scope'] ) ) : WL_AUTOCOMPLETE_SCOPE; |
|
70 | + $scope = ! empty($_REQUEST['scope']) |
|
71 | + ? sanitize_text_field(wp_unslash($_REQUEST['scope'])) : WL_AUTOCOMPLETE_SCOPE; |
|
72 | 72 | |
73 | 73 | /** |
74 | 74 | * @since 3.26.1 |
@@ -76,26 +76,26 @@ discard block |
||
76 | 76 | */ |
77 | 77 | $show_local_entities = false; |
78 | 78 | |
79 | - if ( isset( $_REQUEST['show_local_entities'] ) |
|
80 | - && ! empty( $_REQUEST['show_local_entities'] ) ) { // Make request. |
|
81 | - $show_local_entities = filter_var( wp_unslash( $_REQUEST['show_local_entities'] ), FILTER_VALIDATE_BOOLEAN ); |
|
79 | + if (isset($_REQUEST['show_local_entities']) |
|
80 | + && ! empty($_REQUEST['show_local_entities'])) { // Make request. |
|
81 | + $show_local_entities = filter_var(wp_unslash($_REQUEST['show_local_entities']), FILTER_VALIDATE_BOOLEAN); |
|
82 | 82 | } |
83 | 83 | |
84 | 84 | // Add the filter to check if we need to show local entities or not. |
85 | 85 | add_filter( |
86 | 86 | 'wl_show_local_entities', |
87 | 87 | // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable |
88 | - function ( $state ) use ( $show_local_entities ) { |
|
88 | + function($state) use ($show_local_entities) { |
|
89 | 89 | return $show_local_entities; |
90 | 90 | } |
91 | 91 | ); |
92 | 92 | |
93 | - $results = $this->autocomplete_service->query( $query, $scope, $exclude ); |
|
93 | + $results = $this->autocomplete_service->query($query, $scope, $exclude); |
|
94 | 94 | |
95 | 95 | // Clear any buffer. |
96 | 96 | ob_clean(); |
97 | 97 | |
98 | - wp_send_json_success( $results ); |
|
98 | + wp_send_json_success($results); |
|
99 | 99 | |
100 | 100 | } |
101 | 101 | } |