{"id":233399,"date":"2023-02-13T17:33:00","date_gmt":"2023-02-13T14:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233399"},"modified":"2022-11-10T23:29:27","modified_gmt":"2022-11-10T20:29:27","slug":"wordpressi-opetus-kohandatud-menueue-kuelgribal-olevate-postituste-voi-lehtede-jaoks","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-opetus-kohandatud-menueue-kuelgribal-olevate-postituste-voi-lehtede-jaoks\/","title":{"rendered":"WordPressi \u00f5petus: kohandatud men\u00fc\u00fc k\u00fclgribal olevate postituste v\u00f5i lehtede jaoks"},"content":{"rendered":"\n<p>See postitus on m\u00f5eldud teile, kes haldate WordPressi saiti, millel on palju sisu, v\u00f5ib-olla palju hierarhias olevaid lehti, ja soovite paremat navigeerimist v\u00e4ljaspool peamen\u00fc\u00fcd. Saidil navigeerimise h\u00f5lbustamiseks aitab praeguse postitusega seotud kohandatud men\u00fc\u00fc tohutult. Men\u00fc\u00fcvidina k\u00fclgribale (v\u00f5i kuhu iganes soovite) paigutamise probleem seisneb selles, et k\u00fclgriba on tavaline. Sellest postitusest \u00f5pime, kuidas kuvada k\u00fclgribal t\u00e4iendavat kohandatud men\u00fc\u00fcd, lubades postitustel, lehtedel v\u00f5i kohandatud postituse t\u00fc\u00fcpidel men\u00fc\u00fc valida.<\/p>\n<p>Lisage allolev kood oma teemasse <code>functions.php<\/code>v\u00f5i pistikprogrammi koodi sisse.<\/p>\n<h2>Lubage postitustel v\u00f5i lehtedel men\u00fc\u00fc valida<\/h2>\n<p>Men\u00fc\u00fcde loomine WordPressis on lihtne ja saate k\u00fcljeribal men\u00fc\u00fc kuvamiseks kasutada vidinat Men\u00fc\u00fc. Probleem on selles, et k\u00fclgriba on globaalne ja k\u00f5ikjal kuvatakse sama men\u00fc\u00fc. Mida teha, kui soovite, et konkreetsetel lehtedel kuvatakse kindlad men\u00fc\u00fcd? Samuti saate teada, kuidas saate tagada, et valitud men\u00fc\u00fc p\u00e4randuks alamlehtedele. Nii pead valima ainult emalehel oleva men\u00fc\u00fc. K\u00f5ik alamlehed kuvavad ka sama men\u00fc\u00fcd, ilma et oleks vaja neid k\u00f5iki redigeerida.<\/p>\n<h3>Metaboksi lisamine men\u00fc\u00fc valimiseks<\/h3>\n<p>Esimene samm on postitustele v\u00f5i lehtedele metakasti loomine, kus saame men\u00fc\u00fc valida. Kasutame funktsiooni <code>add_meta_box()<\/code>ja otsustame, milliste postitust\u00fc\u00fcpide jaoks soovime seda n\u00e4idata.<\/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>Kohandage \u00fclaltoodud koodi soovitud pealkirja ja postituse t\u00fc\u00fcpide j\u00e4rgi. \u00dclaltoodud n\u00e4ide lisab metakasti nii postitustele kui ka lehtedele. Kolmas parameeter, mida ma nimetasin <code>awp_sidebar_menu_metabox_callback<\/code>, on funktsioon, mis vastutab metakasti sisu renderdamise eest. Defineerime selle j\u00e4rgmisena. Seda peame oma metakastis tegema:<\/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>K\u00f5igi WordPressi salvestatud men\u00fc\u00fcdega massiivi saame hankida rakendusega <code>wp_get_nav_menus()<\/code>. Mis puudutab praeguse valitud men\u00fc\u00fc toomist, salvestame valitud men\u00fc\u00fc postituse metana <code>awp_sidebar_menu<\/code>(nimetage seda kuidas iganes soovite) ja toome v\u00e4\u00e4rtuse lihtsalt selle v\u00e4\u00e4rtuse alusel, mis p\u00f5hineb <code>$post<\/code>meile metakasti funktsioonis. Salvestame men\u00fc\u00fc ID-d, sest see on k\u00f5ik, mida vajame men\u00fc\u00fc kuvamiseks. Ja siis v\u00e4ljastame HTML-i valiku jaoks, mis l\u00e4bib men\u00fc\u00fcsid. Metaboksi HTML-v\u00e4ljund on t\u00f5esti teie otsustada, allpool on n\u00e4ide. Lisasin turvalisuse huvides ka nonce-funktsiooni.<\/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>HTML-v\u00e4ljundis prindin v\u00e4lja sildi. Kui WordPressis pole salvestatud men\u00fc\u00fcsid \u00fcldse, kuvab see lihtsalt l\u00f5igu. Vastasel juhul luuakse valik, mille v\u00e4\u00e4rtusteks on men\u00fc\u00fc ID-d ja siltideks men\u00fc\u00fcde nimed. Lisan ka t\u00fchja valiku, et postitustel men\u00fc\u00fcd ei kuvataks. Kasutan WordPressi abifunktsiooni <code>[selected](https:\/\/developer.wordpress.org\/reference\/functions\/selected\/)()<\/code>, et hallata praeguse salvestatud valiku m\u00e4rgistamist.<\/p>\n<p>Kui muudate postitust v\u00f5i lehte, peaksite n\u00e4gema allservas metakasti, mis n\u00e4itab teie valikut. Vinge! Kuid praegu ei salvesta see postituse salvestamisel teie men\u00fc\u00fcvalikut. See on j\u00e4rgmine samm.<\/p>\n<h3>Men\u00fc\u00fcvaliku salvestamine<\/h3>\n<p>Kasutame konksu <code>save_post<\/code>, et luua funktsioon, mis salvestab k\u00f5ik valikud, mille oleme oma metakasti lisanud. Konks k\u00e4ivitatakse <code>save_post<\/code>iga kord, kui postitust salvestatakse v\u00f5i v\u00e4rskendatakse. Esmalt kontrollime nonce&#8217;i (kui te pole kindel, mis on nonces, vaadake seda <a href=\"https:\/\/codex.wordpress.org\/WordPress_Nonces\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPressi juhendit nonceside kohta<\/a> ). Seej\u00e4rel kontrollime veel kord, kas kasutajal on lubatud postitusi v\u00e4rskendada, ja v\u00e4rskendame valikuga meie postituse metat.<\/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>N\u00fc\u00fcd, kui v\u00e4rskendate postitusi, salvestab see ka teie men\u00fc\u00fcvaliku.<\/p>\n<p>Ja see ongi postituse valiku osa jaoks. J\u00e4rgmine samm on tegelikult men\u00fc\u00fc v\u00e4ljastamine, kui men\u00fc\u00fc on valitud.<\/p>\n<h3>Kohandatud men\u00fc\u00fc positsiooni valimine<\/h3>\n<p>Lisan v\u00e4ljundi k\u00fclgribale, kuid saate selle v\u00e4ljastada k\u00f5ikjal oma teema mallides. Vajame lihtsalt kas eelnevalt m\u00e4\u00e4ratletud konksu v\u00f5i m\u00e4\u00e4ratleme enda oma. N\u00e4itena lisan k\u00fclgriba \u00fclaossa kohandatud konksu, et saaksin luua sellega seotud funktsiooni.<\/p>\n<p>V\u00f5ite lihtsalt <code>wp_nav_menu()<\/code>mallis otse helistada, kuid soovitan selle asemel luua kohandatud konks, kuna lisame \u00fcsna palju koodi ja see v\u00f5ib tunduda r\u00e4pane.<\/p>\n<p>Minu redigeeritavas teemas <code>sidebar.php<\/code>ja vahetult enne <code>dynamic_sidebar()<\/code>seda, kui k\u00fclgribaga kutsutakse (kuhu lisatakse vidinad), lisan oma kohandatud konksu <code>do_action()<\/code>ja eesnimega. Saate seda nimetada kuidas iganes soovite, kuid see peab olema WordPressis ainulaadne. Nii et v\u00e4hemalt lisage sellele midagi teie jaoks ainulaadset.<\/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>Men\u00fc\u00fc renderdamine<\/h3>\n<p>N\u00fc\u00fcd saame minna tagasi juurde <code>functions.php<\/code>, m\u00e4\u00e4ratleda funktsiooni, millega on \u00fchendatud <code>awp_before_sidebar<\/code>ja selle v\u00e4ljund kuvatakse k\u00fclgribal enne vidinaid. Funktsioon kasutab <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\">WordPressi tingimusm\u00e4rgendeid<\/a>, et kontrollida, kas me n\u00e4itame praegu \u00fchte postitust v\u00f5i lehte v\u00f5i mitte. Ja kui nii, siis toon meie postituse meta. Kui postituse meta oli m\u00e4\u00e4ratud, v\u00e4ljastame men\u00fc\u00fc helistades <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>ja sisestades selle <code>menu<\/code>parameetrina salvestatud men\u00fc\u00fc ID.<\/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>Peaksite kohandama men\u00fc\u00fc \u00fcmber olevat HTML-i, et see sobiks \u00fclej\u00e4\u00e4nud sisuga. \u00dclaltoodud koodis m\u00e4hkin men\u00fc\u00fc samasse HTML-i, nagu on \u00fcmbritsetud k\u00f5ik k\u00fclgribal olevad vidinad, nii et teema vidina stiil rakendub meie kohandatud men\u00fc\u00fcle.<\/p>\n<p>See on k\u00f5ik! Kui valite postituses v\u00f5i lehel men\u00fc\u00fc, kuvatakse men\u00fc\u00fc selle postituse v\u00f5i lehe vaatamisel k\u00fclgriba kohal.<\/p>\n<p>Me v\u00f5ime siiski astuda sammu edasi. Kui soovite, et lastelehtedel kuvataks sama k\u00fclgriba men\u00fc\u00fc, mis on seatud m\u00f5nele vanemale, lugege edasi.<\/p>\n<h2>Luba alamlehtedel vanema men\u00fc\u00fc p\u00e4rida<\/h2>\n<p>See lisafunktsioon on m\u00f5ttekas, kui teil on hierarhias palju lehti v\u00f5i kui teil on kohandatud postituse t\u00fc\u00fcp, mille hierarhia on sisse l\u00fclitatud. Oleks liiga t\u00fclikas redigeerida iga alamlehte ja valida sama men\u00fc\u00fc. Sel juhul on parem valida emalehel olev men\u00fc\u00fc ja lasta k\u00f5igil alamlehtedel see men\u00fc\u00fc valik automaatselt p\u00e4rida. Kui m\u00f5ni alamleht valib m\u00f5ne muu men\u00fc\u00fc, kuvatakse \u00fcks kord p\u00e4randatud men\u00fc\u00fc asemel see men\u00fc\u00fc.<\/p>\n<p><code>awp_before_sidebar<\/code>Kui vaatame \u00fchte postitust v\u00f5i lehte, lisame oma funktsioonile, mis on \u00fchendatud funktsiooniga, koodit\u00fcki .<\/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>Mida \u00fclaltoodud kood teeb, kui praeguselt lehelt men\u00fc\u00fcd ei leitud, t\u00f5mbab k\u00f5ik vanemad, kellel on <code>[get_post_ancestors](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_ancestors\/)()<\/code>. See funktsioon tagastab vanempostituse ID-de massiivi, mis on j\u00e4rjestatud esmalt l\u00e4hima vanema j\u00e4rgi. Kui lehel pole vanemaid (n\u00e4iteks kui see on postitus), tagastatakse t\u00fchi massiiv. Ja kui vanemaid on, vaatame iga vanema \u00fckshaaval l\u00e4bi ja kontrollime, kas nad on meie postituse meta m\u00e4\u00e4ranud. Kui selline leiti, katkestame vanemate l\u00e4bimise ja <code>$sidebar_menu<\/code>seadistatakse ning men\u00fc\u00fc v\u00e4ljastatakse hiljem nupuga <code>wp_nav_menu()<\/code>.<\/p>\n<p>Ja see on &quot;p\u00e4rimise&quot; funktsionaalsuse jaoks!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sellest postitusest \u00f5pime, kuidas kuvada kohandatud men\u00fc\u00fc k\u00fclgribal (v\u00f5i mujal, kus soovite), lubades postitustel v\u00f5i lehtedel men\u00fc\u00fc valida.<\/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":[718,718,833,916,916,1110,842,802,802,833,926,926,842,863,863],"tags":[1165],"class_list":{"0":"post-233399","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-arendaja","9":"category-juhend-algajatele","10":"category-muud","12":"category-n-a","13":"category-opetused","14":"category-php-4","17":"category-teemasid","20":"category-wordpress-4","22":"tag-affiai-et"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=233399"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/233399\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=233399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=233399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=233399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}