{"id":233369,"date":"2023-02-13T17:27:00","date_gmt":"2023-02-13T14:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233369"},"modified":"2022-11-10T20:43:32","modified_gmt":"2022-11-10T17:43:32","slug":"wordpress-handledning-anpassad-meny-foer-inlaegg-eller-sidor-i-sidofaeltet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-handledning-anpassad-meny-foer-inlaegg-eller-sidor-i-sidofaeltet\/","title":{"rendered":"WordPress handledning: Anpassad meny f\u00f6r inl\u00e4gg eller sidor i sidof\u00e4ltet"},"content":{"rendered":"\n<p>Det h\u00e4r inl\u00e4gget \u00e4r f\u00f6r dig som hanterar en WordPress-sajt som har mycket inneh\u00e5ll, eventuellt m\u00e5nga sidor strukturerade i hierarki, och \u00f6nskar b\u00e4ttre navigering utanf\u00f6r huvudmenyn. F\u00f6r att hj\u00e4lpa till att navigera p\u00e5 webbplatsen kommer en anpassad meny relaterad till det aktuella inl\u00e4gget att hj\u00e4lpa enormt. Problemet med att placera en menywidget i sidof\u00e4ltet (eller var du vill) \u00e4r att sidof\u00e4ltet \u00e4r vanligt. I det h\u00e4r inl\u00e4gget kommer vi att l\u00e4ra oss hur du visar en extra anpassad meny i sidof\u00e4ltet, genom att till\u00e5ta inl\u00e4gg, sidor eller anpassade inl\u00e4ggstyper att v\u00e4lja en meny.<\/p>\n<p>L\u00e4gg till koden nedan i ditt teman <code>functions.php<\/code>eller i din plugin-kod.<\/p>\n<h2>Till\u00e5t inl\u00e4gg eller sidor att v\u00e4lja en meny<\/h2>\n<p>Det \u00e4r enkelt att skapa menyer i WordPress, och du kan anv\u00e4nda menywidgeten f\u00f6r att visa en meny i sidof\u00e4ltet. Problemet \u00e4r att sidof\u00e4ltet \u00e4r globalt och samma meny kommer att visas \u00f6verallt. Vad h\u00e4nder om du vill att specifika menyer ska visas p\u00e5 specifika sidor? Du kommer ocks\u00e5 att l\u00e4ra dig hur du kan se till att den valda menyn \u00e4rvs av underordnade sidor. P\u00e5 s\u00e5 s\u00e4tt beh\u00f6ver du bara v\u00e4lja menyn p\u00e5 den \u00f6verordnade sidan. Alla undersidor kommer ocks\u00e5 att visa samma meny utan att beh\u00f6va redigera alla.<\/p>\n<h3>L\u00e4gga till en metabox f\u00f6r att v\u00e4lja meny<\/h3>\n<p>Det f\u00f6rsta steget \u00e4r att skapa en metabox p\u00e5 inl\u00e4gg eller sidor d\u00e4r vi f\u00e5r m\u00f6jlighet att v\u00e4lja en meny. Vi anv\u00e4nder funktionen <code>add_meta_box()<\/code>och best\u00e4mmer vilka inl\u00e4ggstyper vi vill visa den f\u00f6r.<\/p>\n<pre><code>add_action('add_meta_boxes', function() {\n    add_meta_box('metabox-sidebar-menu', __('Sidebar Menu', 'txtdomain'), 'awp_sidebar_menu_metabox_callback', ['post', 'page']);\n});<\/code><\/pre>\n<p>Justera ovanst\u00e5ende kod till den titel och inl\u00e4ggstyper du vill ha. Ovanst\u00e5ende exempel kommer att l\u00e4gga till metaboxen till b\u00e5de inl\u00e4gg och sidor. Den tredje parametern, vad jag har kallat <code>awp_sidebar_menu_metabox_callback<\/code>, \u00e4r funktionen som ansvarar f\u00f6r att rendera metaboxens inneh\u00e5ll. L\u00e5t oss definiera det h\u00e4rn\u00e4st. Det h\u00e4r \u00e4r vad vi beh\u00f6ver g\u00f6ra i v\u00e5r metabox:<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n\u00a0\n    \/\/ Get the current saved menu, if set\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n}<\/code><\/pre>\n<p>Vi kan f\u00e5 en array med alla sparade menyer i WordPress med <code>wp_get_nav_menus()<\/code>. N\u00e4r det g\u00e4ller att h\u00e4mta aktuell vald meny lagrar vi den valda menyn som en postmeta i <code>awp_sidebar_menu<\/code>(kalla det vad du vill), och vi h\u00e4mtar helt enkelt v\u00e4rdet baserat p\u00e5 str\u00f6mmen <code>$post<\/code>som tillhandah\u00e5lls oss i metabox-funktionen. Vi kommer att spara meny-ID eftersom det \u00e4r allt vi beh\u00f6ver f\u00f6r att visa en meny. Och sedan matar vi ut HTML f\u00f6r ett urval som g\u00e5r igenom menyerna. HTML-utg\u00e5ngen f\u00f6r metaboxen \u00e4r verkligen upp till dig, nedan \u00e4r ett exempel. Jag har inkluderat nonce-funktionalitet f\u00f6r s\u00e4kerhet ocks\u00e5.<\/p>\n<pre><code>function awp_sidebar_menu_metabox_callback($post) {\n    \/\/ Get all menus\n    $menus = wp_get_nav_menus();\n\u00a0\n    \/\/ Get the current saved menu, if set\n    $current_selected = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n\u00a0\n    \/\/ Output HTML with a select showing all menus, and mark the currently saved one as selected\n    wp_nonce_field('awp_sidebar_menu_metabox_nonce', 'awp_sidebar_menu_nonce');\n    ?&gt;&lt;div class=\"awp-metabox-item\"&gt;\n        &lt;div class=\"awp-metabox-label\"&gt;&lt;label&gt;&lt;?php _e('Choose menu', 'txtdomain'); ?&gt;&lt;\/label&gt;&lt;\/div&gt;\n        &lt;div class=\"awp-metabox-input\"&gt;&lt;?php\n        if (empty($menus)) {\n            echo '&lt;p&gt;'. __('No menus created.', 'txtdomain'). '&lt;\/p&gt;';\n        } else { ?&gt;\n            &lt;select name=\"awp-sidebar-menu\" id=\"awp-sidebar-menu\"&gt;\n                &lt;?php \n                echo '&lt;option value=\"\"&gt;'. __('Choose menu', 'txtdomain'). '&lt;\/option&gt;';\n                foreach ($menus as $menu) { \n                    echo '&lt;option value=\"'. $menu-&gt;term_id. '\" '.selected($current_selected, $menu-&gt;term_id).'&gt;'.$menu-&gt;name.'&lt;\/option&gt;';\n                } ?&gt;\n            &lt;\/select&gt;\n        &lt;?php } ?&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;&lt;?php\n}<\/code><\/pre>\n<p>I HTML-utg\u00e5ngen skriver jag ut en etikett. Om det inte finns n\u00e5gra sparade menyer i WordPress alls, kommer det helt enkelt att visa ett stycke. Annars genereras ett urval med meny-ID:n som v\u00e4rden och menynamn som etikett. Jag l\u00e4gger ocks\u00e5 till ett tomt val f\u00f6r att till\u00e5ta att inl\u00e4gg inte visar en meny. Jag anv\u00e4nder WordPresss hj\u00e4lpfunktion <code>[selected](https:\/\/developer.wordpress.org\/reference\/functions\/selected\/)()<\/code>f\u00f6r att hantera att markera det aktuella sparade alternativet som valt.<\/p>\n<p>Om du redigerar ett inl\u00e4gg eller en sida b\u00f6r du se metaboxen visas l\u00e4ngst ner, som visar ditt val. Grymt bra! Men vid denna tidpunkt kommer det f\u00f6r n\u00e4rvarande inte att spara ditt menyval n\u00e4r du sparar inl\u00e4gget. Det \u00e4r n\u00e4sta steg.<\/p>\n<h3>Sparar menyvalet<\/h3>\n<p>Vi anv\u00e4nder kroken <code>save_post<\/code>f\u00f6r att skapa en funktion som sparar alla val vi har lagt till i v\u00e5r metabox. Kroken <code>save_post<\/code>utl\u00f6ses varje g\u00e5ng ett inl\u00e4gg sparas eller uppdateras. Vi kontrollerar nonce f\u00f6rst (om du \u00e4r os\u00e4ker p\u00e5 vad nonces \u00e4r, kolla denna <a href=\"https:\/\/codex.wordpress.org\/WordPress_Nonces\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress-guide om nonces<\/a> ). Vi dubbelkollar sedan om anv\u00e4ndaren f\u00e5r uppdatera inl\u00e4gg och uppdaterar v\u00e5r inl\u00e4ggsmeta med valet.<\/p>\n<pre><code>add_action('save_post', function($post_id) {\n    if (!isset($_POST['awp_sidebar_menu_nonce']) || !wp_verify_nonce($_POST['awp_sidebar_menu_nonce'], 'awp_sidebar_menu_metabox_nonce')) {\n        return;\n    }\n\u00a0\n    if (!current_user_can('edit_post', $post_id)) {\n        return;\n    }\n\u00a0\n    update_post_meta($post_id, 'awp_sidebar_menu', $_POST['awp-sidebar-menu']);\n});<\/code><\/pre>\n<p>Nu n\u00e4r du uppdaterar inl\u00e4gg sparar den ocks\u00e5 ditt val av meny.<\/p>\n<p>Och det var allt f\u00f6r inl\u00e4ggsvalsdelen. N\u00e4sta steg \u00e4r faktiskt att mata ut menyn om en meny har valts.<\/p>\n<h3>V\u00e4lja en position f\u00f6r den anpassade menyn<\/h3>\n<p>Jag l\u00e4gger till utdata i sidof\u00e4ltet, men du kan mata ut det var som helst i ditt temas mallar. Vi beh\u00f6ver bara antingen en f\u00f6rdefinierad krok eller definiera v\u00e5r egen. Som ett exempel l\u00e4gger jag till en anpassad krok \u00f6verst i sidof\u00e4ltet, s\u00e5 att jag kan skapa en funktion kopplad till denna.<\/p>\n<p>Du kan helt enkelt ringa <code>wp_nav_menu()<\/code>direkt i mallen men jag rekommenderar att du skapar en anpassad krok ist\u00e4llet eftersom vi kommer att l\u00e4gga till en hel del kod och det kan verka r\u00f6rigt.<\/p>\n<p>I mitt tema redigerar jag <code>sidebar.php<\/code>och precis innan <code>dynamic_sidebar()<\/code>med sidof\u00e4ltet kallas (d\u00e4r widgets l\u00e4ggs till), l\u00e4gger jag till min anpassade krok med <code>do_action()<\/code>och ett givet namn. Du kan kalla det vad du vill, men det m\u00e5ste vara unikt inom WordPress. S\u00e5 prefix det \u00e5tminstone med n\u00e5got unikt f\u00f6r dig.<\/p>\n<pre><code>&lt;aside class=\"sidebar\"&gt;\n    &lt;?php \n    do_action('awp_before_sidebar');\n    dynamic_sidebar('left-sidebar'); \n    ?&gt;\n&lt;\/aside&gt;<\/code><\/pre>\n<h3>Rendering av menyn<\/h3>\n<p>Nu kan vi g\u00e5 tillbaka till <code>functions.php<\/code>, definiera en funktion kopplad till <code>awp_before_sidebar<\/code>och dess utdata kommer att visas i sidof\u00e4ltet f\u00f6re widgetarna. Funktionen kommer att anv\u00e4nda <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags#A_Single_Page.2C_a_Single_Post.2C_an_Attachment_or_Any_Other_Custom_Post_Type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress villkorliga taggar<\/a> f\u00f6r att kontrollera om vi f\u00f6r n\u00e4rvarande visar ett enskilt inl\u00e4gg eller en sida. Och i s\u00e5 fall h\u00e4mtar jag v\u00e5r postmeta. Om post-meta var inst\u00e4lld matar vi ut menyn genom att anropa <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>och ange det sparade meny-ID som <code>menu<\/code>parameter.<\/p>\n<pre><code>add_action('awp_before_sidebar', function() {\n    if (is_singular()) {\n        global $post;\n\u00a0\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ?&gt;&lt;section class=\"widget awp-sidebar-menu\"&gt;\n            &lt;?php wp_nav_menu(['menu' =&gt; $sidebar_menu]); ?&gt;\n        &lt;\/section&gt;&lt;?php\n    }\n});<\/code><\/pre>\n<p>Du b\u00f6r justera HTML-koden runt menyn s\u00e5 att den passar in i resten av inneh\u00e5llet. I koden ovan sl\u00e5r jag in menyn i samma HTML som alla widgets i sidof\u00e4ltet \u00e4r inslagna i s\u00e5 att temats widget-styling g\u00e4ller f\u00f6r v\u00e5r anpassade meny.<\/p>\n<p>Det \u00e4r allt! N\u00e4r du v\u00e4ljer en meny i ett inl\u00e4gg eller sida kommer menyn att visas ovanf\u00f6r sidof\u00e4ltet n\u00e4r du tittar p\u00e5 inl\u00e4gget eller sidan.<\/p>\n<p>Vi kan dock ta det ett steg l\u00e4ngre. Om du vill att barnsidor ska visa samma sidof\u00e4ltsmeny i n\u00e5gon av f\u00f6r\u00e4ldrarna, l\u00e4s vidare.<\/p>\n<h2>Till\u00e5t underordnade sidor att \u00e4rva f\u00f6r\u00e4lderns meny<\/h2>\n<p>Denna extra funktion \u00e4r vettig om du har m\u00e5nga sidor i en hierarki, eller en anpassad inl\u00e4ggstyp med hierarki aktiverad. Det skulle vara f\u00f6r kr\u00e5ngligt att redigera varje enskild underordnad sida och v\u00e4lja samma meny. I s\u00e5 fall \u00e4r det b\u00e4ttre att v\u00e4lja menyn p\u00e5 den \u00f6verordnade sidan och automatiskt l\u00e5ta alla undersidor &quot;\u00e4rva&quot; det menyvalet. Om n\u00e5gon undersida v\u00e4ljer en annan meny kommer den menyn att visas ist\u00e4llet f\u00f6r den &quot;\u00e4rvda&quot; en g\u00e5ng.<\/p>\n<p>Inuti v\u00e5r funktion kopplad till <code>awp_before_sidebar<\/code>, l\u00e4gger vi till en kodbit, i kontrollen om vi tittar p\u00e5 ett enskilt inl\u00e4gg eller en sida:<\/p>\n<pre><code>        ...\n        $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n        if (!empty($sidebar_menu)) {\n            $parents = get_post_ancestors($post-&gt;ID);\n            if (!empty($parents)) {\n                \/\/ go step by step up the parents tree\n                for ($i = 0; $i &lt; count($parents); $i++) {\n                    $sidebar_menu = get_post_meta($post-&gt;ID, 'awp_sidebar_menu', true);\n                    if (!empty($sidebar_menu)) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\u00a0\n    if (!empty($sidebar_menu)) {\n        ...<\/code><\/pre>\n<p>Vad ovanst\u00e5ende kod g\u00f6r om ingen meny hittades p\u00e5 den aktuella sidan h\u00e4mtar alla f\u00f6r\u00e4ldrar med <code>[get_post_ancestors](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_ancestors\/)()<\/code>. Den h\u00e4r funktionen returnerar en upps\u00e4ttning av f\u00f6r\u00e4ldrapost-ID:n sorterade efter n\u00e4rmaste f\u00f6r\u00e4lder f\u00f6rst. Om sidan inte har n\u00e5gra f\u00f6r\u00e4ldrar (till exempel om det \u00e4r ett inl\u00e4gg) returneras en tom array. Och om det finns n\u00e5gra f\u00f6r\u00e4ldrar g\u00e5r vi igenom varje f\u00f6r\u00e4lder en efter en och kollar om de har satt v\u00e5r postmeta. Om en hittas bryter vi ut fr\u00e5n att korsa f\u00f6r\u00e4ldrarna och <code>$sidebar_menu<\/code>kommer att st\u00e4llas in och menyn kommer att matas ut senare med <code>wp_nav_menu()<\/code>.<\/p>\n<p>Och det \u00e4r allt f\u00f6r &quot;arvs&quot;-funktionen!<\/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 det h\u00e4r inl\u00e4gget kommer vi att l\u00e4ra oss hur du visar en anpassad meny i sidof\u00e4ltet (eller var du \u00e4n vill) genom att till\u00e5ta inl\u00e4gg eller sidor att v\u00e4lja en meny.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[932,724,838,848,922,1110,922,807,807,838,932,848,724,868,868],"tags":[1173],"class_list":{"0":"post-233369","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-aemnen","8":"category-utvecklaren","9":"category-guide-foer-nyboerjare","10":"category-handledningar","11":"category-oevrig","12":"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\/233369","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=233369"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233369\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}