The useSearchNative hook
The useSearchNative hook is the Next.js binding for the useFetchSearchNative.
The useSearchNative
hook is the implementation of core Search Results endpoint.
This hook was introduced in @headstartwp/[email protected]
, @headstartwp/[email protected]
and requires the the HeadstartWP WordPress plugin >= 1.1.0
The headstartwp WordPress plugin does additional customizations to ensure the Search Results endpoints return all the embeddable data associated with search results.
Basic Usage
Assuming a src/pages/search/[[...path]].js
route with the following content.
This example is using the optional catch-all route [[..path]].js
because we want the /search
route to be handled by the same file and fetch the latest posts.
import { useSearchNative } from '@headstartwp/next';
const ArchivePage = () => {
const { loading, error, data } = useSearchNative({ per_page: 10 });
if (loading) {
return 'Loading...';
}
if (error) {
return 'error...';
}
if (data.pageInfo.totalItems === 0) {
return 'Nothing found';
}
return (
<>
<h1>Search Results</h1>
<ul>
{data.searchResults.map((item) => (
<li key={item.id}>
<Link href={item.url}>
{item.id} - {item.title}
</Link>
</li>
))}
</ul>
</>
);
};
The route will automatically render the latest 10 results if no search term is provided. The following paths are automatically handled:
- /search/search-term
- /search/search-term/page/2
- /search
Searching from multiple post types
You can specify any of the supported parameters described in the Search Results endpoint documentation.
import { useSearchNative } from '@headstartwp/next';
const ArchivePage = () => {
const { loading, error, data } = useSearchNative({
per_page: 10,
type: 'post',
subtype: ['post', 'page']
});
if (loading) {
return 'Loading...';
}
if (error) {
return 'error...';
}
if (data.pageInfo.totalItems === 0) {
return 'Nothing found';
}
return (
<>
<h1>Search Results</h1>
<ul>
{data.searchResults.map((item) => (
<li key={item.id}>
<Link href={item.url}>
{item.id} - {item.title}
</Link>
</li>
))}
</ul>
</>
);
};
Searching for terms
You can also search for terms:
import { useSearch } from '@headstartwp/next';
const ArchivePage = () => {
const { loading, error, data } = useSearchNative({
per_page: 10,
type: 'term',
subtype: ['category', 'category']
});
if (loading) {
return 'Loading...';
}
if (error) {
return 'error...';
}
if (data.pageInfo.totalItems === 0) {
return 'Nothing found';
}
return (
<>
<h1>Search Results</h1>
<ul>
{data.searchResults.map((item) => (
<li key={item.id}>
<Link href={item.url}>
{item.id} - {item.title}
</Link>
</li>
))}
</ul>
</>
);
};
Accessing embeddable data
By default, the Search Results endpoints only return the object of the associated search results but do not return embeddable data of the search results entities themselves. For instance, when searching for posts, even if you pass the _embed
parameter, WordPress won't return the associated term objects, author objects etc.
HeadstartWP plugin extends the core endpoint so that it returns these embedded objects to avoid the need for additional queries. Check the PostSearchEntity and TermSearcheEntity.
QueriedObject
The useNativeSearch
hook also exposes a queriedObject
.
The queried object for this hook is an object of type SearchEntity.