PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 1.7.3
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v1.7.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 / public / betterdocs-shortcodes.php

betterdocs-shortcodes.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 1.7.3, at public/betterdocs-shortcodes.php

900 lines 32.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * BetterDocs all shortcodes
5 *
6 * @link https://wpdeveloper.net
7 * @since 1.0.0
8 *
9 * @package BetterDocs
10 * @subpackage BetterDocs/public
11 */
12
13 /**
14 * Get terms post count including child terms
15 */
16 function betterdocs_get_postcount($term_count = 0, $term_id)
17 {
18 $taxonomy = 'doc_category';
19 $args = array(
20 'child_of' => $term_id,
21 );
22 $tax_terms = get_terms($taxonomy, $args);
23
24 if ($tax_terms) {
25
26 foreach ($tax_terms as $tax_term) {
27 $term_count += $tax_term->count;
28 }
29 }
30
31 return $term_count;
32 }
33
34 /**
35 * Get the category grid with docs list.
36 * *
37 * @since 1.0.0
38 * *
39 * @param int $atts Get attributes for the categories.
40 * @param int $content Get content to category.
41 */
42 add_shortcode('betterdocs_category_grid', 'betterdocs_category_grid');
43 function betterdocs_category_grid($atts, $content = null)
44 {
45 ob_start();
46 global $wp_query;
47
48 $column_val = '';
49 $masonry_layout = BetterDocs_DB::get_settings('masonry_layout');
50 $alphabetic_order = BetterDocs_DB::get_settings('alphabetically_order_post');
51 $nested_subcategory = BetterDocs_DB::get_settings('nested_subcategory');
52 $column_number = BetterDocs_DB::get_settings('column_number');
53 $posts_number = BetterDocs_DB::get_settings('posts_number');
54 $post_count = BetterDocs_DB::get_settings('post_count');
55 $exploremore_btn = BetterDocs_DB::get_settings('exploremore_btn');
56 $exploremore_btn_txt = BetterDocs_DB::get_settings('exploremore_btn_txt');
57 $get_args = shortcode_atts(
58 array(
59 'sidebar_list' => false,
60 'post_type' => 'docs',
61 'category' => 'doc_category',
62 'post_counter' => true,
63 'icon' => true,
64 'masonry' => '',
65 'column' => '',
66 'posts_per_grid' => '',
67 'nested_subcategory' => '',
68 'terms' => '',
69 'multiple_knowledge_base' => false,
70 'disable_customizer_style' => false,
71 ),
72 $atts
73 );
74
75 $taxonomy_objects = BetterDocs_Helper::taxonomy_object($get_args['multiple_knowledge_base'], $get_args['terms']);
76 if ($taxonomy_objects && !is_wp_error($taxonomy_objects)) {
77 $class = ['betterdocs-categories-wrap category-grid white-bg'];
78 if (!is_singular('docs') && !is_tax('doc_category') && !is_tax('doc_tag')) {
79 if ($get_args['sidebar_list'] == true) {
80 $class[] = 'layout-flex';
81 } elseif (isset($get_args['masonry']) && $get_args['masonry'] == true && $get_args['masonry'] != "false") {
82 $class[] = 'layout-masonry';
83 } elseif ($masonry_layout == 1 && $nested_subcategory != 1 && $get_args['masonry'] != "false") {
84 $class[] = 'layout-masonry';
85 } else {
86 $class[] = 'layout-flex';
87 }
88
89 if ($get_args['sidebar_list'] == true) {
90 $column_val = 1;
91 } elseif (isset($get_args['column']) && $get_args['column'] == true && is_numeric($get_args['column'])) {
92 $column_val = $get_args['column'];
93 } else {
94 $column_val = $column_number;
95 }
96 $class[] = 'docs-col-' . $column_val;
97 if ($get_args['disable_customizer_style'] == false) {
98 $class[] = 'single-kb';
99 }
100 }
101 ?>
102 <div class="<?php echo implode(' ', $class) ?>" data-column="<?php echo esc_html($column_val) ?>">
103 <?php
104 $term_list = wp_get_post_terms(get_the_ID(), 'doc_category', array("fields" => "all"));
105 // get single page category id
106 if (is_single() && !empty($term_list)) {
107 $category_id = array_column($term_list, 'term_id');
108 $ancestors = get_ancestors($category_id[0], 'doc_category');
109 $page_cat = get_the_ID();
110 } else {
111 $category_id = array();
112 $page_cat = '';
113 $ancestors = array();
114 }
115 /**
116 * Get Queried Object - For KB
117 */
118
119 // display category grid by order
120 foreach ($taxonomy_objects as $term) {
121 $term_id = $term->term_id;
122 $term_slug = $term->slug;
123 $count = $term->count;
124 $get_term_count = betterdocs_get_postcount($count, $term_id);
125 $term_count = apply_filters('betterdocs_postcount', $get_term_count, $get_args['multiple_knowledge_base'], $term_id, $term_slug, $count);
126 // $term_count = BetterDocs_Helper::get_postcount($term, $get_args['multiple_knowledge_base']);
127
128 if ($term_count > 0) {
129 // set active category class in single page
130 if (is_single() && (in_array($term_id, $category_id) || in_array($term_id, $ancestors))) {
131 $wrap_class = 'docs-single-cat-wrap current-category';
132 $title_class = 'docs-cat-title-wrap active-title';
133 } else {
134 $wrap_class = 'docs-single-cat-wrap';
135 $title_class = 'docs-cat-title-wrap';
136 }
137
138 $cat_icon_id = get_term_meta($term_id, 'doc_category_image-id', true);
139
140 if ($cat_icon_id) {
141 $cat_icon_url = wp_get_attachment_image_url($cat_icon_id, 'thumbnail');
142 $cat_icon = '<img class="docs-cat-icon" src="' . $cat_icon_url . '" alt="">';
143 } else {
144 $cat_icon = '<img class="docs-cat-icon" src="' . BETTERDOCS_ADMIN_URL . 'assets/img/betterdocs-cat-icon.svg" alt="">';
145 }
146
147 if ($get_args['icon'] == false) {
148 $cat_icon = '';
149 }
150 ?>
151 <div class="<?php echo esc_attr($wrap_class) ?>">
152 <div class="<?php echo esc_attr($title_class) ?>">
153 <div class="docs-cat-title-inner">
154 <?php
155 $term_permalink = BetterDocs_Helper::term_permalink($get_args['category'], $term->slug);
156
157 if ($get_args['sidebar_list'] == true) {
158
159 echo '<div class="docs-cat-title">' . $cat_icon . '<h3>' . $term->name . '</h3></div>';
160 } else {
161
162 echo '<div class="docs-cat-title">' . $cat_icon . '<a href="' . esc_url($term_permalink) . '"><h3>' . $term->name . '</h3></a></div>';
163 }
164
165 if ($post_count == 1 && $get_args['post_counter'] == true) {
166
167 echo '<div class="docs-item-count"><span>' . $term_count . '</span></div>';
168 }
169 ?>
170 <svg class="cat-list-arrow-down" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="angle-down" class="svg-inline--fa fa-angle-down fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
171 <path fill="currentColor" d="M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z"></path>
172 </svg>
173 </div>
174 </div>
175
176 <div class="docs-item-container">
177 <?php
178 if (isset($get_args['posts_per_grid']) && $get_args['posts_per_grid'] == true && is_numeric($get_args['posts_per_grid'])) {
179 $posts_per_grid = $get_args['posts_per_grid'];
180 } else {
181 $posts_per_grid = $posts_number;
182 }
183
184 $list_args = BetterDocs_Helper::list_query_arg($get_args['post_type'], $get_args['multiple_knowledge_base'], $term_slug, $posts_per_grid, $alphabetic_order);
185 $args = apply_filters('betterdocs_articles_args', $list_args, $term->term_id);
186 $post_query = new WP_Query($args);
187
188 if ($post_query->have_posts()) :
189 echo '<ul>';
190 while ($post_query->have_posts()) : $post_query->the_post();
191 $attr = ['href="' . get_the_permalink() . '"'];
192 if ($page_cat === get_the_ID()) {
193 $attr[] = 'class="active"';
194 }
195 echo '<li>' . BetterDocs_Helper::list_svg() . '<a ' . implode(' ', $attr) . '>' . get_the_title() . '</a></li>';
196 endwhile;
197 echo '</ul>';
198 endif;
199 wp_reset_query();
200
201 // Sub category query
202 if (($nested_subcategory == 1 || $get_args['nested_subcategory'] == true) && $get_args['nested_subcategory'] != "false") {
203 nested_category_list(
204 $term_id,
205 $get_args['multiple_knowledge_base'],
206 $category_id,
207 $get_args['post_type'],
208 $alphabetic_order,
209 $page_cat
210 );
211 }
212
213 // Read More Button
214 if ($get_args['posts_per_grid'] == '-1' || $posts_number == '-1') {
215 echo '';
216 } else if ($exploremore_btn == 1 && !is_singular('docs') && BetterDocs_Helper::get_tax() != 'doc_category' && !is_tax('doc_tag')) {
217 echo '<a class="docs-cat-link-btn" href="' . $term_permalink . '">' . esc_html($exploremore_btn_txt) . '</a>';
218 }
219 ?>
220 </div>
221 </div>
222 <?php }
223 }
224 ?>
225 </div>
226 <?php } else { ?>
227 <div class="betterdocs-categories-wrap category-grid">
228 <div class="docs-single-cat-wrap">
229 <div class="docs-cat-title-wrap">
230 <div class="docs-cat-title-inner">
231 <div class="docs-cat-title">
232 <img class="docs-cat-icon" src="<?php echo BETTERDOCS_ADMIN_URL ?>assets/img/betterdocs-cat-icon.svg" alt="">
233 <h3><?php esc_html_e('Uncategorised', 'betterdocs') ?></h3>
234 </div>
235 </div>
236 </div>
237 <div class="docs-item-container">
238 <?php
239 $args = array(
240 'post_type' => $get_args['post_type']
241 );
242 if (isset($get_args['posts_per_grid']) && $get_args['posts_per_grid'] == true && is_numeric($get_args['posts_per_grid'])) {
243 $posts_number = $get_args['posts_per_grid'];
244 }
245 $args['posts_per_page'] = $posts_number;
246
247 if ($alphabetic_order == 1) {
248 $args['orderby'] = 'title';
249 $args['order'] = 'ASC';
250 }
251
252 $uncategorised_tax_query = '';
253 $args['tax_query'] = apply_filters('betterdocs_kb_uncategorised_tax_query', $uncategorised_tax_query, $wp_query);
254
255 $post_query = new WP_Query($args);
256
257 if ($post_query->have_posts()) :
258
259 echo '<ul>';
260
261 while ($post_query->have_posts()) : $post_query->the_post();
262 $attr = ['href="' . get_the_permalink() . '"'];
263 echo '<li>' . BetterDocs_Helper::list_svg() . '<a ' . implode(' ', $attr) . '>' . get_the_title() . '</a></li>';
264 endwhile;
265
266 echo '</ul>';
267
268 endif;
269 wp_reset_query();
270 ?>
271 </div>
272 </div>
273 </div>
274 <?php
275 }
276 if ($masonry_layout == 1 && $nested_subcategory != 1 && $get_args['masonry'] != "false") {
277 $output = betterdocs_generate_output();
278 echo '<script>
279 jQuery(document).ready(function() {
280 let masonryGrid = jQuery(".betterdocs-categories-wrap.layout-masonry");
281 let columnPerGrid = jQuery(".betterdocs-categories-wrap.layout-masonry").attr("data-column");
282 let masonryItem = jQuery(".betterdocs-categories-wrap.layout-masonry .docs-single-cat-wrap");
283 let doc_page_column_space = '.$output['betterdocs_doc_page_column_space'].';
284 let total_margin = columnPerGrid * doc_page_column_space;
285 if (masonryGrid.length) {
286 masonryItem.css("width", "calc((100% - "+total_margin+"px) / "+parseInt(columnPerGrid)+")");
287 masonryGrid.masonry({
288 itemSelector: ".docs-single-cat-wrap",
289 percentPosition: true,
290 gutter: doc_page_column_space
291 });
292 }
293 });
294 </script>';
295 }
296 return ob_get_clean();
297 }
298
299 function nested_category_list($term_id, $multiple_kb, $category_id, $post_type, $alphabetic_order, $page_cat) {
300 $sub_categories = BetterDocs_Helper::child_taxonomy_terms($term_id, $multiple_kb);
301 if ($sub_categories) {
302 foreach ($sub_categories as $sub_category) {
303 if (is_single() && in_array($sub_category->term_id, $category_id)) {
304 $subcat_class = 'docs-sub-cat current-sub-cat';
305 } else {
306 $subcat_class = 'docs-sub-cat';
307 }
308
309 echo '<span class="docs-sub-cat-title">
310 ' . BetterDocs_Helper::arrow_right_svg() . '
311 ' . BetterDocs_Helper::arrow_down_svg() . '
312 <a href="#">' . $sub_category->name . '</a></span>';
313
314 echo '<ul class="' . esc_attr($subcat_class) . '">';
315 $sub_args = BetterDocs_Helper::list_query_arg($post_type, $multiple_kb, $sub_category->slug, -1, $alphabetic_order);
316 $sub_args = apply_filters('betterdocs_sub_cat_articles_args', $sub_args, $sub_category->term_id);
317 $sub_post_query = new WP_Query($sub_args);
318
319 if ($sub_post_query->have_posts()) :
320 while ($sub_post_query->have_posts()) : $sub_post_query->the_post();
321 $sub_attr = ['href="' . get_the_permalink() . '"'];
322 if ($page_cat === get_the_ID()) {
323 $sub_attr[] = 'class="active"';
324 }
325 echo '<li class="sub-list">' . BetterDocs_Helper::list_svg() . '<a ' . implode(' ', $sub_attr) . '>' . get_the_title() . '</a></li>';
326 endwhile;
327 endif;
328 wp_reset_query();
329 nested_category_list($sub_category->term_id, $multiple_kb, $category_id, $post_type, $alphabetic_order, $page_cat);
330 echo '</ul>';
331 }
332 }
333 }
334
335
336 /**
337 * Get the category grid with docs list.
338 * *
339 * @since 1.0.0
340 * *
341 * @param int $atts Get attributes for the categories.
342 * @param int $content Get content to category.
343 */
344 add_shortcode('betterdocs_category_list', 'betterdocs_category_list');
345 function betterdocs_category_list($atts, $content = null)
346 {
347 ob_start();
348 $alphabetic_order = BetterDocs_DB::get_settings('alphabetically_order_post');
349 $nested_subcategory = BetterDocs_DB::get_settings('nested_subcategory');
350 $get_args = shortcode_atts(
351 array(
352 'post_type' => 'docs',
353 'category' => 'doc_category',
354 'masonry' => '',
355 'column' => '',
356 'posts_per_page' => '',
357 'nested_subcategory' => '',
358 'terms' => '',
359 'multiple_knowledge_base' => false
360 ),
361 $atts
362 );
363
364 $taxonomy_objects = BetterDocs_Helper::taxonomy_object($get_args['multiple_knowledge_base'], $get_args['terms']);
365
366 if ($taxonomy_objects && !is_wp_error($taxonomy_objects)) :
367 ?>
368 <div class="betterdocs-categories-wrap category-list">
369 <?php
370 $term_list = wp_get_post_terms(get_the_ID(), 'doc_category', array("fields" => "all"));
371
372 // get single page category id
373 if (is_single() && $term_list) {
374 $category_id = array_column($term_list, 'term_id');
375 $page_cat = get_the_ID();
376 } else {
377 $category_id = array();
378 $page_cat = '';
379 }
380
381 /**
382 * For Multiple KB
383 */
384 $q_object = get_queried_object();
385 $kb_slug = '';
386
387 if ($q_object instanceof WP_Term) {
388 $kb_slug = $q_object->slug;
389 }
390
391 // display category grid by order
392 foreach ($taxonomy_objects as $term) {
393 $term_id = $term->term_id;
394 $term_slug = $term->slug;
395 $count = $term->count;
396 $get_term_count = betterdocs_get_postcount($count, $term_id);
397 $term_count = apply_filters('betterdocs_postcount', $get_term_count, $get_args['multiple_knowledge_base'], $term_id, $term_slug, $count);
398 if ($term_count > 0) {
399 // set active category class in single page
400 if (is_single() && in_array($term_id, $category_id)) {
401 $wrap_class = 'docs-single-cat-wrap-2 current-category';
402 $title_class = 'active-title';
403 } else {
404 $wrap_class = 'docs-single-cat-wrap-2';
405 $title_class = '';
406 }
407
408 $term_permalink = BetterDocs_Helper::term_permalink($get_args['category'], $term_slug);
409 ?>
410 <div class="cat tet <?php echo esc_attr($wrap_class) ?>">
411 <div class="<?php echo esc_attr($title_class) ?>">
412 <div class="docs-cat-title-inner">
413 <?php
414 echo '<div class="docs-cat-title"><a href="' . esc_url($term_permalink) . '"><h3>' . $term->name . '</h3></a></div>';
415 ?>
416 </div>
417 </div>
418 <div class="docs-item-container">
419 <?php
420 $list_args = BetterDocs_Helper::list_query_arg($get_args['post_type'], $get_args['multiple_knowledge_base'], $term_slug, -1, $alphabetic_order);
421 $args = apply_filters('betterdocs_articles_args', $list_args, $term->term_id);
422 $post_query = new WP_Query($args);
423 if ($post_query->have_posts()) :
424
425 echo '<ul>';
426 while ($post_query->have_posts()) : $post_query->the_post();
427 $attr = ['href="' . get_the_permalink() . '"'];
428 if ($page_cat === get_the_ID()) {
429 $attr[] = 'class="active"';
430 }
431 echo '<li><a ' . implode(' ', $attr) . '>' . get_the_title() . '</a></li>';
432 endwhile;
433
434 echo '</ul>';
435
436 endif;
437 wp_reset_query();
438
439 // Sub category query
440 if (($nested_subcategory == 1 || $get_args['nested_subcategory'] == true) && $get_args['nested_subcategory'] != "false") {
441 nested_category_list(
442 $term_id,
443 $get_args['multiple_knowledge_base'],
444 $category_id,
445 $get_args['post_type'],
446 $alphabetic_order,
447 $page_cat
448 );
449 }
450 ?>
451
452 </div>
453 </div>
454 <?php }
455 } ?>
456 </div>
457 <?php
458 endif;
459 return ob_get_clean();
460 }
461
462 /**
463 * Get the category grid with docs list.
464 * *
465 * @since 1.0.0
466 * *
467 * @param int $atts Get attributes for the categories.
468 * @param int $content Get content to category.
469 */
470 add_shortcode('betterdocs_category_box', 'betterdocs_category_box');
471 function betterdocs_category_box($atts, $content = null)
472 {
473 ob_start();
474 $column_number = BetterDocs_DB::get_settings('column_number');
475 $post_count = BetterDocs_DB::get_settings('post_count');
476 $count_text_singular = BetterDocs_DB::get_settings('count_text_singular');
477 $count_text = BetterDocs_DB::get_settings('count_text');
478 $get_args = shortcode_atts(
479 array(
480 'post_type' => 'docs',
481 'category' => 'doc_category',
482 'column' => '',
483 'nested_subcategory' => '',
484 'terms' => '',
485 'multiple_knowledge_base' => false,
486 'disable_customizer_style' => false
487 ),
488 $atts
489 );
490
491 $taxonomy_objects = BetterDocs_Helper::taxonomy_object($get_args['multiple_knowledge_base'], $get_args['terms']);
492
493 if ($taxonomy_objects && !is_wp_error($taxonomy_objects)) :
494 $class = ['betterdocs-categories-wrap betterdocs-category-box layout-2 ash-bg'];
495 $class[] = 'layout-flex';
496
497 if (isset($get_args['column']) && $get_args['column'] == true && is_numeric($get_args['column'])) {
498 $class[] = 'docs-col-' . $get_args['column'];
499 } else {
500 $class[] = 'docs-col-' . $column_number;
501 }
502
503 if ($get_args['disable_customizer_style'] == false) {
504 $class[] = 'single-kb';
505 }
506 ?>
507 <div class="<?php echo implode(' ', $class) ?>">
508 <?php
509 // display category grid by order
510 foreach ($taxonomy_objects as $term) {
511 $term_id = $term->term_id;
512 if ($term->count != 0) {
513
514 // set active category class in single page
515 $wrap_class = 'docs-single-cat-wrap';
516
517 $term_permalink = BetterDocs_Helper::term_permalink($get_args['category'], $term->slug);
518 ?>
519 <a href="<?php echo esc_url($term_permalink) ?>" class="<?php echo esc_attr($wrap_class) ?>">
520 <?php
521 $cat_icon_id = get_term_meta($term_id, 'doc_category_image-id', true);
522 if ($cat_icon_id) {
523 echo wp_get_attachment_image($cat_icon_id, 'thumbnail');
524 } else {
525 echo '<img class="docs-cat-icon" src="' . BETTERDOCS_ADMIN_URL . 'assets/img/betterdocs-cat-icon.svg" alt="">';
526 }
527 echo '<h3 class="docs-cat-title">' . $term->name . '</h3>';
528 $cat_desc = get_theme_mod('betterdocs_doc_page_cat_desc');
529 if ($cat_desc == true) {
530 echo '<p class="cat-description">' . $term->description . '</p>';
531 }
532 if ($post_count == 1) {
533 if ($term->count == 1) {
534 echo wp_sprintf('<span>%s %s</span>', $term->count, ($count_text_singular) ? $count_text_singular : __('article', 'betterdocs'));
535 } else {
536 echo wp_sprintf('<span>%s %s</span>', $term->count, ($count_text) ? $count_text : __('articles', 'betterdocs'));
537 }
538 }
539 ?>
540 </a>
541 <?php
542 }
543 }
544 ?>
545 </div>
546 <?php
547 endif;
548 return ob_get_clean();
549 }
550
551 /**
552 * search form with live dropdown result
553 * *
554 * @since 1.0.0
555 *
556 */
557 add_shortcode('betterdocs_search_form', 'betterdocs_search_form');
558 function betterdocs_search_form($atts, $content = null)
559 {
560 $search_placeholder = BetterDocs_DB::get_settings('search_placeholder');
561 ob_start();
562 ?>
563 <div class="betterdocs-live-search">
564 <?php
565 if (get_theme_mod('betterdocs_live_search_heading_switch') == true) {
566 echo '<div class="betterdocs-search-heading">';
567 if (get_theme_mod('betterdocs_live_search_heading')) {
568 echo '<h2> ' . esc_html(get_theme_mod('betterdocs_live_search_heading')) . ' </h2>';
569 }
570 if (get_theme_mod('betterdocs_live_search_heading')) {
571 echo '<h3> ' . get_theme_mod('betterdocs_live_search_subheading') . ' </h3>';
572 }
573 echo '</div>';
574 }
575 ?>
576 <form id="betterdocs-searchform" class="betterdocs-searchform">
577 <svg class="docs-search-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="38px" viewBox="0 0 50 50" version="1.1">
578 <g id="surface1">
579 <path style=" " d="M 21 3 C 11.601563 3 4 10.601563 4 20 C 4 29.398438 11.601563 37 21 37 C 24.355469 37 27.460938 36.015625 30.09375 34.34375 L 42.375 46.625 L 46.625 42.375 L 34.5 30.28125 C 36.679688 27.421875 38 23.878906 38 20 C 38 10.601563 30.398438 3 21 3 Z M 21 7 C 28.199219 7 34 12.800781 34 20 C 34 27.199219 28.199219 33 21 33 C 13.800781 33 8 27.199219 8 20 C 8 12.800781 13.800781 7 21 7 Z "></path>
580 </g>
581 </svg>
582 <input type="text" id="betterdocs-search-field" class="betterdocs-search-field" name="s" placeholder="<?php echo $search_placeholder ?>" autocomplete="off" value="<?php the_search_query(); ?>">
583 <input type="hidden" value="Search" class="betterdocs-search-submit">
584 <svg class="docs-search-loader" width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#444b54">
585 <g fill="none" fill-rule="evenodd">
586 <g transform="translate(1 1)" stroke-width="2">
587 <circle stroke-opacity=".5" cx="18" cy="18" r="18" />
588 <path d="M36 18c0-9.94-8.06-18-18-18">
589 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite" />
590 </path>
591 </g>
592 </g>
593 </svg>
594 <svg class="docs-search-close" xmlns="http://www.w3.org/2000/svg" width="38px" viewBox="0 0 128 128">
595 <path fill="#fff" d="M64 14A50 50 0 1 0 64 114A50 50 0 1 0 64 14Z" transform="rotate(-45.001 64 64.001)"></path>
596 <path class="close-border" d="M64,117c-14.2,0-27.5-5.5-37.5-15.5c-20.7-20.7-20.7-54.3,0-75C36.5,16.5,49.8,11,64,11c14.2,0,27.5,5.5,37.5,15.5c10,10,15.5,23.3,15.5,37.5s-5.5,27.5-15.5,37.5C91.5,111.5,78.2,117,64,117z M64,17c-12.6,0-24.4,4.9-33.2,13.8c-18.3,18.3-18.3,48.1,0,66.5C39.6,106.1,51.4,111,64,111c12.6,0,24.4-4.9,33.2-13.8S111,76.6,111,64s-4.9-24.4-13.8-33.2S76.6,17,64,17z"></path>
597 <path class="close-line" d="M53.4,77.6c-0.8,0-1.5-0.3-2.1-0.9c-1.2-1.2-1.2-3.1,0-4.2l21.2-21.2c1.2-1.2,3.1-1.2,4.2,0c1.2,1.2,1.2,3.1,0,4.2L55.5,76.7C54.9,77.3,54.2,77.6,53.4,77.6z"></path>
598 <path class="close-line" d="M74.6,77.6c-0.8,0-1.5-0.3-2.1-0.9L51.3,55.5c-1.2-1.2-1.2-3.1,0-4.2c1.2-1.2,3.1-1.2,4.2,0l21.2,21.2c1.2,1.2,1.2,3.1,0,4.2C76.1,77.3,75.4,77.6,74.6,77.6z"></path>
599 </svg>
600 </form>
601 </div>
602 <?php
603 return ob_get_clean();
604 }
605
606 /**
607 * Get the search result from ajax load.
608 * *
609 * @since 1.0.0
610 *
611 */
612 add_action('wp_ajax_nopriv_betterdocs_get_search_result', 'betterdocs_get_search_result');
613 add_action('wp_ajax_betterdocs_get_search_result', 'betterdocs_get_search_result');
614 function betterdocs_get_search_result()
615 {
616 $search_input = isset($_POST['search_input']) ? sanitize_text_field($_POST['search_input']) : '';
617 $args = array(
618 'post_type' => 'docs',
619 'post_status' => 'publish',
620 'posts_per_page' => -1,
621 'suppress_filters' => false,
622 's' => $search_input,
623 );
624 $loop = new WP_Query($args);
625 $output = '';
626 $output .= '<div class="betterdocs-search-result-wrap"><ul class="docs-search-result">';
627 if ($loop->have_posts()) :
628 while ($loop->have_posts()) : $loop->the_post();
629 $imagematcha = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', get_the_content(), $matches);
630
631 if ($matches[1]) {
632 $first_img = $matches[1][0];
633 } else {
634 $first_img = '';
635 }
636
637 $terms = get_the_terms(get_the_ID(), 'doc_category');
638 $terms_name = array();
639
640 if ($terms) {
641
642 foreach ($terms as $term) {
643 $terms_name[] = $term->name;
644 }
645 }
646
647 $all_terms = join(", ", $terms_name);
648 $icon = '';
649 $search_result_image = BetterDocs_DB::get_settings('search_result_image');
650 if ($search_result_image == 1 && has_post_thumbnail()) {
651 $icon = get_the_post_thumbnail();
652 } elseif ($search_result_image == 1 && !empty($first_img)) {
653 $icon = '<img src="' . $first_img . '" alt="">';
654 }
655 $output .= '<li>' . $icon . '<a href="' . get_permalink() . '">' . get_the_title() . '<br><span>' . $all_terms . '<span></a></li>';
656 endwhile;
657 else :
658 $output .= '<li>' . esc_html__('Sorry, no docs were found.', 'betterdocs') . '</li>';
659 endif;
660 $output .= '</ul></div>';
661 echo $output;
662 wp_reset_postdata();
663 die();
664 }
665
666 /**
667 * feedback form shortcode
668 * *
669 * @since 1.0.0
670 *
671 */
672 add_shortcode('betterdocs_feedback_form', 'betterdocs_feedback_form');
673 function betterdocs_feedback_form($atts, $content = null)
674 {
675 $get_args = shortcode_atts(
676 array(
677 'button_text' => esc_html__('Send', 'betterdocs')
678 ),
679 $atts
680 );
681 ob_start();
682 if (is_user_logged_in()) {
683 $userdata = get_userdata(get_current_user_id());
684 $name = $userdata->first_name . ' ' . $userdata->last_name;
685 } else {
686 $name = '';
687 }
688 $email = BetterDocs_DB::get_settings('email_address');;
689 ?>
690 <div class="form-wrapper">
691 <div class="response"></div>
692 <form id="betterdocs-feedback-form" class="betterdocs-feedback-form" action="" method="post">
693 <p><label for="message_name" class="form-name">
694 <?php esc_html_e('Name:', 'betterdocs') ?> <span>*</span> <br>
695 <input type="text" id="message_name" name="message_name" value="<?php echo esc_html($name) ?>">
696 </label>
697 </p>
698 <p><label for="message_email" class="form-email">
699 <?php esc_html_e('Email:', 'betterdocs') ?> <span>*</span> <br>
700 <input type="text" id="message_email" name="message_email" value="<?php echo esc_html($email) ?>">
701 </label>
702 </p>
703 <p><label for="message_text" class="form-message">
704 <?php esc_html_e('Message:', 'betterdocs') ?> <span>*</span> <br>
705 <textarea type="text" id="message_text" name="message_text"></textarea>
706 </label>
707 </p>
708 <div class="feedback-from-button">
709 <input type="hidden" name="submitted" value="1">
710 <input type="submit" name="submit" class="button" id="feedback_form_submit_btn" value="<?php echo $get_args['button_text'] ?>" />
711 </div>
712 </form>
713 </div>
714 <?php
715 return ob_get_clean();
716 }
717
718 /**
719 * Submit form via ajax
720 * *
721 * @since 1.0.0
722 *
723 */
724 add_action('wp_ajax_nopriv_betterdocs_feedback_form_submit', 'betterdocs_feedback_form_submit');
725 add_action('wp_ajax_betterdocs_feedback_form_submit', 'betterdocs_feedback_form_submit');
726
727 function betterdocs_feedback_form_submit()
728 {
729 check_ajax_referer( 'betterdocs_submit_data', 'security' );
730 $postID = isset($_POST['postID']) ? $_POST['postID'] : '';
731 $article = get_the_title($postID);
732 $name = isset($_POST['message_name']) ? sanitize_text_field($_POST['message_name']) : '';
733 $email = isset($_POST['message_email']) ? sanitize_email($_POST['message_email']) : '';
734 $message_text = isset($_POST['message_text']) ? sanitize_textarea_field($_POST['message_text']) : '';
735 $message = <<<EOD
736 Name : {$name} <br>
737 Docs : {$article}
738 {$message_text}
739 EOD;
740
741 //response messages
742 $missing_name = esc_html__('Please enter your name.', 'betterdocs');
743 $email_invalid = esc_html__('Enter a valid email address.', 'betterdocs');
744 $missing_message = esc_html__('Please write your message.', 'betterdocs');
745 $message_unsent = esc_html__('Message was not sent. Try Again.', 'betterdocs');
746 $message_sent = esc_html__('Thanks! Your message has been sent.', 'betterdocs');
747
748 //php mailer variables
749 $to = BetterDocs_DB::get_settings('email_address');
750 if (empty($to)) {
751 $to = get_option('admin_email');
752 }
753
754 $subject = wp_sprintf(__('Feedback message from %s', 'betterdocs'), get_bloginfo('name'));
755 $headers = 'From: ' . $email . "\r\n" .
756 'Reply-To: ' . $email . "\r\n";
757 $response = array();
758
759 //validate presence of name
760 if (empty($name)) {
761 $response['nameStatus'] = 'error';
762 $response['nameMessage'] = $missing_name;
763 }
764
765 //validate email
766 if (empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
767 $response['emailStatus'] = 'error';
768 $response['emailMessage'] = $email_invalid;
769 }
770
771 //validate presence of message
772 if (empty($message_text)) {
773 $response['messageStatus'] = 'error';
774 $response['messageMessage'] = $missing_message;
775 }
776
777 if (!empty($name) && !empty($email) && filter_var($email, FILTER_VALIDATE_EMAIL) && !empty($message_text)) {
778 $sent = wp_mail($to, $subject, strip_tags($message), $headers);
779 if ($sent) {
780 $response['sentStatus'] = 'success';
781 $response['sentMessage'] = $message_sent;
782 } else {
783 $response['sentStatus'] = 'error';
784 $response['sentMessage'] = $message_unsent;
785 }
786 }
787 echo json_encode($response);
788 die();
789 }
790
791 /**
792 * Social Share Shortcode
793 * *
794 * @since 1.0.0
795 *
796 */
797 add_shortcode('betterdocs_social_share', 'betterdocs_social_share');
798 function betterdocs_social_share($atts, $content = null)
799 {
800 $get_args = shortcode_atts(
801 array(
802 'title' => esc_html__('Share This Article :', 'betterdocs'),
803 'facebook_sharing' => '1',
804 'twitter_sharing' => '1',
805 'linkedin_sharing' => '1',
806 'pinterest_sharing' => '1'
807 ),
808 $atts
809 );
810 $thumbnail = '';
811 if (function_exists('has_post_thumbnail')) {
812 if (has_post_thumbnail()) {
813 $thumbnail = wp_get_attachment_url(get_post_thumbnail_id());
814 }
815 }
816
817 ?>
818 <div class="betterdocs-social-share">
819 <div class="betterdocs-social-share-heading">
820 <?php
821 if ($get_args['title']) :
822 echo '<h5>' . esc_html($get_args['title']) . '</h5>';
823 endif;
824 ?>
825 </div>
826 <ul class="betterdocs-social-share-links">
827 <?php if ($get_args['facebook_sharing'] == true) : ?>
828 <li><a href="https://www.facebook.com/sharer/sharer.php?u=<?php the_permalink(); ?>" target="_blank"><img src="<?php echo BETTERDOCS_URL ?>public/img/facebook.svg" alt=""></a></li>
829 <?php endif; ?>
830
831 <?php if ($get_args['twitter_sharing'] == true) : ?>
832 <li><a href="https://twitter.com/home?status=<?php the_permalink(); ?>" target="_blank"><img src="<?php echo BETTERDOCS_URL ?>public/img/twitter.svg" alt=""></a></li>
833 <?php endif; ?>
834
835 <?php if ($get_args['linkedin_sharing'] == true) : ?>
836 <li><a href="https://www.linkedin.com/shareArticle?mini=true&url=<?php the_permalink(); ?>&title=&summary=&source=" target="_blank"><img src="<?php echo BETTERDOCS_URL ?>public/img/linkedin.svg" alt=""></a></li>
837 <?php endif; ?>
838
839 <?php if ($get_args['pinterest_sharing'] == true) : ?>
840 <li><a href="https://pinterest.com/pin/create/button/?url=<?php the_permalink(); ?>&media=<?php echo $thumbnail; ?>&description=" target="_blank"><img src="<?php echo BETTERDOCS_URL ?>public/img/pinterest.svg" alt=""></a></li>
841 <?php endif; ?>
842 </ul>
843 </div> <!-- Social Share end-->
844 <?php }
845
846 add_shortcode('betterdocs_toc', 'betterdocs_toc');
847 function betterdocs_toc($atts, $content = null)
848 {
849 $get_args = shortcode_atts(
850 array(
851 'post_type' => 'docs',
852 'post_id' => get_the_ID(),
853 'htags' => '1,2,3,4,5,6',
854 'hierarchy' => '',
855 'list_number' => '',
856 'collapsible_on_mobile' => '',
857 ),
858 $atts
859 );
860
861 $get_post = get_post($get_args['post_id']);
862 $post_content = $get_post->post_content;
863
864 $toc = BetterDocs_Public::betterdocs_toc(
865 $post_content,
866 $get_args['htags'],
867 $get_args['hierarchy'],
868 $get_args['list_number'],
869 $get_args['collapsible_on_mobile']
870 );
871
872 return $toc;
873 }
874
875 add_shortcode('betterdocs_post_content', 'betterdocs_post_content');
876 function betterdocs_post_content($atts, $content = null)
877 {
878 $get_args = shortcode_atts(
879 array(
880 'post_id' => get_the_ID(),
881 'htags' => 'h1,h2,h3,h4,h5,h6',
882 'enable_toc' => '',
883 'toc_hierarchy' => '',
884 'list_number' => '',
885 'display_toc_on_top' => '',
886 'collapsible_toc_mobile' => ''
887 ),
888 $atts
889 );
890
891 $get_post = get_post($get_args['post_id']);
892 $post_content = $get_post->post_content;
893 $the_content = BetterDocs_Public::betterdocs_the_content(
894 $post_content,
895 $get_args['htags'],
896 $get_args['enable_toc']
897 );
898
899 return $the_content;
900 }