PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.4.0
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.4.0
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 / Shortcodes / SearchForm.php

SearchForm.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 3.4.0, at includes/Shortcodes/SearchForm.php

212 lines 7.0 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\Shortcodes;
4
5 use WPDeveloper\BetterDocs\Core\Query;
6 use WPDeveloper\BetterDocs\Utils\Helper;
7 use WPDeveloper\BetterDocs\Core\Settings;
8 use WPDeveloper\BetterDocs\Core\Shortcode;
9 use WPDeveloper\BetterDocs\Admin\Customizer\Defaults;
10
11 class SearchForm extends Shortcode {
12 public function __construct( Settings $settings, Query $query, Helper $helper, Defaults $defaults ) {
13 parent::__construct( $settings, $query, $helper, $defaults );
14
15 add_action( 'wp_ajax_nopriv_betterdocs_get_search_result', [$this, 'get_search_results'] );
16 add_action( 'wp_ajax_betterdocs_get_search_result', [$this, 'get_search_results'] );
17 }
18
19 public function get_style_depends() {
20 return ['betterdocs-search'];
21 }
22
23 public function get_script_depends() {
24 return ['betterdocs-search'];
25 }
26
27 public function get_search_results() {
28 global $wpdb;
29 $search_input = isset( $_POST['search_input'] ) ? sanitize_text_field( $_POST['search_input'] ) : '';
30 $search_cat = isset( $_POST['search_cat'] ) ? wp_strip_all_tags( $_POST['search_cat'] ) : '';
31 $lang = isset( $_POST['lang'] ) ? wp_strip_all_tags( $_POST['lang'] ) : '';
32 $search_input = preg_replace( '/[^A-Za-z0-9_\- ][]]/', '', strtolower( $search_input ) );
33
34 $tax_query = [];
35 if ( $search_cat ) {
36 $tax_query = [
37 [
38 'taxonomy' => 'doc_category',
39 'field' => 'slug',
40 'terms' => $search_cat,
41 'operator' => 'AND',
42 'include_children' => true
43 ]
44 ];
45 }
46
47 $term = get_term_by( 'slug', $search_cat );
48
49 $args = [
50 'term_id' => isset( $term->term_id ) ? $term->term_id : 0,
51 'post_type' => 'docs',
52 'post_status' => 'publish',
53 'posts_per_page' => -1,
54 'suppress_filters' => true,
55 's' => $search_input,
56 'orderby' => 'relevance',
57 'tax_query' => $tax_query
58 ];
59
60 if ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
61 $args['suppress_filters'] = false;
62 $args['lang'] = ICL_LANGUAGE_CODE;
63 }
64
65 $search_results = $this->query->get_posts( $args );
66
67 $response = [];
68
69 ob_start();
70 betterdocs()->views->get( 'shortcode-parts/search-results', [
71 'search_results' => $search_results,
72 'search_input' => $search_input
73 ] );
74
75 $_output = ob_get_clean();
76
77 $_input_not_found = '';
78 if ( ! $search_results->have_posts() ) {
79 $_input_not_found = $search_input;
80 }
81
82 $response['post_lists'] = $_output;
83
84 if ( $_output && strlen( $search_input ) >= 3 ) {
85 $this->insert( $search_input, $_input_not_found );
86 }
87
88 wp_reset_query();
89 wp_reset_postdata();
90
91 wp_send_json_success( $response );
92 }
93
94 private function insert( $search_input, $input_not_found ) {
95 global $wpdb;
96 $search = $wpdb->get_results(
97 $wpdb->prepare(
98 "SELECT *
99 FROM {$wpdb->prefix}betterdocs_search_keyword
100 WHERE keyword = %s",
101 $search_input
102 )
103 );
104
105 if ( ! empty( $search ) ) {
106 $search_log = $wpdb->get_results(
107 $wpdb->prepare(
108 "SELECT *
109 FROM {$wpdb->prefix}betterdocs_search_log
110 WHERE created_at = %s AND keyword_id = %d",
111 date( 'Y-m-d' ), $search[0]->id
112 )
113 );
114
115 if ( ! empty( $search_log ) ) {
116 if ( ! empty( $input_not_found ) ) {
117 $tbl_field = 'not_found_count';
118 $count = $search_log[0]->not_found_count + 1;
119 } else {
120 $tbl_field = 'count';
121 $count = $search_log[0]->count + 1;
122 }
123 $wpdb->query(
124 $wpdb->prepare(
125 "UPDATE {$wpdb->prefix}betterdocs_search_log
126 SET " . $tbl_field . " = " . $count . "
127 WHERE created_at = %s AND keyword_id = %d",
128 $search_log[0]->created_at, $search_log[0]->keyword_id
129 )
130 );
131 } else {
132 if ( ! empty( $input_not_found ) ) {
133 $count = 0;
134 $not_found_count = 1;
135 } else {
136 $count = 1;
137 $not_found_count = 0;
138 }
139 $wpdb->query(
140 $wpdb->prepare(
141 "INSERT INTO {$wpdb->prefix}betterdocs_search_log
142 ( keyword_id, count, not_found_count, created_at )
143 VALUES ( %d, %d, %d, %s )",
144 [
145 $search[0]->id,
146 $count,
147 $not_found_count,
148 date( 'Y-m-d' )
149 ]
150 )
151 );
152 }
153 } else {
154 $insert = $wpdb->query(
155 $wpdb->prepare(
156 "INSERT INTO {$wpdb->prefix}betterdocs_search_keyword
157 ( keyword )
158 VALUES ( %s )",
159 [
160 $search_input
161 ]
162 )
163 );
164
165 if ( $insert ) {
166 if ( ! empty( $input_not_found ) ) {
167 $count = 0;
168 $not_found_count = 1;
169 } else {
170 $count = 1;
171 $not_found_count = 0;
172 }
173 $wpdb->query(
174 $wpdb->prepare(
175 "INSERT INTO {$wpdb->prefix}betterdocs_search_log
176 ( keyword_id, count, not_found_count, created_at )
177 VALUES ( %d, %d, %d, %s )",
178 [
179 $wpdb->insert_id,
180 $count,
181 $not_found_count,
182 date( 'Y-m-d' )
183 ]
184 )
185 );
186 }
187 }
188 }
189
190 public function get_name() {
191 return 'betterdocs_search_form';
192 }
193
194 /**
195 * Summary of default_attributes
196 * @return array
197 */
198 public function default_attributes() {
199 return apply_filters( 'betterdocs_search_form_attr', [
200 'placeholder' => __( 'Search', 'betterdocs' ),
201 'heading' => '',
202 'subheading' => '',
203 'heading_tag' => 'h2',
204 'subheading_tag' => 'h3'
205 ] );
206 }
207
208 public function render( $atts, $content = null ) {
209 $this->views( 'shortcodes/search' );
210 }
211 }
212