Skip to content

Commit b79e245

Browse files
authored
PLANET-7485: Rewrite search to avoid double queries (#2246)
* PLANET-7485: Rewrite search to avoid double queries Ref: https://jira.greenpeace.org/browse/PLANET-7485 * PLANET-7485: Add filters handling Add filters, aggregation matching, filters exclusion * Use facets for native results aggregation Force use of facets feature (Filters in EP config) Fix tax query cumulative filter * Fix search without ElasticPress Display filters even without ES active Fix ajax search on action type Fix mimetype filter without ES active * Extract filters templates Extract and reuse filters templates for normal and modal modes
1 parent caf24a6 commit b79e245

24 files changed

+1026
-1634
lines changed

assets/src/js/search.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,21 @@ const showHiddenRow = row => {
88
row.style.display = 'block';
99
};
1010

11+
const isModalSearch = () => {
12+
return document.getElementById('filtermodal') &&
13+
document.getElementById('filtermodal').style.display !== 'none';
14+
};
15+
16+
const getSelectedFilters = isModal => {
17+
const filters_div_id = isModal ? 'filtermodal' : 'filter-sidebar-options';
18+
return [...document.querySelectorAll(
19+
`#${filters_div_id} input[name^="f["]:checked`
20+
)];
21+
};
22+
1123
const addSelectedFiltersToForm = (isModal, idToRemove) => {
1224
const searchForm = document.getElementById('search_form');
13-
let selectedFilters = [...document.querySelectorAll(
14-
`input[name^="f["]${isModal ? '.modal-checkbox' : ':not(.modal-checkbox)'}:checked`
15-
)];
25+
let selectedFilters = getSelectedFilters(isModal);
1626

1727
if (idToRemove) {
1828
selectedFilters = selectedFilters.filter(selectedFilter => selectedFilter.value !== idToRemove);
@@ -41,6 +51,7 @@ export const setupSearch = () => {
4151
if (orderSelect) {
4252
orderSelect.onchange = () => {
4353
orderInput.value = orderSelect.value;
54+
addSelectedFiltersToForm(isModalSearch());
4455
searchForm.submit();
4556
};
4657
}
@@ -93,12 +104,13 @@ export const setupSearch = () => {
93104
const nextPage = parseInt(current_page) + 1;
94105
loadMoreButton.dataset.current_page = nextPage;
95106

96-
const url = new URL(localizations.ajaxurl);
97-
url.searchParams.append('action', 'get_paged_posts');
98-
url.searchParams.append('search_query', navSearchInput.value.trim());
107+
const url = new URL(document.documentElement.dataset.base + '/wp-json/planet4/v1/search/');
108+
url.searchParams.append('s', navSearchInput.value.trim());
99109
url.searchParams.append('paged', nextPage);
100110
url.searchParams.append('orderby', orderInput.value);
101-
url.searchParams.append('query-string', decodeURIComponent(location.search).substring(1)); // Ignore the ? in the search url (first char)
111+
getSelectedFilters(isModalSearch()).forEach(f => {
112+
url.searchParams.append(f.name, f.value);
113+
});
102114

103115
fetch(url)
104116
.then(response => response.text())

functions.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ function planet4_get_option(string $key = '', $default = null)
9999
function (): void {
100100
Rest::register_endpoints();
101101
Api\Gallery::register_endpoint();
102+
Api\Search::register_endpoint();
102103
Api\Settings::register_endpoint();
103104
Api\ENForm::register_endpoint();
104105
}

load-class-aliases.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@ class_alias(\P4\MasterTheme\ControlPanel::class, 'P4_Control_Panel');
1818
class_alias(\P4\MasterTheme\Cookies::class, 'P4_Cookies');
1919
class_alias(\P4\MasterTheme\CustomTaxonomy::class, 'P4_Custom_Taxonomy');
2020
class_alias(\P4\MasterTheme\DevReport::class, 'P4_Dev_Report');
21-
class_alias(\P4\MasterTheme\ElasticSearch::class, 'P4_ElasticSearch');
2221
class_alias(\P4\MasterTheme\ImageCompression::class, 'P4_Image_Compression');
2322
class_alias(\P4\MasterTheme\Loader::class, 'P4_Loader');
2423
class_alias(\P4\MasterTheme\MetaboxRegister::class, 'P4_Metabox_Register');
2524
class_alias(\P4\MasterTheme\Post::class, 'P4_Post');
2625
class_alias(\P4\MasterTheme\PostArchive::class, 'P4_Post_Archive');
2726
class_alias(\P4\MasterTheme\PostCampaign::class, 'P4_Post_Campaign');
2827
class_alias(\P4\MasterTheme\PostReportController::class, 'P4_Post_Report_Controller');
29-
class_alias(\P4\MasterTheme\Search::class, 'P4_Search');
3028
class_alias(\P4\MasterTheme\Settings::class, 'P4_Settings');
3129
class_alias(\P4\MasterTheme\Sitemap::class, 'P4_Sitemap');
3230
class_alias(\P4\MasterTheme\User::class, 'P4_User');

search.php

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,9 @@
22

33
/**
44
* Search results page
5-
*
6-
* Methods for TimberHelper can be found in the /lib sub-directory
7-
*
8-
* @package WordPress
9-
* @subpackage Timber
10-
* @since Timber 0.1
115
*/
126

13-
use P4\MasterTheme\ElasticSearch;
7+
use P4\MasterTheme\Search\SearchPage;
148

159
/**
1610
* Planet4 - Search functionality.
@@ -21,27 +15,6 @@
2115
return;
2216
}
2317

24-
$selected_sort = empty($_GET['orderby'])
25-
? null : sanitize_text_field($_GET['orderby']);
26-
$selected_filters = $_GET['f'] ?? ''; // phpcs:ignore
27-
$filters = [];
28-
29-
// Handle submitted filter options.
30-
if ($selected_filters && is_array($selected_filters)) {
31-
foreach ($selected_filters as $type_name => $filter_type) {
32-
if (! is_array($filter_type)) {
33-
continue;
34-
}
35-
foreach ($filter_type as $name => $filter_id) {
36-
$filters[ $type_name ][] = [
37-
'id' => $filter_id,
38-
'name' => $name,
39-
];
40-
}
41-
}
42-
}
43-
44-
$p4_search = new ElasticSearch();
45-
$p4_search->load(trim(get_search_query()), $selected_sort, $filters);
46-
$p4_search->add_load_more();
47-
$p4_search->view();
18+
global $wp_query;
19+
$page = new SearchPage($wp_query);
20+
$page->render();

src/Api/Search.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace P4\MasterTheme\Api;
4+
5+
use WP_Query;
6+
use WP_REST_Request;
7+
use WP_REST_Server;
8+
use P4\MasterTheme\Search\SearchPage;
9+
10+
class Search
11+
{
12+
/**
13+
* @example GET /wp-json/planet4/v1/search/?s=foo
14+
*/
15+
public static function register_endpoint(): void
16+
{
17+
/**
18+
* Endpoint to get partial search results
19+
* Rendered in HTML
20+
*/
21+
register_rest_route(
22+
'planet4/v1',
23+
'search',
24+
[
25+
[
26+
'permission_callback' => static fn() => true,
27+
'methods' => WP_REST_Server::READABLE,
28+
'callback' => static function (WP_REST_Request $request): void {
29+
$query = new WP_Query();
30+
$query->set('ep_integrate', true);
31+
$query->query($request->get_params());
32+
33+
$page = new SearchPage($query);
34+
$page->render_partial();
35+
},
36+
],
37+
]
38+
);
39+
}
40+
}

0 commit comments

Comments
 (0)