প্রোগ্রামগতভাবে একটি নেভিগেশন মেনু এবং মেনু আইটেম যুক্ত করুন


41

এপিআই ফাংশনগুলির মাধ্যমে, আমি একটি নতুন নেভিগেশন মেনু সংজ্ঞায়িত করতে চাই , এটি বর্তমান থিমে নির্বাচন করতে এবং তারপরে মেনু আইটেম হিসাবে কয়েকটি পৃষ্ঠাগুলি সন্নিবেশ করতে চাই। এটি কোনও থিম অ্যাক্টিভেশন হিসাবে উদাহরণস্বরূপ করা উচিত।

নেভিগেশন মেনু এবং আইটেমগুলি ম্যানুয়ালি সেটআপ করার পরে ডাটাবেস সন্নিবেশ এবং আপডেটগুলির বিপরীত প্রকৌশল প্রক্রিয়াটির মাধ্যমে (মাঝারিভাবে বেদনাদায়ক) প্রক্রিয়াটির মাধ্যমে আমি নীচের পদক্ষেপগুলি একসাথে বেঁধেছি, যেখানে 'ফুটার-এনএভি' নেভিগেশন মেনু আইয়ের স্লাগ আইডি ' আমি তৈরি করছি:

if (!term_exists('footer-nav', 'nav_menu')) {

    $menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));

    // Select this menu in the current theme
    update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));

    // Insert new page
    $page = wp_insert_post(array('post_title' => 'Blog',
                                 'post_content' => '',
                                 'post_status' => 'publish',
                                 'post_type' => 'page'));

    // Insert new nav_menu_item
    $nav_item = wp_insert_post(array('post_title' => 'News',
                                     'post_content' => '',
                                     'post_status' => 'publish',
                                     'post_type' => 'nav_menu_item'));


    add_post_meta($nav_item, '_menu_item_type', 'post_type');
    add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
    add_post_meta($nav_item, '_menu_item_object_id', $page);
    add_post_meta($nav_item, '_menu_item_object', 'page');
    add_post_meta($nav_item, '_menu_item_target', '');
    add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
    add_post_meta($nav_item, '_menu_item_xfn', '');
    add_post_meta($nav_item, '_menu_item_url', '');

    wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}

এটি কাজ করে বলে মনে হচ্ছে তবে:

  • এটি কি এটি করার একটি দৃust় এবং মার্জিত উপায়?
  • আমি কি পুরোপুরি সুস্পষ্ট কিছু মিস করছি যা কোডের এক লাইনে এই সব করবে?

উত্তর:


42

আমি আপনাকে ভুল বোঝাবুঝি হতে পারে, কিন্তু কেন ব্যবহার wp_create_nav_menu()করবেন না ?

উদাহরণস্বরূপ, আমি যখন বিপিটিকে সক্রিয় হিসাবে সনাক্ত করি তখন এটি একটি কাস্টম বডিপ্রেস মেনু তৈরি করতে আমি যা করি:

    $menuname = $lblg_themename . ' BuddyPress Menu';
$bpmenulocation = 'lblgbpmenu';
// Does the menu exist already?
$menu_exists = wp_get_nav_menu_object( $menuname );

// If it doesn't exist, let's create it.
if( !$menu_exists){
    $menu_id = wp_create_nav_menu($menuname);

    // Set up default BuddyPress links and add them to the menu.
    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Activity'),
        'menu-item-classes' => 'activity',
        'menu-item-url' => home_url( '/activity/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Members'),
        'menu-item-classes' => 'members',
        'menu-item-url' => home_url( '/members/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Groups'),
        'menu-item-classes' => 'groups',
        'menu-item-url' => home_url( '/groups/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Forums'),
        'menu-item-classes' => 'forums',
        'menu-item-url' => home_url( '/forums/' ), 
        'menu-item-status' => 'publish'));

    // Grab the theme locations and assign our newly-created menu
    // to the BuddyPress menu location.
    if( !has_nav_menu( $bpmenulocation ) ){
        $locations = get_theme_mod('nav_menu_locations');
        $locations[$bpmenulocation] = $menu_id;
        set_theme_mod( 'nav_menu_locations', $locations );
    }

