fix!: plugin-search with localization enabled (#8938)
The search plugin was incorrectly retrieving all locales, when it should just be retrieving the locale of the parent document that was actively being updated. ## BREAKING CHANGES: If you have a localized Payload config, and you are using the `plugin-search`, we will now automatically localize the `title` field that is injected by the search plugin and this may lead to data loss. To opt out of this new behavior, you can pass `localize: false` to the plugin options.
This commit is contained in:
@@ -81,6 +81,10 @@ export default config
|
|||||||
|
|
||||||
The `collections` property is an array of collection slugs to enable syncing to search. Enabled collections receive a `beforeChange` and `afterDelete` hook that creates, updates, and deletes its respective search record as it changes over time.
|
The `collections` property is an array of collection slugs to enable syncing to search. Enabled collections receive a `beforeChange` and `afterDelete` hook that creates, updates, and deletes its respective search record as it changes over time.
|
||||||
|
|
||||||
|
### `localize`
|
||||||
|
|
||||||
|
By default, the search plugin will add `localization: true` to the `title` field of the newly added `search` collection if you have localization enabled. If you would like to disable this behavior, you can set this to `false`.
|
||||||
|
|
||||||
#### `defaultPriorities`
|
#### `defaultPriorities`
|
||||||
|
|
||||||
This plugin automatically adds a `priority` field to the `search` collection that can be used as the `?sort=` parameter in your queries. For example, you may want to list blog posts before pages. Or you may want one specific post to always take appear first.
|
This plugin automatically adds a `priority` field to the `search` collection that can be used as the `?sort=` parameter in your queries. For example, you may want to list blog posts before pages. Or you may want one specific post to always take appear first.
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
|
|||||||
docToSyncWith = await payload.findByID({
|
docToSyncWith = await payload.findByID({
|
||||||
id,
|
id,
|
||||||
collection,
|
collection,
|
||||||
locale: 'all',
|
locale: req.locale,
|
||||||
req,
|
req,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -71,6 +71,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
|
|||||||
...dataToSave,
|
...dataToSave,
|
||||||
priority: defaultPriority,
|
priority: defaultPriority,
|
||||||
},
|
},
|
||||||
|
locale: req.locale,
|
||||||
req,
|
req,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -82,6 +83,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
|
|||||||
const searchDocQuery = await payload.find({
|
const searchDocQuery = await payload.find({
|
||||||
collection: searchSlug,
|
collection: searchSlug,
|
||||||
depth: 0,
|
depth: 0,
|
||||||
|
locale: req.locale,
|
||||||
req,
|
req,
|
||||||
where: {
|
where: {
|
||||||
'doc.relationTo': {
|
'doc.relationTo': {
|
||||||
@@ -128,6 +130,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
|
|||||||
...dataToSave,
|
...dataToSave,
|
||||||
priority: foundDoc.priority || defaultPriority,
|
priority: foundDoc.priority || defaultPriority,
|
||||||
},
|
},
|
||||||
|
locale: req.locale,
|
||||||
req,
|
req,
|
||||||
})
|
})
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
@@ -154,6 +157,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
|
|||||||
...dataToSave,
|
...dataToSave,
|
||||||
priority: defaultPriority,
|
priority: defaultPriority,
|
||||||
},
|
},
|
||||||
|
locale: req.locale,
|
||||||
req,
|
req,
|
||||||
})
|
})
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export const generateSearchCollection = (pluginConfig: SearchPluginConfig): Coll
|
|||||||
admin: {
|
admin: {
|
||||||
readOnly: true,
|
readOnly: true,
|
||||||
},
|
},
|
||||||
|
localized: pluginConfig.localize,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'priority',
|
name: 'priority',
|
||||||
|
|||||||
@@ -14,6 +14,14 @@ export const searchPlugin =
|
|||||||
(config: Config): Config => {
|
(config: Config): Config => {
|
||||||
const { collections } = config
|
const { collections } = config
|
||||||
|
|
||||||
|
// If the user defines `localize` to either true or false, use that
|
||||||
|
// Otherwise, set it based on if their config has localization enabled or disabled
|
||||||
|
const shouldLocalize =
|
||||||
|
typeof incomingPluginConfig.localize === 'boolean'
|
||||||
|
? incomingPluginConfig.localize
|
||||||
|
: Boolean(config.localization)
|
||||||
|
incomingPluginConfig.localize = shouldLocalize
|
||||||
|
|
||||||
if (collections) {
|
if (collections) {
|
||||||
const pluginConfig: SearchPluginConfig = {
|
const pluginConfig: SearchPluginConfig = {
|
||||||
// write any config defaults here
|
// write any config defaults here
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export type SearchPluginConfig = {
|
|||||||
[collection: string]: ((doc: any) => number | Promise<number>) | number
|
[collection: string]: ((doc: any) => number | Promise<number>) | number
|
||||||
}
|
}
|
||||||
deleteDrafts?: boolean
|
deleteDrafts?: boolean
|
||||||
|
localize?: boolean
|
||||||
searchOverrides?: { fields?: FieldsOverride } & Partial<Omit<CollectionConfig, 'fields'>>
|
searchOverrides?: { fields?: FieldsOverride } & Partial<Omit<CollectionConfig, 'fields'>>
|
||||||
syncDrafts?: boolean
|
syncDrafts?: boolean
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ describe('@payloadcms/plugin-search', () => {
|
|||||||
const createdDoc = await payload.create({
|
const createdDoc = await payload.create({
|
||||||
collection: 'posts',
|
collection: 'posts',
|
||||||
data: {
|
data: {
|
||||||
_status: 'draft',
|
_status: 'published',
|
||||||
title: 'test title',
|
title: 'test title',
|
||||||
slug: 'es',
|
slug: 'es',
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user