changes into code
<?php
/**
* Plugin Shortcode Class File.
*
* handels wordpress site global search accross posts, pages, cpt etc.
*
* @since 1.0.0
* @package Website_Search
*/
if (!defined('ABSPATH')) {
exit;
}
class Website_Search_Shortcode
{
/**
* Constructor.
*
* loads all the shortcode related dependencies, get search results
*
* @since 1.0.0
* @return void
*/
public function __construct()
{
add_shortcode('website_search', [$this, 'sdw_website_search_short_code_callback']);
add_action('posts_search', [$this, 'sdw_get_taxonomy_meta_callback'], 10, 2);
add_filter('template_include', [$this, 'sdw_load_website_search_template']);
add_action('init', [$this, 'sdw_register_search_rewrite']);
add_filter('query_vars', [$this, 'sdw_register_query_vars']);
add_action('pre_get_posts', [$this, 'sdw_map_q_to_search']);
}
public function sdw_register_search_rewrite()
{
add_rewrite_rule(
'^search/content/?$',
'index.php?sdw_search=1',
'top'
);
}
public function sdw_register_query_vars($vars)
{
$vars[] = 'q'; // search keyword
$vars[] = 'sdw_search'; // flag
return $vars;
}
public function sdw_map_q_to_search($query)
{
if (
!is_admin() &&
$query->is_main_query() &&
get_query_var('sdw_search')
) {
$keyword = get_query_var('q');
if ($keyword) {
$query->set('s', sanitize_text_field($keyword));
$query->is_search = true;
}
}
}
// public function sdw_pre_get_posts_callback($query)
// {
// if (!is_admin() && $query->is_main_query() && $query->is_search()) {
// // get all post types names
// $post_types = get_post_types([
// 'public' => true
// ], 'names');
// unset($post_types['attachment']);
// // set all post types to query
// $query->set('post_type', $post_types);
// }
// }
public function sdw_get_taxonomy_meta_callback($search, $query)
{
global $wpdb;
if (
is_admin() ||
!$query->is_main_query() ||
!$query->is_search()
) {
return $search;
}
$keyword = trim($query->get('s'));
if (!$keyword) {
return $search;
}
$like = '%' . $wpdb->esc_like($keyword) . '%';
// Get ALL public taxonomies (category, tag, CPT taxonomies)
$taxonomies = get_taxonomies(['public' => true], 'names');
if (empty($taxonomies)) {
return $search;
}
$tax_in = "'" . implode("','", esc_sql($taxonomies)) . "'";
// Append taxonomy + meta search
$search .= $wpdb->prepare("
OR {$wpdb->posts}.ID IN (
/* TAXONOMY TERM NAME SEARCH */
SELECT DISTINCT tr.object_id
FROM {$wpdb->term_relationships} tr
INNER JOIN {$wpdb->term_taxonomy} tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} t
ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ($tax_in)
AND t.name LIKE %s
UNION
/* META / ACF SEARCH */
SELECT DISTINCT pm.post_id
FROM {$wpdb->postmeta} pm
WHERE pm.meta_value LIKE %s
)
", $like, $like);
return $search;
}
public function sdw_load_website_search_template($template)
{
if (is_search() && is_main_query()) {
return WEBSITE_SEARCH_PATH . 'templates/search.php';
}
return $template;
}
/**
* shortcode callback function
*
* It helps to display button on-click search modal
*
* @since 1.0.0
* @return void
*/
public function sdw_website_search_short_code_callback($atts)
{
$atts = shortcode_atts(
array(
'variant' => 'form', // form | modal
'button_text' => 'Search', // modal button text
),
$atts,
'website_search'
);
ob_start();
// FORM ONLY (default)
if ($atts['variant'] !== 'modal'): ?>
<form method="get" action="<?php echo esc_url(home_url('/search/content/')); ?>">
<input type="text" name="q" class="form-control"
placeholder="<?php esc_attr_e('Enter your search query', 'website-search'); ?>"
value="<?php the_search_query(); ?>" required>
<button type="submit" class="btn btn-primary">
<?php esc_html_e('Search', 'website-search'); ?>
</button>
</form>
<?php
// MODAL VARIANT
else:
$button_text = esc_html($atts['button_text']);
?>
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#sdwSearchModal">
<?php echo $button_text; ?>
</button>
<!-- Modal -->
<div class="modal fade" id="sdwSearchModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<?php esc_html_e('Search in website', 'website-search'); ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form method="get" action="<?php echo esc_url(home_url('/search/content/')); ?>">
<input type="text" name="q" class="form-control" placeholder="Search..."
value="<?php the_search_query(); ?>">
<button type="submit">Search</button>
</form>
</div>
</div>
</div>
</div>
<?php endif;
return ob_get_clean();
}
}