আমি এই ফাংশন সম্পর্কে জানতাম না। হ্যাঁ, আমার ধারণা এটি উপরের কোডটি আরও সংক্ষিপ্ত করে তুলবে। আমার ধারণা, আমার কোডেক্সের বাইরে চলে যাওয়া উচিত এবং প্রকৃত কোডে ডুব দেওয়া উচিত, কারণ আমি দেখতে পাচ্ছি যে এপিআই ফাংশনগুলি প্রায়শই এই ক্ষেত্রে যেমন খুব নিম্ন স্তরের থাকে। ধন্যবাদ!
জুলিয়েন_সি

@ জুলিয়েন_সি যদি এটি সমাধান হয়ে যায় তবে এটিকে চিহ্নিত করুন যাতে আপনার পরে যারা আসেন তাদের এখানে আপনার অভিজ্ঞতা থেকে উপকৃত হতে দিন।
mor7ifer

আমি আসলে এটি বাস্তব জীবনে পরীক্ষা করতে চাই তাই আমি নিশ্চিত যে এটি আমার যা ইচ্ছা তা করে। আমি মনে করি এটি শেষ হওয়ার সাথে সাথে সমাধান করা হিসাবে চিহ্নিত করতে হবে!
জুলিয়েন_সি

3
আপনি যদি এই জাতীয় দরকারী কোডগুলি কোডেক্সে নেই এমনগুলি দেখতে পান তবে সেগুলি যুক্ত করা ভাল ধারণা (ইয়ে উইকি) = পি
টম জে নওয়েল

দুঃখিত, এটি আমার ক্ষেত্রে কাজ করে তা পরীক্ষা করতে আমাকে এত দীর্ঘ সময় লেগেছে। উত্তর গৃহীত! এছাড়াও, আপনি কাস্টম লিঙ্কগুলি মেনু আইটেমগুলি সংজ্ঞায়িত করছেন , আমি পৃষ্ঠা লিঙ্কগুলি সংজ্ঞায়িত করতে নীচে একটি উত্তর যুক্ত করেছি (উদাহরণস্বরূপ, ইউআরএল পরিবর্তনে আরও দৃ rob় হবে)।
জুলিয়েন_সি

12

জামুজের অ্যাঞ্জারের পরিপূরক হিসাবে আপনি কীভাবে একটি " পৃষ্ঠা- টাইপ" মেনু আইটেম তৈরি করবেন (কোনও " কাস্টম " নয় ):

wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'About',
                                           'menu-item-object' => 'page',
                                           'menu-item-object-id' => get_page_by_path('about')->ID,
                                           'menu-item-type' => 'post_type',
                                           'menu-item-status' => 'publish'));

ধরুন আপনি উদাহরণস্বরূপ কেবল পৃষ্ঠা স্লাগ জানেন।


9

আমার গ্রহণযোগ্য উত্তরের সাথে কয়েকটি সমস্যা রয়েছে - এটি এটিকে ভুল করে না, তবে আমি নীচে আমার নিজস্ব কোড পোস্ট করব যা আমার মনে হয় যে কিছু লোকের জন্য আমার আরও ভাল ফলাফল হতে পারে যেহেতু আমার একই প্রশ্ন ছিল তবে একই রকম করতে চাইছিলাম কম কোড সহ জিনিস।

প্রথমত, উপরের কোডটি "ইউআরএল" টাইপ নেভিগেশন আইটেমগুলি তৈরি করে, যা কিছু লোকের পক্ষে ঠিক আছে তবে আমি ইউআরএল নয়, পৃষ্ঠাগুলির সাথে লিঙ্ক করতে চাই কারণ এটি ওয়ার্ডপ্রেস নেভিগেশন এবং ক্লায়েন্টদের অনিবার্যভাবে সরানো জিনিসগুলির গুরুত্বপূর্ণ বৈশিষ্ট্য তাই আমি কখনও ইউআরএল ব্যবহার করি না নাভ আইটেম টাইপ।

এছাড়াও, কেবলমাত্র একটি ফ্ল্যাট অ্যারে বাচ্চাদের পোস্ট কোড দ্বারা পরিচালনা করা হয়। আমি নতুন নতুন আইটেমগুলি পুনরাবৃত্তভাবে ঘোষণা করার জন্য, তাদের ফিরে আসা মেটাডেটা (মূলত লুপে তৈরি হওয়ার পরে আইডি) এবং শিশুদের গ্রহণের জন্য একটি প্যারামিটার সংরক্ষণ করার জন্য একটি ফাংশন তৈরি করেছি।

