PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.2.3
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.2.3
4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.5.2 All 199 releases
betterdocs / includes / Core / FAQBuilder.php

FAQBuilder.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.2.3, at includes/Core/FAQBuilder.php

728 lines 20.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPDeveloper\BetterDocs\Core;
4
5 use WP_Error;
6 use WP_Query;
7 use WPDeveloper\BetterDocs\Utils\Base;
8 use WPDeveloper\BetterDocs\Utils\Helper;
9
10 class FAQBuilder extends Base {
11 /**
12 * REST API namespace
13 * @var string
14 */
15 private $namespace = 'betterdocs';
16 public $post_type = 'betterdocs_faq';
17 public $category = 'betterdocs_faq_category';
18
19 /**
20 *
21 * Initialize the class and start calling our hooks and filters
22 *
23 * @since 1.0.0
24 *
25 */
26 public function __construct() {
27 // assign default admin capabilities for docs, doc terms, doc tags, knowledge base
28 add_action( 'init', [ $this, 'register_post' ] );
29 // fires after a new betterdocs_faq_category is created
30 add_action( 'created_betterdocs_faq_category', [ $this, 'action_created_betterdocs_faq_category' ], 10, 2 );
31 add_action( 'rest_api_init', [ $this, 'register_api_endpoint' ] );
32 add_action( 'rest_betterdocs_faq_category_query', [ $this, 'faq_category_orderby_meta' ], 10, 2 );
33 }
34
35 public function output() {
36 betterdocs()->views->get( 'admin/faq-builder' );
37 }
38
39 /**
40 *
41 * Register post type and taxonomies
42 *
43 * @since 1.0.0
44 *
45 */
46 public function register_post() {
47 /**
48 * Register category taxonomy
49 */
50 $category_labels = [
51 'name' => __( 'FAQ Categories', 'betterdocs' ),
52 'singular_name' => __( 'FAQ Category', 'betterdocs' ),
53 'all_items' => __( 'FAQ Categories', 'betterdocs' ),
54 'parent_item' => __( 'Parent FAQ Category', 'betterdocs' ),
55 'parent_item_colon' => __( 'Parent FAQ Category:', 'betterdocs' ),
56 'edit_item' => __( 'Edit Category', 'betterdocs' ),
57 'update_item' => __( 'Update Category', 'betterdocs' ),
58 'add_new_item' => __( 'Add New FAQ Category', 'betterdocs' ),
59 'new_item_name' => __( 'New FAQ Category Name', 'betterdocs' ),
60 'menu_name' => __( 'Categories', 'betterdocs' )
61 ];
62
63 $category_args = [
64 'hierarchical' => true,
65 'public' => false,
66 'labels' => $category_labels,
67 'show_ui' => true,
68 'show_admin_column' => true,
69 'query_var' => true,
70 'show_in_rest' => true,
71 'has_archive' => false,
72 'rewrite' => false,
73 'capabilities' => [
74 'manage_terms' => 'manage_doc_terms',
75 'edit_terms' => 'edit_doc_terms',
76 'delete_terms' => 'delete_doc_terms',
77 'assign_terms' => 'edit_docs'
78 ]
79 ];
80
81 register_taxonomy( $this->category, [ $this->post_type ], $category_args );
82 register_term_meta( $this->category, 'order', [ 'show_in_rest' => true ] );
83 register_term_meta( $this->category, 'status', [ 'show_in_rest' => true ] );
84 register_term_meta( $this->category, '_betterdocs_faq_order', [ 'show_in_rest' => true ] );
85 register_term_meta( $this->category, 'faq_group_icon', [ 'show_in_rest' => true ]);
86
87 /**
88 * Register post type
89 */
90 $labels = [
91 'name' => __( 'BetterDocs FAQ', 'betterdocs' ),
92 'singular_name' => __( 'BetterDocs FAQ', 'betterdocs' ),
93 'menu_name' => __( 'FAQ', 'betterdocs' ),
94 'name_admin_bar' => __( 'FAQ', 'betterdocs' ),
95 'add_new' => __( 'Add New', 'betterdocs' ),
96 'add_new_item' => __( 'Add New FAQ', 'betterdocs' ),
97 'new_item' => __( 'New FAQ', 'betterdocs' ),
98 'edit_item' => __( 'Edit FAQ', 'betterdocs' ),
99 'view_item' => __( 'View FAQ', 'betterdocs' ),
100 'all_items' => __( 'All FAQ', 'betterdocs' ),
101 'search_items' => __( 'Search FAQ', 'betterdocs' ),
102 'parent_item_colorn' => null,
103 'not_found' => __( 'No FAQ found', 'betterdocs' ),
104 'not_found_in_trash' => __( 'No FAQ found in trash', 'betterdocs' )
105 ];
106
107 $args = [
108 'labels' => $labels,
109 'description' => __( 'Add new faq from here', 'betterdocs' ),
110 'public' => false,
111 'public_queryable' => true,
112 'exclude_from_search' => false,
113 'show_ui' => true,
114 'show_in_menu' => false,
115 'query_var' => true,
116 'capability_type' => [ 'doc', 'docs' ],
117 'hierarchical' => true,
118 'map_meta_cap' => true,
119 'has_archive' => false,
120 'rewrite' => false,
121 'show_in_rest' => true,
122 'menu_icon' => betterdocs()->assets->icon( 'betterdocs-icon-white.svg' ),
123 'supports' => [ 'title', 'editor', 'thumbnail', 'excerpt', 'author', 'revisions', 'custom-fields', 'comments' ]
124 ];
125
126 register_post_type( $this->post_type, $args );
127 register_post_meta( $this->post_type, 'faq_open_by_default', [ 'show_in_rest' => true, 'single' => true ] );
128 }
129
130 /**
131 * Default the taxonomy's terms' order if it's not set.
132 *
133 * @param string $tax_slug The taxonomy's slug.
134 */
135 public function action_created_betterdocs_faq_category( $term_id ) {
136 $order = $this->get_max_taxonomy_order( 'betterdocs_faq_category' );
137 update_term_meta( $term_id, 'order', $order++ );
138 update_term_meta( $term_id, 'status', 1 );
139 }
140
141 /**
142 * Default the taxonomy's terms' order if it's not set.
143 *
144 * @param string $tax_slug The taxonomy's slug.
145 */
146 public function default_term_order( $tax_slug ) {
147 $terms = get_terms(
148 [
149 'taxonomy' => $tax_slug,
150 'hide_empty' => false,
151 ]
152 );
153 $order = $this->get_max_taxonomy_order( $tax_slug );
154
155 foreach ( $terms as $term ) {
156 if ( ! get_term_meta( $term->term_id, 'order', true ) ) {
157 update_term_meta( $term->term_id, 'order', $order );
158 ++$order;
159 }
160 }
161 }
162
163 /**
164 * Get the maximum order for this taxonomy. This will be applied to terms that don't have a tax position.
165 */
166 private function get_max_taxonomy_order( $tax_slug ) {
167 global $wpdb;
168 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedSimplePlaceholder
169 $max_term_order = $wpdb->get_col(
170 $wpdb->prepare(
171 "SELECT MAX( CAST( tm.meta_value AS UNSIGNED ) )
172 FROM $wpdb->terms t
173 JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id AND tt.taxonomy = '%s'
174 JOIN $wpdb->termmeta tm ON tm.term_id = t.term_id WHERE tm.meta_key = 'order'",
175 $tax_slug
176 )
177 );
178
179 $max_term_order = is_array( $max_term_order ) ? current( $max_term_order ) : 0;
180
181 return (int) $max_term_order === 0 || empty( $max_term_order ) ? 1 : (int) $max_term_order + 1;
182 }
183
184 /**
185 * Re-Order the taxonomies based on the order value.
186 *
187 * @param array $pieces Array of SQL query clauses.
188 * @param array $taxonomies Array of taxonomy names.
189 * @param array $args Array of term query args.
190 */
191 public function set_tax_order( $pieces, $taxonomies, $args ) {
192 foreach ( $taxonomies as $taxonomy ) {
193 global $wpdb;
194
195 if ( $taxonomy === 'betterdocs_faq_category' ) {
196 $join_statement = " LEFT JOIN $wpdb->termmeta AS term_meta ON t.term_id = term_meta.term_id AND term_meta.meta_key = 'order'";
197
198 if ( ! $this->does_substring_exist( $pieces['join'], $join_statement ) ) {
199 $pieces['join'] .= $join_statement;
200 }
201
202 $pieces['orderby'] = 'ORDER BY CAST( term_meta.meta_value AS UNSIGNED )';
203 }
204 }
205
206 return $pieces;
207 }
208
209 /**
210 * Order the taxonomies on the front end.
211 */
212 public function front_end_order_terms() {
213 if ( ! is_admin() ) {
214 add_filter( 'terms_clauses', [ $this, 'set_tax_order' ], 10, 3 );
215 }
216 }
217
218 /**
219 * Check if a substring exists inside a string.
220 *
221 * @param string $string The main string (haystack) we're searching in.
222 * @param string $substring The substring we're searching for.
223 *
224 * @return bool True if substring exists, else false.
225 */
226 protected function does_substring_exist( $string, $substring ) {
227 return strstr( $string, $substring ) !== false;
228 }
229
230 public function register_api_endpoint() {
231 register_rest_route(
232 $this->namespace,
233 '/faq/sample_data',
234 [
235 'methods' => [ 'POST' ],
236 'callback' => [ $this, 'create_faq_sample' ],
237 'permission_callback' => function () {
238 return current_user_can( 'edit_others_posts' );
239 }
240 ]
241 );
242
243 register_rest_route(
244 $this->namespace,
245 '/faq/posts/(?P<type>\S+)',
246 [
247 'methods' => [ 'GET' ],
248 'callback' => [ $this, 'fetch_faq_posts' ],
249 'permission_callback' => '__return_true'
250 ]
251 );
252
253 register_rest_route(
254 $this->namespace,
255 '/faq/create_category',
256 [
257 'methods' => [ 'POST' ],
258 'callback' => [ $this, 'create_faq_category' ],
259 'permission_callback' => function () {
260 return current_user_can( 'edit_others_posts' );
261 }
262 ]
263 );
264
265 register_rest_route(
266 $this->namespace,
267 '/faq/update_category',
268 [
269 'methods' => [ 'POST' ],
270 'callback' => [ $this, 'update_faq_category' ],
271 'permission_callback' => function () {
272 return current_user_can( 'edit_others_posts' );
273 }
274 ]
275 );
276
277 register_rest_route(
278 $this->namespace,
279 '/faq/delete_category',
280 [
281 'methods' => [ 'POST' ],
282 'callback' => [ $this, 'delete_faq_category' ],
283 'permission_callback' => function () {
284 return current_user_can( 'edit_others_posts' );
285 }
286 ]
287 );
288
289 register_rest_route(
290 $this->namespace,
291 '/faq/create_post',
292 [
293 'methods' => [ 'POST' ],
294 'callback' => [ $this, 'create_betterdocs_faq' ],
295 'permission_callback' => function () {
296 return current_user_can( 'edit_others_posts' );
297 }
298 ]
299 );
300
301 register_rest_route(
302 $this->namespace,
303 '/faq/update_post',
304 [
305 'methods' => [ 'POST' ],
306 'callback' => [ $this, 'update_betterdocs_faq' ],
307 'permission_callback' => function () {
308 return current_user_can( 'edit_others_posts' );
309 }
310 ]
311 );
312
313 register_rest_route(
314 $this->namespace,
315 '/faq/delete_post',
316 [
317 'methods' => [ 'POST' ],
318 'callback' => [ $this, 'delete_betterdocs_faq' ],
319 'permission_callback' => function () {
320 return current_user_can( 'edit_others_posts' );
321 }
322 ]
323 );
324
325 register_rest_route(
326 $this->namespace,
327 '/faq/category_status',
328 [
329 'methods' => [ 'POST' ],
330 'callback' => [ $this, 'update_category_status' ],
331 'permission_callback' => function () {
332 return current_user_can( 'edit_others_posts' );
333 }
334 ]
335 );
336
337 register_rest_route(
338 $this->namespace,
339 '/faq/category_order',
340 [
341 'methods' => [ 'POST' ],
342 'callback' => [ $this, 'update_faq_category_order' ],
343 'permission_callback' => function () {
344 return current_user_can( 'edit_others_posts' );
345 }
346 ]
347 );
348
349 register_rest_route(
350 $this->namespace,
351 '/faq/update_order_by_category',
352 [
353 'methods' => [ 'POST' ],
354 'callback' => [ $this, 'update_faq_order_by_category' ],
355 'permission_callback' => function () {
356 return current_user_can( 'edit_others_posts' );
357 }
358 ]
359 );
360
361 register_rest_route(
362 $this->namespace,
363 '/faq/uncategorised',
364 [
365 'methods' => [ 'GET' ],
366 'callback' => [ $this, 'get_uncategorised_faq' ],
367 'permission_callback' => '__return_true'
368 ]
369 );
370
371 register_rest_route(
372 $this->namespace,
373 '/faq/category_search',
374 [
375 'methods' => [ 'GET' ],
376 'callback' => [ $this, 'category_search' ],
377 'permission_callback' => '__return_true',
378 'args' => [
379 'title' => [
380 'type' => 'string',
381 'required' => true
382 ]
383 ]
384 ]
385 );
386 }
387
388 public function create_faq_sample( $params ) {
389 $sample_data = json_decode( $params->get_param( 'sample_data' ), true );
390 foreach ( $sample_data as $key => $value ) {
391 $insert_term = wp_insert_term(
392 $key,
393 'betterdocs_faq_category'
394 );
395 if ( $insert_term ) {
396 foreach ( $value['posts'] as $key => $value ) {
397 $this->insert_betterdocs_faq( $value['post_title'], $value['post_content'], $insert_term['term_id'] );
398 }
399 }
400 }
401 return true;
402 }
403
404 public function create_faq_category( $params ) {
405 $title = $params->get_param( 'title' );
406 $description = $params->get_param( 'description' );
407 $description = ( $description !== 'undefined' ) ? $description : '';
408 $slug = $params->get_param( 'slug' );
409 $group_icon_url = $params->get_param('group_icon_url');
410 return $this->insert_betterdocs_faq_category( $title, $description, $group_icon_url, $slug );
411 }
412
413 public function update_faq_category( $params ) {
414 $term_id = $params->get_param( 'term_id' );
415 $title = $params->get_param( 'title' );
416 $description = $params->get_param( 'description' );
417 $group_icon_url = $params->get_param('group_icon_url');
418 $description = ( $description !== 'undefined' ) ? $description : '';
419 $slug = $params->get_param( 'slug' );
420 $update = wp_update_term(
421 $term_id,
422 'betterdocs_faq_category',
423 [
424 'name' => $title,
425 'slug' => $slug,
426 'description' => $description
427 ]
428 );
429
430 if ( is_wp_error( $update ) ) {
431 return $update;
432 } else {
433 $term_id = isset( $update['term_id'] ) ? $update['term_id'] : 0;
434 if( $term_id != 0 ) {
435 $previous_icon_url = get_term_meta($term_id, 'faq_group_icon', true);
436 update_term_meta($term_id, 'faq_group_icon', $group_icon_url, $previous_icon_url);
437 }
438 return true;
439 }
440 }
441
442 public function delete_faq_category( $params ) {
443 $term_id = $params->get_param( 'term_id' );
444 $delete_all_docs = $params->get_param('with_all_post');
445
446 if ( $delete_all_docs ) {
447 Helper::delete_specific_faq_posts_by_faq_category( $term_id );
448 }
449
450 $delete = wp_delete_term( $term_id, 'betterdocs_faq_category' );
451
452 if ( is_wp_error( $delete ) ) {
453 return $delete;
454 } else {
455 return true;
456 }
457 }
458
459 public function insert_betterdocs_faq_category( $title, $description, $icon_url, $slug = '' ) {
460 $insert_term = wp_insert_term(
461 $title,
462 'betterdocs_faq_category',
463 [
464 'slug' => $slug,
465 'description' => $description
466 ]
467 );
468
469 if ( is_wp_error( $insert_term ) ) {
470 return $insert_term;
471 } else {
472 $term_id = isset( $insert_term['term_id'] ) ? $insert_term['term_id'] : 0;
473 if( $term_id != 0 ) {
474 update_term_meta($term_id, 'faq_group_icon', $icon_url);
475 }
476 return true;
477 }
478 }
479
480 public function update_faq_category_order( $params ) {
481 $faq_category_order = $params->get_param( 'faq_category_order' );
482 $faq_category_order = json_decode( $faq_category_order, true );
483
484 foreach ( $faq_category_order as $order_data ) {
485 if ( (int) $order_data['current_position'] != (int) $order_data['updated_position'] ) {
486 update_term_meta( $order_data['id'], 'order', ( (int) $order_data['updated_position'] ) );
487 }
488 }
489 return true;
490 }
491
492 public function insert_betterdocs_faq( $post_title, $post_content, $term_id ) {
493 $post = wp_insert_post(
494 [
495 'post_type' => 'betterdocs_faq',
496 'post_title' => wp_strip_all_tags( $post_title ),
497 'post_content' => $post_content,
498 'post_status' => 'publish'
499 ]
500 );
501
502 if ( $term_id ) {
503 $set_terms = wp_set_object_terms( $post, $term_id, 'betterdocs_faq_category' );
504 if ( is_wp_error( $set_terms ) ) {
505 return $set_terms;
506 } else {
507 return $this->update_faq_order_on_insert( $term_id, $post );
508 }
509 } else {
510 return $post;
511 }
512 }
513
514 public function update_faq_order_on_insert( $term_id, $post ) {
515 $term_meta = get_term_meta( $term_id, '_betterdocs_faq_order' );
516 if ( ! empty( $term_meta ) ) {
517 $term_meta_arr = explode( ',', $term_meta[0] );
518 if ( ! in_array( $post, $term_meta_arr ) ) {
519 array_unshift( $term_meta_arr, $post );
520 $docs_ordering_data = filter_var_array( wp_unslash( $term_meta_arr ), FILTER_SANITIZE_NUMBER_INT );
521 return update_term_meta( $term_id, '_betterdocs_faq_order', implode( ',', $docs_ordering_data ) );
522 }
523 } else {
524 return update_term_meta( $term_id, '_betterdocs_faq_order', $post );
525 }
526 }
527
528 /**
529 * Update _betterdocs_faq_order meta when new post created
530 */
531
532 public function update_faq_order_by_category( $params ) {
533 $term_id = $params->get_param( 'term_id' );
534 $posts = $params->get_param( 'posts' );
535 return update_term_meta( $term_id, '_betterdocs_faq_order', $posts );
536 }
537
538 public function create_betterdocs_faq( $params ) {
539 $post_title = $params->get_param( 'post_title' );
540 $post_content = $params->get_param( 'post_content' );
541 $term_id = $params->get_param( 'term_id' );
542 return $this->insert_betterdocs_faq( $post_title, $post_content, $term_id );
543 }
544
545 public function update_betterdocs_faq( $params ) {
546 $post_id = $params->get_param( 'post_id' );
547 $post_title = $params->get_param( 'post_title' );
548 $post_content = $params->get_param( 'post_content' );
549 $status = $params->get_param( 'status' );
550 $term_id = $params->get_param( 'term_id' );
551 if ( $status ) {
552 $data = [
553 'post_type' => 'betterdocs_faq',
554 'ID' => $post_id,
555 'status' => $status
556 ];
557 } else {
558 $data = [
559 'post_type' => 'betterdocs_faq',
560 'ID' => $post_id,
561 'post_title' => $post_title,
562 'post_content' => $post_content
563 ];
564
565 if ( $term_id ) {
566 $data['tax_input'] = [
567 'betterdocs_faq_category' => $term_id
568 ];
569
570 $term_meta = get_term_meta( $term_id, '_betterdocs_faq_order' );
571 $term_meta_arr = explode( ',', $term_meta[0] );
572 if ( ! in_array( $post_id, $term_meta_arr ) ) {
573 array_unshift( $term_meta_arr, $post_id );
574 $docs_ordering_data = filter_var_array( wp_unslash( $term_meta_arr ), FILTER_SANITIZE_NUMBER_INT );
575 update_term_meta( $term_id, '_betterdocs_faq_order', implode( ',', $docs_ordering_data ) );
576 }
577 }
578 }
579
580 return wp_update_post( $data );
581 }
582
583 public function delete_betterdocs_faq( $params ) {
584 $post_id = $params->get_param( 'post_id' );
585 return wp_delete_post( $post_id );
586 }
587
588 public function faq_post_loop( $args ) {
589 $posts = [];
590 $query = new WP_Query( $args );
591 if ( $query->have_posts() ) :
592 while ( $query->have_posts() ) :
593 $query->the_post();
594 $posts[ get_the_ID() ]['title'] = get_the_title();
595 $posts[ get_the_ID() ]['content'] = get_the_content();
596 endwhile;
597 endif;
598
599 return $posts;
600 }
601
602 public function update_category_status( $params ) {
603 $term_id = $params->get_param( 'term_id' );
604 $status = $params->get_param( 'status' );
605 return update_term_meta( $term_id, 'status', $status );
606 }
607
608 public function fetch_faq_posts( $params ) {
609 $faq = [];
610 $type = $params->get_param( 'type' );
611
612 if ( $type == 'category' ) {
613 $taxonomy_objects = get_terms(
614 [
615 'taxonomy' => 'betterdocs_faq_category',
616 'hide_empty' => false
617 ]
618 );
619
620 if ( $taxonomy_objects && ! is_wp_error( $taxonomy_objects ) ) :
621 foreach ( $taxonomy_objects as $term ) :
622 $args = [
623 'post_type' => 'betterdocs_faq',
624 'post_status' => 'publish',
625 'post_per_page' => -1,
626 'tax_query' => [
627 [
628 'taxonomy' => 'betterdocs_faq_category',
629 'field' => 'term_id',
630 'terms' => $term->term_id
631 ]
632 ]
633 ];
634
635 $posts = $this->faq_post_loop( $args );
636
637 $faq[ $term->slug ] = [
638 (array) $term,
639 'posts' => $posts
640 ];
641 endforeach;
642 endif;
643 } else {
644 $args = [
645 'post_type' => 'betterdocs_faq',
646 'post_status' => 'publish',
647 'post_per_page' => -1
648 ];
649 $posts = $this->faq_post_loop( $args );
650 $faq['posts'] = $posts;
651 }
652
653 return $faq;
654 }
655
656 public function get_uncategorised_faq() {
657 $available_terms = array_map(
658 function ( $term ) {
659 return $term->term_id;
660 },
661 get_terms(
662 [
663 'taxonomy' => 'betterdocs_faq_category',
664 'hide_empty' => false
665 ]
666 )
667 );
668
669 return get_posts(
670 [
671 'post_type' => 'betterdocs_faq',
672 'post_status' => [ 'publish', 'draft' ],
673 'posts_per_page' => -1,
674 'tax_query' => [
675 'relation' => 'AND',
676 [
677 'taxonomy' => 'betterdocs_faq_category',
678 'field' => 'term_id',
679 'terms' => $available_terms,
680 'operator' => 'NOT IN'
681 ]
682 ]
683 ]
684 );
685 }
686
687 public function category_search( $request ) {
688
689 $title = $request['title'];
690
691 // Perform the taxonomy search
692 $taxonomy_args = [
693 'name__like' => $title,
694 'taxonomy' => 'betterdocs_faq_category',
695 'hide_empty' => false
696 ];
697
698 $taxonomies = get_terms( $taxonomy_args );
699
700 if ( ! empty( $taxonomies ) ) {
701 $result = [];
702 foreach ( $taxonomies as $taxonomy ) {
703 $result[] = [
704 'id' => $taxonomy->term_id,
705 'count' => $taxonomy->count,
706 'description' => $taxonomy->description,
707 'name' => $taxonomy->name,
708 'slug' => $taxonomy->slug
709 // Add more fields as needed
710 ];
711 }
712 // Return the taxonomy data
713 return $result;
714 } else {
715 // Taxonomy not found
716 return new WP_Error( 'taxonomy_not_found', 'Taxonomy not found.', [ 'status' => 404 ] );
717 }
718 }
719
720 public function faq_category_orderby_meta( $args, $request ) {
721 if ( $args['taxonomy'] === 'betterdocs_faq_category' ) {
722 $args['orderby'] = 'meta_value_num';
723 $args['meta_key'] = 'order';
724 }
725 return $args;
726 }
727 }
728