WordPress

menu — Jak uzyskać i ustawić meta postu dla łącza podstawowego/nawigacyjnego?

  • 29 stycznia, 2024
  • 3 min read
menu — Jak uzyskać i ustawić meta postu dla łącza podstawowego/nawigacyjnego?


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).

Warto przeczytać!  zaawansowane pola niestandardowe — Zastąp wiele komponentów RichText jednym blokiem — właściwość wielowierszowa wp.blockEditor.RichText jest przestarzała

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:


Źródło