menu — Jak uzyskać i ustawić meta postu dla łącza podstawowego/nawigacyjnego?
![menu — Jak uzyskać i ustawić meta postu dla łącza podstawowego/nawigacyjnego?](https://oen.pl/wp-content/uploads/2023/09/apple-touch-icon@2.png)
Rozszerzam wtyczkę, która aktualizowała elementy menu nawigacyjnego o metadane postów. Robiono to wcześniej poprzez Wygląd>Menu i wygląd>Dostosuj za pomocą wp_nav_menu_item_custom_fields
I wp_nav_menu_item_custom_fields_customize_template
działania. Pokazano dodatkowe pola (logiczne, numeryczne, listy rozwijane) dla elementów menu i zapisano je w meta postu. Moim celem jest teraz przedłużenie core/navigation-link
block z pewnymi atrybutami (wartości logiczne i numeryczne), aby to samo można było osiągnąć za pomocą nowego edytora FSE/blocks. Atrybuty te powinny zatem być zapisane w metadanych, tak aby niezależnie od tego, którą trasą się wybierzesz, zapisane zostaną te same dane.
Poprzez stare menu Wygląd>Menu (i Wygląd>Dostosuj) mieliśmy funkcje PHP get_post_meta
I update_post_meta
. Wymagało to jedynie identyfikatora elementu menu w celu aktualizacji metadanych elementu nawigacyjnego.
Teraz, jeśli się nie mylę, to samo można osiągnąć w FSE/Blockach za pomocą useEntityProp
metoda. Metoda ta przyjmuje cztery parametry: rodzaj, nazwę, rekwizyt, identyfikator.
Nie mogę jednak znaleźć odniesienia ani dokumentacji dotyczącej parametrów, które należy podać w przypadku elementów menu nawigacyjnego (obecnie jest to plik core/navigation-link
blok).
Znalazłem to źródło, ale dostarczam rodzaj =root
i imię=menuItem
do metody zwraca zerowe metadane.
const [meta, updateMeta] = useEntityProp('root', 'menuItem', 'meta', props.attributes.id); // meta is null
Kontrolka niestandardowa jest renderowana poprawnie i używana setAttribute
działa w porządku. Ale jak uzyskać i ustawić metadane postu dla elementów menu nawigacji za pośrednictwem tej trasy?
const myExtraControls = createHigherOrderComponent((BlockEdit) => {
return (props) => {
// meta is returned null:
const [meta, updateMeta] = useEntityProp('root', 'menuItem', 'meta', props.attributes.id);
return (
<>
<BlockEdit key="edit" {...props} />
<InspectorControls>
<ToggleControl
label={wp.i18n.__('Some boolean', 'my-plugin')}
checked={!!meta.someboolean}
onChange={(newval) => updateMeta({ ...meta, someboolean: newVal })}
/>
</InspectorControls>
</>
);
};
}, 'withMyPluginControls');
wp.hooks.addFilter(
'editor.BlockEdit',
'my-plugin/my-block',
myExtraControls
);
Nadal meta
obiekt powraca undefined
. Cały obiekt jest niezdefiniowany, nie zawiera żadnych pól.
const [ meta, setMeta ] = useEntityProp( 'postType', 'menuItem', 'meta', props.attributes.id );
console.log('meta', meta); // undefined
Zgodnie z sugestią, poniżej możesz znaleźć pełny kod blokujący JSX oraz fragment kodu pokazujący rejestrację zasobów i register_meta
dzwoni.
core_navigation_link_block.jsx:
core_navigation_link_plugin.php: