PluginProbe
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites / 3.1.1
BlockSpare – Gutenberg Blocks for News, Magazine, Blog & Business Websites v3.1.1
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 3.1.1, at inc/block-posts-config/class-post-rest-api.php

470 lines 13.3 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', $post->author),
224 'author_link'=>get_author_posts_url($post->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 preg_replace( '~^(\s*(?:&nbsp;)?)*~i', '', $excerpt );
302
303
304 if ( empty( $excerpt ) ) {
305
306 $excerpt = preg_replace(
307 array(
308 '/\<figcaption>.*\<\/figcaption>/',
309 '/\[caption.*\[\/caption\]/',
310 '`[[^]]*]`'
311 ),
312 '',
313 $post->post_content
314 );
315 }
316
317
318 // Trim the excerpt if necessary.
319 if ( isset( $length ) ) {
320 $excerpt = wp_trim_words(
321 $excerpt,
322 $length
323 );
324 }
325
326 return $excerpt;
327 }
328
329 protected function prepare_date_response( $date_gmt, $date = null ) {
330 // Use the date if passed.
331 if ( isset( $date ) ) {
332 return mysql2date( 'Y-m-d\TH:i:s', $date, false );
333 }
334
335 // Return null if $date_gmt is empty/zeros.
336 if ( '0000-00-00 00:00:00' === $date_gmt ) {
337 return null;
338 }
339
340 // Return the formatted datetime.
341 return mysql2date( 'Y-m-d\TH:i:s', $date_gmt, false );
342 }
343
344
345 public function get_query_params() {
346 $query_params = parent::get_collection_params();
347
348 $query_params[ self::PROP_TYPE ] = array(
349 'description' => __( 'Limit results to items of a specific post type.', 'blockspare' ),
350 'type' => 'string',
351 'sanitize_callback' => array( $this, 'sanitize_post_type_string' ),
352 'validate_callback' => array( $this, 'validate_post_type_string' ),
353 );
354
355 $query_params[ self::PROP_INCLUDE ] = array(
356 'description' => __( 'Include posts by ID.', 'blockspare' ),
357 'type' => 'array',
358 'validate_callback' => array( $this, 'validate_post_ids' ),
359 'sanitize_callback' => array( $this, 'sanitize_post_ids' ),
360 );
361 $query_params[ self::PROP_PER_PAGE ] = array(
362 'description' => __( 'Number of results to return.', 'blockspare' ),
363 'type' => 'number',
364 'sanitize_callback' => array( $this, 'sanitize_post_perpage' ),
365 'default' => 25,
366 );
367 $query_params[ self::PROP_QUERY ] = array(
368 'description' => __( 'Define Type of Query.', 'blockspare' ),
369 'type' => 'string',
370 );
371 $query_params[ self::PROP_ORDER ] = array(
372 'description' => __( 'Define Query Order.', 'blockspare' ),
373 'type' => 'string',
374 );
375 $query_params[ self::PROP_ORDER_BY ] = array(
376 'description' => __( 'Define Query Order By.', 'blockspare' ),
377 'type' => 'string',
378 );
379 $query_params[ self::PROP_ALLOW_STICKY ] = array(
380 'description' => __( 'Allow Sticky in Query.', 'blockspare' ),
381 'type' => 'boolean',
382 'sanitize_callback' => array( $this, 'sanitize_allow_sticky' ),
383 );
384 $query_params[ self::PROP_EXCLUDE ] = array(
385 'description' => __( 'Exclude Category.', 'blockspare' ),
386 'type' => 'string',
387 );
388 $query_params[ self::PROP_OFFSET ] = array(
389 'description' => __( 'Number of items to offset in query.', 'blockspare' ),
390 'type' => 'number',
391 'sanitize_callback' => array( $this, 'sanitize_results_page_number' ),
392 'default' => 0,
393 );
394 $query_params[ self::PROP_POST_ID ] = array(
395 'description' => __( 'The Current Post ID.', 'blockspare' ),
396 'type' => 'number',
397 );
398 $query_params[ self::PROP_CUSTOM_TAX ] = array(
399 'description' => __( 'Check if using a custom Taxonomy', 'blockspare' ),
400 'type' => 'boolean',
401 'sanitize_callback' => array( $this, 'sanitize_allow_sticky' ),
402 );
403 $query_params[ self::PROP_TAX_TYPE ] = array(
404 'description' => __( 'Define Query Order By.', 'blockspare' ),
405 'type' => 'string',
406 );
407 $query_params[ self::PROP_CATEGORY ] = array(
408 'description' => __( 'Include posts category.', 'blockspare' ),
409 'type' => 'string',
410 'sanitize_callback' => 'wp_parse_id_list',
411 );
412 $query_params[ self::PROP_TAGS ] = array(
413 'description' => __( 'Include posts tags.', 'blockspare' ),
414 'type' => 'string',
415 'sanitize_callback' => 'wp_parse_id_list',
416 );
417 return $query_params;
418 }
419
420 public function sanitize_post_ids( $ids ) {
421 return array_map( 'absint', $ids );
422 }
423 public function validate_post_ids( $ids ) {
424 return count( $ids ) > 0;
425 }
426 public function sanitize_post_perpage( $val ) {
427 return min( absint( $val ), 100 );
428 }
429 public function sanitize_allow_sticky( $val ) {
430 return $val ? 0 : 1;
431 }
432 public function sanitize_results_page_number( $val ) {
433 return absint( $val );
434 }
435 public function validate_post_type_string( $value ) {
436 $allowed_types = $this->get_allowed_post_types();
437 return in_array( $value, $allowed_types );
438 }
439
440 public function sanitize_post_type_string( $post_type, $request ) {
441 return sanitize_text_field( $post_type );
442 }
443
444 public function get_allowed_post_types() {
445 $allowed_types = array_values(
446 get_post_types(
447 array(
448 'show_in_rest' => true,
449 'public' => true,
450 )
451 )
452 );
453
454 $key = array_search( 'attachment', $allowed_types, true );
455
456 if ( false !== $key ) {
457 unset( $allowed_types[ $key ] );
458 }
459
460 /**
461 * Filter the allowed post types.
462 *
463 * Note that if you allow this for posts that are not otherwise public,
464 * this data will be accessible using this endpoint for any logged in user with the edit_post capability.
465 */
466 return apply_filters( 'aft_blocks_allowed_post_types', $allowed_types );
467 }
468
469 }
470 }