কেবল সম্পাদনা করুন $nav_items_to_addএবং বাকিগুলি পুনরাবৃত্তভাবে পরিচালনা করা হয়। প্রতিটি অ্যারেতে 3 টি প্রয়োজনীয় কী রয়েছে। প্রথমত, অ্যারে কী হ'ল স্লাগ, 'shop' => array( ... )আপনি স্লাগ সহ কোনও পৃষ্ঠার জন্য যা চান তা shop['title']এই ভাবে এনএভি আইটেমটি সামনের প্রান্তে লেবেলযুক্ত হবে। pathওয়ার্ডপ্রেস পৃষ্ঠার হায়ারার্কির মধ্যে থাকা পৃষ্ঠার পথ, সুতরাং পৃষ্ঠাটি শীর্ষ স্তরের পিতা-মাতা হয় এবং যদি এটির shopসন্তানের হয়ে থাকে homeতবে এটি হ'ল স্লাগের মতো 'path' => 'home/shop'

সর্বশেষ alচ্ছিক অ্যারে কীটি ['parent']যেখানে আপনি বর্তমানের পিতামাতার হিসাবে অ্যারেতে অন্য কীটি ঘোষণা করতে পারেন। এটি লক্ষণীয় যে আইটেমগুলি পুনরাবৃত্তভাবে যুক্ত করা হয়, তাই আপনার বাচ্চা তৈরির চেষ্টা করার আগে পিতামাতার উপস্থিতি থাকতে হবে। এর অর্থ হল ঘোষনাটি পিতামাতা নাভ আইটেমের বাচ্চাদের আগে হওয়া উচিত।

    $locations = get_nav_menu_locations();

    if (isset($locations['primary_navigation'])) {
        $menu_id = $locations['primary_navigation'];

        $new_menu_obj = array();

        $nav_items_to_add = array(
                'shop' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    ),
                'shop_l2' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    'parent' => 'shop',
                    ),
                'cart' => array(
                    'title' => 'Cart',
                    'path' => 'shop/cart',
                    'parent' => 'shop',
                    ),
                'checkout' => array(
                    'title' => 'Checkout',
                    'path' => 'shop/checkout',
                    'parent' => 'shop',
                    ),
                'my-account' => array(
                    'title' => 'My Account',
                    'path' => 'shop/my-account',
                    'parent' => 'shop',
                    ),
                'lost-password' => array(
                    'title' => 'Lost Password',
                    'path' => 'shop/my-account/lost-password',
                    'parent' => 'my-account',
                    ),
                'edit-address' => array(
                    'title' => 'Edit My Address',
                    'path' => 'shop/my-account/edit-address',
                    'parent' => 'my-account',
                    ),
            );

    foreach ( $nav_items_to_add as $slug => $nav_item ) {
        $new_menu_obj[$slug] = array();
        if ( array_key_exists( 'parent', $nav_item ) )
            $new_menu_obj[$slug]['parent'] = $nav_item['parent'];
        $new_menu_obj[$slug]['id'] = wp_update_nav_menu_item($menu_id, 0,  array(
                'menu-item-title' => $nav_item['title'],
                'menu-item-object' => 'page',
                'menu-item-parent-id' => $new_menu_obj[ $nav_item['parent'] ]['id'],
                'menu-item-object-id' => get_page_by_path( $nav_item['path'] )->ID,
                'menu-item-type' => 'post_type',
                'menu-item-status' => 'publish')
        );
    }

    }

2

প্রোগ্রামিকভাবে একটি মেনু আইটেম যুক্ত করতে। আপনি wp_nav_menu_itemsফিল্টার করতে পারেন । আপনার মেনুতে লগইন / লগআউট মেনু আইটেম যুক্ত করতে থিম ফাংশন.এফপি কোডের নীচে রাখুন। 'প্রাথমিক' হ'ল নিবন্ধিত মেনুর নাম / আইডি।

/**
 * Add login logout menu item in the main menu.
 * ===========================================
 */

add_filter( 'wp_nav_menu_items', 'lunchbox_add_loginout_link', 10, 2 );
function lunchbox_add_loginout_link( $items, $args ) {
    /**
     * If menu primary menu is set & user is logged in.
     */
    if ( is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. wp_logout_url() .'">Log Out</a></li>';
    }
    /**
     * Else display login menu item.
     */
    elseif ( !is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. site_url('wp-login.php') .'">Log In</a></li>';
    }
    return $items;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.