: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
children: (0,external_wp_i18n_namespaceObject.__)('Add tags')
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", {
children: (0,external_wp_i18n_namespaceObject.__)('Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.')
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(flat_term_selector, {
const MaybeTagsPanel = () => {
} = (0,external_wp_data_namespaceObject.useSelect)(select => {
const postType = select(store_store).getCurrentPostType();
const tagsTaxonomy = select(external_wp_coreData_namespaceObject.store).getTaxonomy('post_tag');
const _isPostTypeSupported = tagsTaxonomy?.types?.includes(postType);
const areTagsFetched = tagsTaxonomy !== undefined;
const tags = tagsTaxonomy && select(store_store).getEditedPostAttribute(tagsTaxonomy.rest_base);
isPostTypeSupported: areTagsFetched && _isPostTypeSupported
const [hadTagsWhenOpeningThePanel] = (0,external_wp_element_namespaceObject.useState)(hasTags);
if (!isPostTypeSupported) {
* We only want to show the tag panel if the post didn't have
* any tags when the user hit the Publish button.
* We can't use the prop.hasTags because it'll change to true
* if the user adds a new tag within the pre-publish panel.
* This would force a re-render and a new prop.hasTags check,
* hiding this panel and keeping the user from adding
if (!hadTagsWhenOpeningThePanel) {
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TagsPanel, {});
/* harmony default export */ const maybe_tags_panel = (MaybeTagsPanel);
;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-post-format-panel.js
const getSuggestion = (supportedFormats, suggestedPostFormat) => {
const formats = POST_FORMATS.filter(format => supportedFormats?.includes(format.id));
return formats.find(format => format.id === suggestedPostFormat);
const PostFormatSuggestion = ({
}) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
onClick: () => onUpdatePostFormat(suggestedPostFormat),
function PostFormatPanel() {
} = (0,external_wp_data_namespaceObject.useSelect)(select => {
var _select$getThemeSuppo;
const supportedFormats = (_select$getThemeSuppo = select(external_wp_coreData_namespaceObject.store).getThemeSupports().formats) !== null && _select$getThemeSuppo !== void 0 ? _select$getThemeSuppo : [];
currentPostFormat: getEditedPostAttribute('format'),
suggestion: getSuggestion(supportedFormats, getSuggestedPostFormat())
} = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
const onUpdatePostFormat = format => editPost({
const panelBodyTitle = [(0,external_wp_i18n_namespaceObject.__)('Suggestion:'), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {
className: "editor-post-publish-panel__link",
children: (0,external_wp_i18n_namespaceObject.__)('Use a post format')
if (!suggestion || suggestion.id === currentPostFormat) {
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.PanelBody, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", {
children: (0,external_wp_i18n_namespaceObject.__)('Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.')
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PostFormatSuggestion, {
onUpdatePostFormat: onUpdatePostFormat,
suggestedPostFormat: suggestion.id,
suggestionText: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: post format */
(0,external_wp_i18n_namespaceObject.__)('Apply the "%1$s" format.'), suggestion.caption)
;// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/hierarchical-term-selector.js
const hierarchical_term_selector_DEFAULT_QUERY = {
_fields: 'id,name,parent',
const MIN_TERMS_COUNT_FOR_FILTER = 8;
const hierarchical_term_selector_EMPTY_ARRAY = [];
* Sort Terms by Selected.
* @param {Object[]} termsTree Array of terms in tree format.
* @param {number[]} terms Selected terms.
* @return {Object[]} Sorted array of terms.
function sortBySelected(termsTree, terms) {
const treeHasSelection = termTree => {
if (terms.indexOf(termTree.id) !== -1) {
if (undefined === termTree.children) {
return termTree.children.map(treeHasSelection).filter(child => child).length > 0;
const termOrChildIsSelected = (termA, termB) => {
const termASelected = treeHasSelection(termA);
const termBSelected = treeHasSelection(termB);
if (termASelected === termBSelected) {
if (termASelected && !termBSelected) {
if (!termASelected && termBSelected) {
const newTermTree = [...termsTree];
newTermTree.sort(termOrChildIsSelected);
* Find term by parent id or name.
* @param {Object[]} terms Array of Terms.
* @param {number|string} parent id.
* @param {string} name Term name.
* @return {Object} Term object.
function findTerm(terms, parent, name) {
return terms.find(term => {
return (!term.parent && !parent || parseInt(term.parent) === parseInt(parent)) && term.name.toLowerCase() === name.toLowerCase();
* Get filter matcher function.
* @param {string} filterValue Filter value.
* @return {(function(Object): (Object|boolean))} Matcher function.
function getFilterMatcher(filterValue) {
const matchTermsForFilter = originalTerm => {
if ('' === filterValue) {
// Shallow clone, because we'll be filtering the term's children and
// don't want to modify the original term.
// Map and filter the children, recursive so we deal with grandchildren
// and any deeper levels.
if (term.children.length > 0) {
term.children = term.children.map(matchTermsForFilter).filter(child => child);
// If the term's name contains the filterValue, or it has children
// (i.e. some child matched at some point in the tree) then return it.
if (-1 !== term.name.toLowerCase().indexOf(filterValue.toLowerCase()) || term.children.length > 0) {
// Otherwise, return false. After mapping, the list of terms will need
// to have false values filtered out.
return matchTermsForFilter;
* Hierarchical term selector.
* @param {Object} props Component props.
* @param {string} props.slug Taxonomy slug.
* @return {Element} Hierarchical term selector component.
function HierarchicalTermSelector({
var _taxonomy$labels$sear, _taxonomy$name;
const [adding, setAdding] = (0,external_wp_element_namespaceObject.useState)(false);
const [formName, setFormName] = (0,external_wp_element_namespaceObject.useState)('');
* @type {[number|'', Function]}
const [formParent, setFormParent] = (0,external_wp_element_namespaceObject.useState)('');
const [showForm, setShowForm] = (0,external_wp_element_namespaceObject.useState)(false);
const [filterValue, setFilterValue] = (0,external_wp_element_namespaceObject.useState)('');
const [filteredTermsTree, setFilteredTermsTree] = (0,external_wp_element_namespaceObject.useState)([]);
const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500);
} = (0,external_wp_data_namespaceObject.useSelect)(select => {
var _post$_links, _post$_links2;
} = select(external_wp_coreData_namespaceObject.store);
const _taxonomy = getTaxonomy(slug);
const post = getCurrentPost();
hasCreateAction: _taxonomy ? (_post$_links = post._links?.['wp:action-create-' + _taxonomy.rest_base]) !== null && _post$_links !== void 0 ? _post$_links : false : false,
hasAssignAction: _taxonomy ? (_post$_links2 = post._links?.['wp:action-assign-' + _taxonomy.rest_base]) !== null && _post$_links2 !== void 0 ? _post$_links2 : false : false,
terms: _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : hierarchical_term_selector_EMPTY_ARRAY,
loading: isResolving('getEntityRecords', ['taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY]),
availableTerms: getEntityRecords('taxonomy', slug, hierarchical_term_selector_DEFAULT_QUERY) || hierarchical_term_selector_EMPTY_ARRAY,
} = (0,external_wp_data_namespaceObject.useDispatch)(store_store);
} = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store);
const availableTermsTree = (0,external_wp_element_namespaceObject.useMemo)(() => sortBySelected(buildTermsTree(availableTerms), terms),
// Remove `terms` from the dependency list to avoid reordering every time
// checking or unchecking a term.
} = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
* @param {Object} term Term object.
* @return {Promise} A promise that resolves to save term object.
const addTerm = term => {
return saveEntityRecord('taxonomy', slug, term, {
* @param {number[]} termIds Term ids.
const onUpdateTerms = termIds => {
[taxonomy.rest_base]: termIds
* Handler for checking term.
const onChange = termId => {
const hasTerm = terms.includes(termId);
const newTerms = hasTerm ? terms.filter(id => id !== termId) : [...terms, termId];
const onChangeFormName = value => {
* Handler for changing form parent.
* @param {number|''} parentId Parent post id.
const onChangeFormParent = parentId => {
const onToggleForm = () => {
const onAddTerm = async event => {
var _taxonomy$labels$sing;
if (formName === '' || adding) {
// Check if the term we are adding already exists.
const existingTerm = findTerm(availableTerms, formParent, formName);
// If the term we are adding exists but is not selected select it.
if (!terms.some(term => term === existingTerm.id)) {
onUpdateTerms([...terms, existingTerm.id]);
newTerm = await addTerm({
parent: formParent ? formParent : undefined
createErrorNotice(error.message, {
const defaultName = slug === 'category' ? (0,external_wp_i18n_namespaceObject.__)('Category') : (0,external_wp_i18n_namespaceObject.__)('Term');
const termAddedMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: taxonomy name */
(0,external_wp_i18n_namespaceObject._x)('%s added', 'term'), (_taxonomy$labels$sing = taxonomy?.labels?.singular_name) !== null && _taxonomy$labels$sing !== void 0 ? _taxonomy$labels$sing : defaultName);
(0,external_wp_a11y_namespaceObject.speak)(termAddedMessage, 'assertive');
onUpdateTerms([...terms, newTerm.id]);
const setFilter = value => {
const newFilteredTermsTree = availableTermsTree.map(getFilterMatcher(value)).filter(term => term);
const getResultCount = termsTree => {
for (let i = 0; i < termsTree.length; i++) {
if (undefined !== termsTree[i].children) {
count += getResultCount(termsTree[i].children);
setFilteredTermsTree(newFilteredTermsTree);
const resultCount = getResultCount(newFilteredTermsTree);
const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results */
(0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', resultCount), resultCount);
debouncedSpeak(resultsFoundMessage, 'assertive');
const renderTerms = renderedTerms => {
return renderedTerms.map(term => {
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", {
className: "editor-post-taxonomies__hierarchical-terms-choice",
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.CheckboxControl, {
__nextHasNoMarginBottom: true,
checked: terms.indexOf(term.id) !== -1,
const termId = parseInt(term.id, 10);
label: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(term.name)
}), !!term.children.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "editor-post-taxonomies__hierarchical-terms-subchoices",
children: renderTerms(term.children)
const labelWithFallback = (labelProperty, fallbackIsCategory, fallbackIsNotCategory) => {
var _taxonomy$labels$labe;
return (_taxonomy$labels$labe = taxonomy?.labels?.[labelProperty]) !== null && _taxonomy$labels$labe !== void 0 ? _taxonomy$labels$labe : slug === 'category' ? fallbackIsCategory : fallbackIsNotCategory;
const newTermButtonLabel = labelWithFallback('add_new_item', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term'));
const newTermLabel = labelWithFallback('new_item_name', (0,external_wp_i18n_namespaceObject.__)('Add new category'), (0,external_wp_i18n_namespaceObject.__)('Add new term'));
const parentSelectLabel = labelWithFallback('parent_item', (0,external_wp_i18n_namespaceObject.__)('Parent Category'), (0,external_wp_i18n_namespaceObject.__)('Parent Term'));
const noParentOption = `— ${parentSelectLabel} —`;
const newTermSubmitLabel = newTermButtonLabel;
const filterLabel = (_taxonomy$labels$sear = taxonomy?.labels?.search_items) !== null && _taxonomy$labels$sear !== void 0 ? _taxonomy$labels$sear : (0,external_wp_i18n_namespaceObject.__)('Search Terms');
const groupLabel = (_taxonomy$name = taxonomy?.name) !== null && _taxonomy$name !== void 0 ? _taxonomy$name : (0,external_wp_i18n_namespaceObject.__)('Terms');
const showFilter = availableTerms.length >= MIN_TERMS_COUNT_FOR_FILTER;
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, {
children: [showFilter && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, {
__nextHasNoMarginBottom: true,
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "editor-post-taxonomies__hierarchical-terms-list",
"aria-label": groupLabel,
children: renderTerms('' !== filterValue ? filteredTermsTree : availableTermsTree)
}), !loading && hasCreateAction && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
className: "editor-post-taxonomies__hierarchical-terms-add",
"aria-expanded": showForm,
children: newTermButtonLabel
}), showForm && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("form", {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.Flex, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TextControl, {
__next40pxDefaultSize: true,
__nextHasNoMarginBottom: true,
className: "editor-post-taxonomies__hierarchical-terms-input",
onChange: onChangeFormName,
}), !!availableTerms.length && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.TreeSelect, {
__next40pxDefaultSize: true,
__nextHasNoMarginBottom: true,
label: parentSelectLabel,
noOptionLabel: noParentOption,
onChange: onChangeFormParent,
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.FlexItem, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.Button, {
__next40pxDefaultSize: true,
className: "editor-post-taxonomies__hierarchical-terms-submit",