{"id":233319,"date":"2023-02-11T14:41:00","date_gmt":"2023-02-11T11:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233319"},"modified":"2022-11-10T20:27:31","modified_gmt":"2022-11-10T17:27:31","slug":"laegg-till-anvaendarvaenliga-anpassade-metainstaellningar-till-wordpress-menyalternativ","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/laegg-till-anvaendarvaenliga-anpassade-metainstaellningar-till-wordpress-menyalternativ\/","title":{"rendered":"L\u00e4gg till anv\u00e4ndarv\u00e4nliga anpassade metainst\u00e4llningar till WordPress-menyalternativ"},"content":{"rendered":"\n<p>I en ny WordPress-uppdatering \u00e4r det nu m\u00f6jligt och ganska enkelt att l\u00e4gga till anpassade metaf\u00e4lt till menyalternativ. I det h\u00e4r inl\u00e4gget kommer vi att l\u00e4ra oss hur du l\u00e4gger till v\u00e5ra anpassade inst\u00e4llningar till menyalternativ, uppdaterar deras inst\u00e4llningar och slutligen hur du tar metadata i bruk.<\/p>\n<p>Nyligen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/25\/wordpress-5-4-introduces-new-hooks-to-add-custom-fields-to-menu-items\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meddelade WordPress st\u00f6d f\u00f6r att l\u00e4gga till anpassade f\u00e4lt till menyalternativ<\/a> i version 5.4. Tv\u00e5 nya \u00e5tg\u00e4rder lades till som g\u00f6r det m\u00f6jligt f\u00f6r utvecklare att l\u00e4gga till anpassade f\u00e4lt i WordPress-menyadministrat\u00f6rssidan och i Customizers menyredigerare. I det h\u00e4r inl\u00e4gget kommer vi att fokusera p\u00e5 en av dem, den f\u00f6r WordPress-menyadministrat\u00f6rssidan.<\/p>\n<p>Med den h\u00e4r \u00e4ndringen finns det inte l\u00e4ngre behov av att tvinga tema- eller plugin-anv\u00e4ndare att komma ih\u00e5g och skriva ut klassnamn f\u00f6r att aktivera menyalternativet &quot;inst\u00e4llningar&quot;. Detta har hittills varit en vanlig process f\u00f6r saker som att f\u00e5 en menypost att se ut som en knapp eller byta mellan olika utformningar av dropdown. Ofta i kombination av en anpassad menyrullator.<\/p>\n<p>T\u00e4nk p\u00e5 att f\u00f6r att den h\u00e4r koden ska fungera kr\u00e4vs minst version 5.4.0 av WordPress.<\/p>\n<h2>Vad vi ska g\u00f6ra i den h\u00e4r handledningen<\/h2>\n<p>Med den nya krok till menyalternativ och WordPress st\u00f6d f\u00f6r att l\u00e4gga till metadata till menyalternativ finns det egentligen ingen gr\u00e4ns f\u00f6r vilken typ av inst\u00e4llningar du vill ha. Processen beror p\u00e5 vad ditt slutresultat \u00e4r. I de flesta fall r\u00e4cker det att l\u00e4gga till en anpassad CSS-klass till menyalternativet.<\/p>\n<p>F\u00f6r att g\u00f6ra det enkelt kommer vi i det h\u00e4r inl\u00e4gget att l\u00e4gga till en kryssruta m\u00e4rkt &quot;Visa som knapp&quot;. I v\u00e5rt tema har vi CSS som kommer att utforma ett menyobjekt s\u00e5 att det ser ut som en (uppmaning) knapp om objektet har en viss klass. Ist\u00e4llet f\u00f6r att tvinga temaanv\u00e4ndaren att skriva ut CSS-klassen &quot;meny-objekt-knapp&quot; i menyobjektets CSS-klassf\u00e4lt i admin, erbjuder vi dem en anv\u00e4ndarv\u00e4nlig kryssruta.<\/p>\n<p>I slutet av det h\u00e4r inl\u00e4gget hittar du n\u00e5gra id\u00e9er till andra \u00e5tg\u00e4rder och filter att anv\u00e4nda om du vill g\u00f6ra mer \u00e4n att bara l\u00e4gga till en CSS-klass.<\/p>\n<p>L\u00e5t oss b\u00f6rja!<\/p>\n<h2>L\u00e4gga till anpassade f\u00e4lt till menyalternativ<\/h2>\n<p>Den nya kroken som nyligen lagts till \u00e4r <code>[wp_nav_menu_item_custom_fields](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_nav_menu_item_custom_fields\/)<\/code>. Det \u00e4r en krok som avfyras precis ovanf\u00f6r ett menyobjekts flyttknappar;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e51560662d6.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e51560662d6.png\" alt=\"L\u00e4gg till anv\u00e4ndarv\u00e4nliga anpassade metainst\u00e4llningar till WordPress-menyalternativ\" ><\/a><\/p>\n<p>Kroken kommer med inte mindre \u00e4n fem parametrar. I det h\u00e4r inl\u00e4gget kommer vi att g\u00f6ra saker som bara kr\u00e4ver de tv\u00e5 f\u00f6rst.<\/p>\n<ul>\n<li><code>item_id<\/code>: Aktuellt menyalternativ ID<\/li>\n<li><code>item<\/code>: Menyalternativ dataobjekt<\/li>\n<li><code>depth<\/code>: Djupet av menyalternativet i menyn, betecknat som ett heltal<\/li>\n<li><code>args<\/code>: Ett objekt med menyalternativsargument<\/li>\n<li><code>nav_id<\/code>: Navigeringsmenyns ID<\/li>\n<\/ul>\n<p>Alla ing\u00e5ngar som l\u00e4ggs till i denna krok m\u00e5ste ha ett <code>name<\/code>attribut (eftersom menyredigeraren \u00e4r en form). Namnattributet kan heta vad du vill men det m\u00e5ste vara unikt, och du m\u00e5ste l\u00e4gga till menyalternativets ID (f\u00f6rsta parametern) inom parentes. T.ex. <code>name=\"my-custom-field[&lt;item ID&gt;]<\/code>&quot;. S\u00e5 h\u00e4r g\u00f6r de andra standardinst\u00e4llningarna f\u00f6r menyalternativ.<\/p>\n<p>L\u00e5t oss b\u00f6rja med ett exempel p\u00e5 att l\u00e4gga till en kryssruta f\u00f6r att f\u00e5 menyalternativet att se ut som en knapp n\u00e4r menyn placeras som huvudmeny. Vi kopplar in <code>wp_nav_menu_item_custom_fields<\/code>med bara de tv\u00e5 f\u00f6rsta parametrarna och g\u00f6r f\u00f6ljande:<\/p>\n<pre><code>add_action('wp_nav_menu_item_custom_fields', function($item_id, $item) {\n    $show_as_button = get_post_meta($item_id, '_show-as-button', true);\n    ?&gt;\n    &lt;p class=\"awp-show-as-button description description-wide\"&gt;\n        &lt;label for=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" &gt;\n            &lt;input type=\"checkbox\" \n                id=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" \n                name=\"awp-menu-item-button[&lt;?php echo $item_id; ?&gt;]\" \n                &lt;?php checked($show_as_button, true); ?&gt; \n            \/&gt;&lt;?php _e('Show as a button', 'awp'); ?&gt;\n        &lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}, 10, 2);<\/code><\/pre>\n<p>P\u00e5 raden <code>#2<\/code>h\u00e4mtar vi det aktuella v\u00e4rdet p\u00e5 v\u00e5r menypost meta. Menyalternativ anv\u00e4nder post meta s\u00e5 vi anv\u00e4nder <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>som du f\u00f6rmodligen redan \u00e4r bekant med. Vi lagrar menyalternativets metadata med knappen &#8217; <code>_show-as-button<\/code>&#8217;.<\/p>\n<p>Sedan g\u00e4ller det att eka fram lite bra HTML. Koden ovan anv\u00e4nder n\u00e5gra av klasserna som redan anv\u00e4nds f\u00f6r menyalternativ f\u00f6r att f\u00e5 det att se snyggt ut utan att l\u00e4gga till anpassad stil (en <code>p<\/code>tagg med klasserna &quot; <code>description description-wide<\/code>&quot;).<\/p>\n<p>De viktiga delarna h\u00e4nder vid linje <code>#8<\/code>och <code>#9<\/code>. Vi f\u00f6ljer regeln f\u00f6r namnattributet, l\u00e4gger till <code>$item_id<\/code>inom parentes, och vi ser till att det aktuella sparade v\u00e4rdet \u00e5terspeglas i kryssrutan. Du kan l\u00e4gga till alla typer av ing\u00e5ngar, och till och med flera ing\u00e5ngar h\u00e4r. Kom bara ih\u00e5g att ange l\u00e4mpligt <code>name<\/code>attribut och st\u00e4lla in deras aktuella v\u00e4rde korrekt.<\/p>\n<p>Med den h\u00e4r koden i ditt tema <code>functions.php<\/code>eller plugin-kod b\u00f6r du nu f\u00e5 en ny kryssruta f\u00f6r alla menyalternativ:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e5156147558.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e5156147558.png\" alt=\"L\u00e4gg till anv\u00e4ndarv\u00e4nliga anpassade metainst\u00e4llningar till WordPress-menyalternativ\" ><\/a><\/p>\n<p>F\u00f6r n\u00e4rvarande r\u00e4ddar det inte v\u00e5rt omr\u00e5de. Det \u00e4r n\u00e4sta steg.<\/p>\n<h2>Uppdaterar de anpassade f\u00e4lten<\/h2>\n<p>F\u00f6r att uppdatera anpassade f\u00e4lt till menyalternativ anv\u00e4nder vi kroken <code>[wp_update_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_update_nav_menu_item\/)<\/code>. Det kommer med tre argument men vi beh\u00f6ver bara det andra som \u00e4r menyalternativets ID.<\/p>\n<p>Hur du hanterar att spara v\u00e4rdet p\u00e5 dina input(s) \u00e4r upp till dig. Jag har valt att helt enkelt spara &#8217; <code>_show-as-button<\/code>&#8217; som antingen sant eller falskt. Anv\u00e4nd helt enkelt <code>[update_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/)()<\/code>och\/eller <code>[delete_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/delete_post_meta\/)()<\/code>.<\/p>\n<pre><code>add_action('wp_update_nav_menu_item', function($menu_id, $menu_item_db_id) {\n    $button_value = (isset($_POST['awp-menu-item-button'][$menu_item_db_id]) &amp;&amp; $_POST['awp-menu-item-button'][$menu_item_db_id] == 'on')? true: false;\n    update_post_meta($menu_item_db_id, '_show-as-button', $button_value);\n}, 10, 2);<\/code><\/pre>\n<p>I koden ovan h\u00e4mtar jag v\u00e4rdet p\u00e5 det anpassade f\u00e4ltet efter dess namn i <code>$_POST<\/code>arrayen. Eftersom det \u00e4r en kryssruta kommer den antingen inte att finnas i <code>$_POST<\/code>arrayen (omarkerad) eller s\u00e5 kommer den att returneras som &#8217; <code>on<\/code>&#8217;. Jag uppdaterar sedan meta-nyckeln &#8217; <code>_show-as-button<\/code>&#8217; som antingen sant eller falskt.<\/p>\n<p>Med ovanst\u00e5ende kod b\u00f6r du se att ditt f\u00e4lt uppdateras korrekt n\u00e4r du sparar menyn.<\/p>\n<p>N\u00e4sta steg \u00e4r att g\u00f6ra n\u00e5got \u00e5t \u200b\u200bv\u00e5r anpassade metadata. Och hur du g\u00e5r tillv\u00e4ga beror p\u00e5 vad ditt slutresultat \u00e4r. N\u00e4r det g\u00e4ller v\u00e5rt exempel \u00e4r allt vi beh\u00f6ver g\u00f6ra att l\u00e4gga till en anpassad klass till menyalternativet.<\/p>\n<h2>Uppdatera menyalternativ CSS-klass<\/h2>\n<p>WordPress erbjuder ett filter p\u00e5 menyobjektets klasser: <code>[nav_menu_css_class](https:\/\/developer.wordpress.org\/reference\/hooks\/nav_menu_css_class\/)<\/code>. Allt vi beh\u00f6ver g\u00f6ra \u00e4r att l\u00e4gga till en anpassad klass till arrayen med detta filter om v\u00e5r anpassade meta \u00e4r <code>true<\/code>. Vi anv\u00e4nder <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>f\u00f6r att f\u00e5 v\u00e4rdet av &#8217; <code>_show-as-button<\/code>&#8217; och om det \u00e4r sant l\u00e4gger vi till CSS-klassen &#8217; <code>menu-item-button<\/code>&#8217;:<\/p>\n<pre><code>add_filter('nav_menu_css_class', function($classes, $menu_item) {\n    $show_as_button = get_post_meta($menu_item-&gt;ID, '_show-as-button', true);\n    if ($show_as_button) {\n        $classes[] = 'menu-item-button';\n    }\n    return $classes;\n}, 10, 2);<\/code><\/pre>\n<p>Filtret <code>nav_menu_css_class<\/code>kommer med totalt fyra argument inklusive menyargumenten och menyalternativets djup. Om det beh\u00f6vs kan du f\u00e5 klassnamnen att p\u00e5verkas av dessa v\u00e4rden. Till exempel skulle det vanligtvis inte vara meningsfullt att omvandla ett menyobjekt till en knapp s\u00e5vida det inte \u00e4r p\u00e5 \u00f6versta niv\u00e5n (och inte i en meny-rullgardinsmeny).<\/p>\n<p>Med ovanst\u00e5ende kod b\u00f6r du nu se att alla menyalternativ som har markerat &quot;Visa som knapp&quot; kommer att f\u00e5 klassen &#8217; <code>menu-item-button<\/code>&#8217;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e515621cd00.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e515621cd00.png\" alt=\"L\u00e4gg till anv\u00e4ndarv\u00e4nliga anpassade metainst\u00e4llningar till WordPress-menyalternativ\" ><\/a><\/p>\n<p>T\u00e4nk p\u00e5: Du kan uppleva att <code>nav_menu_css_class<\/code>filtret inte till\u00e4mpas om menyn anv\u00e4nder en anpassad menyrullator som till exempel inneh\u00e5ller metoden <code>start_el()<\/code>. Walkern m\u00e5ste applicera <code>nav_menu_css_class<\/code>filtret p\u00e5 menyobjektets klasser (med <code>apply_filters()<\/code>) f\u00f6r att ovanst\u00e5ende filter ska fungera!<\/p>\n<h2>Annan anv\u00e4ndning av menyobjektets anpassade metaf\u00e4lt<\/h2>\n<p>Som n\u00e4mnts beror processen f\u00f6r att anv\u00e4nda de anpassade f\u00e4lten p\u00e5 slutresultatet. Det \u00e4r sv\u00e5rt att g\u00f6ra ett inl\u00e4gg som t\u00e4cker alla m\u00f6jligheter. Men det h\u00e4r borde \u00e5tminstone ge dig n\u00e5gra id\u00e9er. Exemplet ovan visade hur man helt enkelt l\u00e4gger till en anpassad klass till menyalternativet.<\/p>\n<p>I andra fall kanske du vill ta f\u00f6rhand av metadata i en meny walker. I de flesta funktioner i en meny walker har du tillg\u00e5ng till menypunkts-ID och d\u00e4rmed kan du enkelt h\u00e4mta metadata.<\/p>\n<p>Som ett alternativ till att anv\u00e4nda en anpassad menyrullator kan du anv\u00e4nda filtret <code>[wp_setup_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/functions\/wp_setup_nav_menu_item\/)<\/code>f\u00f6r mer kontroll \u00f6ver menyobjektet.<\/p>\n<p>Eller s\u00e5 kan du anv\u00e4nda filtret <code>[wp_get_nav_menu_items](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_nav_menu_items\/)<\/code>f\u00f6r att till exempel utesluta menyalternativ, om din inst\u00e4llning \u00e4r att begr\u00e4nsa menyalternativets synlighet.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I en ny WordPress-uppdatering \u00e4r det nu m\u00f6jligt och ganska enkelt att l\u00e4gga till anpassade metaf\u00e4lt till menyalternativ. I det h\u00e4r inl\u00e4gget l\u00e4r vi oss hur!<\/p>\n","protected":false},"author":1,"featured_media":223830,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[932,901,724,838,848,901,1110,807,807,838,932,848,724,868,868],"tags":[1173],"class_list":{"0":"post-233319","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-aemnen","8":"category-koda","9":"category-utvecklaren","10":"category-guide-foer-nyboerjare","11":"category-handledningar","13":"category-n-a","14":"category-php-9","20":"category-wordpress-9","22":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233319"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233319\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223830"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}