PluginProbe
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites / 2.5.3
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites v2.5.3
4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 2.6.1 All 38 releases
blockspare / inc / block-posts-config / class-post-rest-api.php

class-post-rest-api.php in BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites 2.5.3, at inc/block-posts-config/class-post-rest-api.php

466 lines 13.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Setup the Posts Block Rest Calls
4 *
5 * @since 2.0.0
6 * @package AFT Blocks
7 */
8
9
10 /**
11 * Class to setup new rest calls.
12 */
13 if(!class_exists('Aft_Post_Rest_Controller')){
14 class Aft_Post_Rest_Controller extends WP_REST_Controller {
15 /**
16 * Type property name.
17 */
18 const PROP_TYPE = 'type';
19
20 /**
21 * Type property name.
22 */
23 const PROP_TYPE_ARRAY = 'type_array';
24
25 /**
26 * Query property name.
27 */
28 const PROP_QUERY = 'query';
29 /**
30 * Query property name.
31 */
32 const PROP_MULTIPLE = 'multiple';
33
34 /**
35 * Query property name.
36 */
37 const PROP_ORDER_BY = 'order_by';
38
39 /**
40 * Query property name.
41 */
42 const PROP_ORDER = 'order';
43
44 /**
45 * Query property name.
46 */
47 const PROP_ALLOW_STICKY = 'allow_sticky';
48
49 /**
50 * Query property name.
51 */
52 const PROP_OFFSET = 'offset';
53
54 /**
55 * Query property name.
56 */
57 const PROP_TAX = 'tax';
58
59 /**
60 * Query property name.
61 */
62 const PROP_EXCLUDE = 'exclude';
63
64 /**
65 * Query property name.
66 */
67 const PROP_CUSTOM_TAX = 'custom_tax';
68 /**
69 * Query property name.
70 */
71 const PROP_TAGS = 'tags';
72 /**
73 * Query property name.
74 */
75 const PROP_CATEGORY = 'category';
76
77 /**
78 * Query property name.
79 */
80 const PROP_TAX_TYPE = 'tax_type';
81
82 /**
83 * Search property name.
84 */
85 const PROP_SEARCH = 'search';
86
87 /**
88 * Include property name.
89 */
90 const PROP_INCLUDE = 'include';
91
92 /**
93 * Per page property name.
94 */
95 const PROP_PER_PAGE = 'per_page';
96
97 /**
98 * Per page property name.
99 */
100 const PROP_POST_ID = 'post_id';
101
102 /**
103 * Page property name.
104 */
105 const PROP_PAGE = 'page';
106
107 /**
108 * Constructor.
109 */
110 public function __construct() {
111 $this->namespace = 'aft/v1';
112 $this->query_base = 'post-query';
113 }
114
115 /**
116 * Registers the routes for the objects of the controller.
117 *
118 * @see register_rest_route()
119 */
120 public function register_routes() {
121
122 register_rest_route(
123 $this->namespace,
124 '/' . $this->query_base,
125 array(
126 array(
127 'methods' => WP_REST_Server::READABLE,
128 'callback' => array( $this, 'get_query_items' ),
129 'permission_callback' => array( $this, 'get_items_permission_check' ),
130 'args' => $this->get_query_params(),
131 ),
132 )
133 );
134 }
135 public function get_items_permission_check( $request ) {
136 return current_user_can( 'edit_posts' );
137 }
138 public function get_query_items( $request ) {
139
140 $prop_type = $request->get_param( self::PROP_TYPE );
141 $query_type = $request->get_param( self::PROP_QUERY );
142 $tax_type = $request->get_param( self::PROP_TAX_TYPE );
143
144 $categories = ( $request->get_param( self::PROP_CATEGORY ) ? wp_parse_list( $request->get_param( self::PROP_CATEGORY ) ) : array() );
145 $tags = ( $request->get_param( self::PROP_TAGS ) ? wp_parse_list( $request->get_param( self::PROP_TAGS ) ) : array() );
146 if ( empty( $query_type ) ) {
147 return array();
148 }
149
150 $query_args = array(
151 'post_type' => $prop_type,
152 );
153 if ( 'individual' === $query_type ) {
154 $query_args['post__in'] = $request->get_param( self::PROP_INCLUDE );
155 $query_args['orderby'] = 'post__in';
156 $query_args['posts_per_page'] = -1;
157 $query_args['ignore_sticky_posts'] = 1;
158 } else {
159 $query_args['posts_per_page'] = $request->get_param( self::PROP_PER_PAGE );
160 $query_args['tax_query'] = array();
161 $query_args['orderby'] = $request->get_param( self::PROP_ORDER_BY );
162 $query_args['order'] = $request->get_param( self::PROP_ORDER );
163 $query_args['offset'] = $request->get_param( self::PROP_OFFSET );
164
165 $query_args['post_status'] = 'publish';
166 $query_args['ignore_sticky_posts'] = $request->get_param( self::PROP_ALLOW_STICKY );
167 $current_post_id = $request->get_param( self::PROP_POST_ID );
168 if ( ! empty( $current_post_id ) ) {
169 $query_args['post__not_in'] = array( $current_post_id );
170 }
171 if ( 'post' !== $prop_type || $request->get_param( self::PROP_CUSTOM_TAX ) ) {
172 if ( $tax_type ) {
173 if(!empty($categories)){
174 $query_args['tax_query'][] = array(
175 'taxonomy' => ( isset( $tax_type ) ) ? $tax_type : 'category',
176 'field' => 'id',
177 'terms' => (isset($categories))?$categories:'',
178 'operator' => ( isset( $exclude ) && 'exclude' === $exclude ? 'NOT IN' : 'IN' ),
179 );
180 }
181 }
182 } else {
183 $tags = ( $request->get_param( self::PROP_TAGS ) ? wp_parse_list( $request->get_param( self::PROP_TAGS ) ) : array() );
184
185 $query_args['category__in'] = $categories;
186 $query_args['tag__in'] = $tags;
187
188 }
189 }
190 $query = new WP_Query( $query_args );
191 $posts = array();
192
193 foreach ( $query->posts as $post ) {
194 $posts[] = $this->prepare_query_item_for_response( $post, $request,$tax_type );
195 }
196
197 return rest_ensure_response( $posts );
198 }
199
200 public function prepare_query_item_for_response( $post, $request,$tax_type ) {
201 $excerpt = $this->blockspare_api_excerpt($post,$length=15);
202 $new_excerpt = apply_filters( 'the_excerpt', $excerpt );
203 $data = array(
204 'id' => $post->ID,
205 'date' => $this->prepare_date_response( $post->post_date_gmt, $post->post_date ),
206 'date_gmt' => $this->prepare_date_response( $post->post_date_gmt ),
207 'modified' => $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified ),
208 'modified_gmt' => $this->prepare_date_response( $post->post_modified_gmt ),
209 'title' => array(
210 'raw' => $post->post_title,
211 'rendered' => get_the_title( $post->ID ),
212 ),
213 'excerpt' => array(
214 'raw' => $post->post_excerpt,
215 'rendered' => get_the_excerpt( $post->ID ),
216 ),
217 'data_content'=>wp_kses_post($excerpt),
218 'type' => $post->post_type,
219 'slug' => $post->post_name,
220 'status' => $post->post_status,
221 'link' => get_permalink( $post->ID ),
222 'author' => absint( $post->post_author ),
223 'display_name'=> get_the_author_meta('display_name', $object['author']),
224 'author_link'=>get_author_posts_url($object['author']),
225 'featured_media' => get_post_thumbnail_id( $post->ID ),
226 );
227
228 $attachment_id = get_post_thumbnail_id( $post->ID );
229
230 $image= wp_get_attachment_image_src(
231 get_post_thumbnail_id( $post ),
232 'full',
233 false
234 );
235 $sizes = get_intermediate_image_sizes();
236
237 $imageSizes = array(
238 'full' => is_array($image) ? $image : '',
239 );
240
241 foreach ($sizes as $size) {
242 $imageSizes[$size] = is_array($image) ? wp_get_attachment_image_src($attachment_id, $size, false) : '';
243 }
244
245 $data['featured_image_src_large'] = $imageSizes;
246
247 //$author_data = array();
248 if ( post_type_supports( $post->post_type, 'author' ) ) {
249 $blockspare = new BlocksapreMultiAuthorForBackend();
250 $data['author_info'] = $blockspare->blockspare_by_author($post);
251 }
252 if ( 'post' != $post->post_type || 'comments' != $post->post_type || 'author' != $post->post_type ) {
253 $blockspare = new BlocksapreMultiAuthorForBackend();
254
255 $data['author_info'] = $blockspare->blockspare_by_author($post);
256
257 }
258 //$data['author_info'] = $author_data;
259 if ( post_type_supports( $post->post_type, 'comments' ) ) {
260 $comments_count = wp_count_comments( $post->ID );
261 $data['comment_count'] = $comments_count->total_comments;
262 }
263 if ( 'post' === $post->post_type ) {
264 $data['category_info'] = get_the_category( $post->ID );
265 $data['tag_info'] = get_the_tags( $post->ID );
266 }
267 $taxonomies = get_object_taxonomies( $post->post_type, 'objects' );
268 $taxs = array();
269 $term_items = array();
270 foreach ( $taxonomies as $term_slug => $term ) {
271 if ( ! $term->public || ! $term->show_ui ) {
272 continue;
273 }
274 $terms = get_the_terms( $post->ID, $term_slug );
275
276 if ( ! empty( $terms ) ) {
277 foreach ( $terms as $term_key => $term_item ) {
278 $term_items[] = array(
279 'value' => $term_item->term_id,
280 'label' => $term_item->name,
281 );
282 }
283
284 }
285 }
286
287 $data['taxonomy_info'] = json_encode($term_items);
288
289 return $data;
290 }
291
292 protected function blockspare_api_excerpt($post,$length=''){
293
294 $excerpt = get_post_field(
295 'post_excerpt',
296 $post->post_id,
297 'display'
298 );
299
300
301 if ( empty( $excerpt ) ) {
302
303 $excerpt = preg_replace(
304 array(
305 '/\<figcaption>.*\<\/figcaption>/',
306 '/\[caption.*\[\/caption\]/',
307 ),
308 '',
309 $post->post_content
310 );
311 }
312
313
314 // Trim the excerpt if necessary.
315 if ( isset( $length ) ) {
316 $excerpt = wp_trim_words(
317 $excerpt,
318 $length
319 );
320 }
321
322 return $excerpt;
323 }
324
325 protected function prepare_date_response( $date_gmt, $date = null ) {
326 // Use the date if passed.
327 if ( isset( $date ) ) {
328 return mysql2date( 'Y-m-d\TH:i:s', $date, false );
329 }
330
331 // Return null if $date_gmt is empty/zeros.
332 if ( '0000-00-00 00:00:00' === $date_gmt ) {
333 return null;
334 }
335
336 // Return the formatted datetime.
337 return mysql2date( 'Y-m-d\TH:i:s', $date_gmt, false );
338 }
339
340
341 public function get_query_params() {
342 $query_params = parent::get_collection_params();
343
344 $query_params[ self::PROP_TYPE ] = array(
345 'description' => __( 'Limit results to items of a specific post type.', 'blockspare' ),
346 'type' => 'string',
347 'sanitize_callback' => array( $this, 'sanitize_post_type_string' ),
348 'validate_callback' => array( $this, 'validate_post_type_string' ),
349 );
350
351 $query_params[ self::PROP_INCLUDE ] = array(
352 'description' => __( 'Include posts by ID.', 'blockspare' ),
353 'type' => 'array',
354 'validate_callback' => array( $this, 'validate_post_ids' ),
355 'sanitize_callback' => array( $this, 'sanitize_post_ids' ),
356 );
357 $query_params[ self::PROP_PER_PAGE ] = array(
358 'description' => __( 'Number of results to return.', 'blockspare' ),
359 'type' => 'number',
360 'sanitize_callback' => array( $this, 'sanitize_post_perpage' ),
361 'default' => 25,
362 );
363 $query_params[ self::PROP_QUERY ] = array(
364 'description' => __( 'Define Type of Query.', 'blockspare' ),
365 'type' => 'string',
366 );
367 $query_params[ self::PROP_ORDER ] = array(
368 'description' => __( 'Define Query Order.', 'blockspare' ),
369 'type' => 'string',
370 );
371 $query_params[ self::PROP_ORDER_BY ] = array(
372 'description' => __( 'Define Query Order By.', 'blockspare' ),
373 'type' => 'string',
374 );
375 $query_params[ self::PROP_ALLOW_STICKY ] = array(
376 'description' => __( 'Allow Sticky in Query.', 'blockspare' ),
377 'type' => 'boolean',
378 'sanitize_callback' => array( $this, 'sanitize_allow_sticky' ),
379 );
380 $query_params[ self::PROP_EXCLUDE ] = array(
381 'description' => __( 'Exclude Category.', 'blockspare' ),
382 'type' => 'string',
383 );
384 $query_params[ self::PROP_OFFSET ] = array(
385 'description' => __( 'Number of items to offset in query.', 'blockspare' ),
386 'type' => 'number',
387 'sanitize_callback' => array( $this, 'sanitize_results_page_number' ),
388 'default' => 0,
389 );
390 $query_params[ self::PROP_POST_ID ] = array(
391 'description' => __( 'The Current Post ID.', 'blockspare' ),
392 'type' => 'number',
393 );
394 $query_params[ self::PROP_CUSTOM_TAX ] = array(
395 'description' => __( 'Check if using a custom Taxonomy', 'blockspare' ),
396 'type' => 'boolean',
397 'sanitize_callback' => array( $this, 'sanitize_allow_sticky' ),
398 );
399 $query_params[ self::PROP_TAX_TYPE ] = array(
400 'description' => __( 'Define Query Order By.', 'blockspare' ),
401 'type' => 'string',
402 );
403 $query_params[ self::PROP_CATEGORY ] = array(
404 'description' => __( 'Include posts category.', 'blockspare' ),
405 'type' => 'string',
406 'sanitize_callback' => 'wp_parse_id_list',
407 );
408 $query_params[ self::PROP_TAGS ] = array(
409 'description' => __( 'Include posts tags.', 'blockspare' ),
410 'type' => 'string',
411 'sanitize_callback' => 'wp_parse_id_list',
412 );
413 return $query_params;
414 }
415
416 public function sanitize_post_ids( $ids ) {
417 return array_map( 'absint', $ids );
418 }
419 public function validate_post_ids( $ids ) {
420 return count( $ids ) > 0;
421 }
422 public function sanitize_post_perpage( $val ) {
423 return min( absint( $val ), 100 );
424 }
425 public function sanitize_allow_sticky( $val ) {
426 return $val ? 0 : 1;
427 }
428 public function sanitize_results_page_number( $val ) {
429 return absint( $val );
430 }
431 public function validate_post_type_string( $value ) {
432 $allowed_types = $this->get_allowed_post_types();
433 return in_array( $value, $allowed_types );
434 }
435
436 public function sanitize_post_type_string( $post_type, $request ) {
437 return sanitize_text_field( $post_type );
438 }
439
440 public function get_allowed_post_types() {
441 $allowed_types = array_values(
442 get_post_types(
443 array(
444 'show_in_rest' => true,
445 'public' => true,
446 )
447 )
448 );
449
450 $key = array_search( 'attachment', $allowed_types, true );
451
452 if ( false !== $key ) {
453 unset( $allowed_types[ $key ] );
454 }
455
456 /**
457 * Filter the allowed post types.
458 *
459 * Note that if you allow this for posts that are not otherwise public,
460 * this data will be accessible using this endpoint for any logged in user with the edit_post capability.
461 */
462 return apply_filters( 'aft_blocks_allowed_post_types', $allowed_types );
463 }
464
465 }
466 }