it-swarm.asia

إضافة قائمة التنقل وعناصر القائمة برمجياً

من خلال وظائف API ، أرغب في تحديد قائمة تنقل جديدة ، حددها في السمة الحالية ، ثم قم بإدراج عدد قليل من الصفحات كعناصر قائمة. يجب القيام بذلك على سبيل المثال عند تنشيط السمة.

من خلال عملية (مؤلمة بشكل معتدل) للهندسة العكسية تدرج قاعدة البيانات وتحديثاتها بعد إعداد قائمة وعناصر التنقل يدويًا ، قمت بتجميع الخطوات التالية ، حيث يكون "footer-nav" هو معرّف الدودة لقائمة التنقل I م خلق:

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');
}

يبدو أن هذا يعمل ، ولكن:

  • هل هي طريقة قوية وأنيقة للقيام بذلك؟
  • أفتقد شيئًا واضحًا تمامًا من شأنه أن يفعل كل هذا في سطر واحد من الكود
39
julien_c

قد أسيء فهمك ، لكن لماذا لا تستخدم wp_create_nav_menu()؟

على سبيل المثال ، هذا هو ما أقوم به لإنشاء قائمة BuddyPress مخصصة عندما أكتشف BP باعتبارها نشطة:

    $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 );
    }
39
ZaMoose

كمكمل لجواب ZaMoose ، إليك كيفية إنشاء عنصر قائمة " صفحة - نوع" (وليس " مخصص " واحد):

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'));

على افتراض أنك تعرف فقط سبيكة الصفحة ، على سبيل المثال.

12
julien_c

لديّ بعض المشكلات المتعلقة بالإجابة المقبولة - وهذا لا يخطئ ، لكنني سأنشر الكود الخاص بي أدناه والذي أشعر أنه قد يكون له نتيجة أفضل لبعض الأشخاص لأن لدي نفس السؤال ولكني أردت فعل الشيء نفسه شيء مع رمز أقل.

أولاً ، تنشئ التعليمة البرمجية أعلاه عناصر تنقل بنوع "عنوان URL" ، وهو أمر جيد بالنسبة لبعض الأشخاص ، لكنني أرغب في الارتباط بصفحات ، وليس عناوين URL لأن هذه ميزة مهمة في تنقلات WordPress والعملاء لا بد من نقل الأشياء حولها حتى لا أستخدم عنوان URL نوع عنصر التنقل.

أيضا ، يتم التعامل مع مجموعة شقة فقط من الأطفال عن طريق الرمز المنشور. لقد قمتُ بإنشاء دالة للإعلان المتكرر لعناصر التنقل الجديدة ، وتخزين البيانات التعريفية التي يتم إرجاعها (معرف الهوية بشكل أساسي بعد إنشائها في الحلقة) ، ومعلمة لقبول الأطفال.

مجرد تعديل $nav_items_to_add ويتم التعامل مع الباقي بشكل متكرر. هناك 3 مفاتيح مطلوبة في كل مجموعة. أولاً ، مفتاح الصفيف هو "الدود" ، لذلك 'shop' => array( ... ) هو ما تريده لصفحة تحتوي على الدودج shop. ['title'] هي الطريقة التي سيتم بها تسمية عنصر التنقل في الواجهة الأمامية. path هو المسار إلى الصفحة داخل التسلسل الهرمي لصفحة WordPress ، لذلك يكون مطابقًا للقيمة slug إذا كانت الصفحة أحد الوالدين من المستوى الأعلى ، وإذا كان shop تابعًا لـ home فسيكون 'path' => 'home/shop'.

مفتاح الصفيف الاختياري الأخير هو ['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')
        );
    }

    }
9
Brian

لإضافة عنصر قائمة برمجيا. يمكنك ربط مرشح wp_nav_menu_items. ضع الكود أسفل الرمز في وظائف theme.php لإضافة عنصر قائمة تسجيل الدخول/الخروج في القائمة الرئيسية. "الأساسي" هو اسم/معرف القائمة المسجلة.

/**
 * 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;
}
2
Aamer Shahzad