Apakah ada cara mudah untuk mengganti tautan menu kustom dengan halaman atau posting?

14

Saya telah mencari plugin dan tidak dapat menemukan apa pun dan saya percaya ini harus menjadi fitur inti.

Masalah:

Metodologi saat ini untuk mengganti tautan khusus, atau tautan menu apa pun adalah dengan melakukan proses berikut:

  1. Hapus tautan menu lama
  2. Sisipkan tautan baru
  3. Seret tautan baru dari akhir daftar
  4. Letakkan tautan baru di lokasi yang diinginkan
  5. ulangi langkah 3 dan 4 sampai Anda menekan jackpot
  6. Masukkan opsi menu lagi (css, label dll)

Mengapa ini menjadi masalah?

Ini sangat tidak efisien, terutama ketika: (a) berurusan dengan menu besar (b) menu dengan banyak sublevel (c) mengganti banyak item menu yang memiliki opsi khusus

Persyaratan solusi

  1. Mempertahankan posisi Menu / hierarki
  2. Mempertahankan Opsi (kelas css, label, judul)
  3. Pilih dari Halaman / Posting / Kategori dll

Demonstrasi

http://puu.sh/laSEi/81b0d41705.png

Seharusnya sesederhana itu:

masukkan deskripsi gambar di sini

Gagasan lain yang memungkinkan adalah menggandakan / "menambahkan tautan anak ke ini" / atau bahkan menambahkan tautan baru ke daftar teratas alih-alih ke bawah.

Setiap umpan balik dihargai.

Aziz
sumber
4
+1 untuk pertanyaan yang dirumuskan dengan baik - Saya setuju dengan Anda, ini tidak terlalu efisien.
birgire
3
Masalah dengan pertanyaan ini adalah bahwa saya tidak melihat solusi sederhana untuk masalah yang sesuai dengan format di sini. Mungkin ada kebutuhan untuk membuat beberapa penyesuaian fungsionalitas di beberapa area. Saya sarankan untuk membuka tiket di trac karena kedengarannya seperti permintaan fitur yang layak.
Mark Kaplun
1
Mungkin Anda dapat menambahkan pencarian dari TinyMCE untuk menemukan posting, halaman di bidang URL, skrip wplink.js
bueltge
1
@MarkKaplun Saya pikir seseorang mungkin tahu plugin tidak populer atau pribadi untuk itu, bagaimanapun, saya mengikuti saran Anda dan membuat permintaan trac @ core.trac.wordpress.org/ticket/34648 apa cara yang tepat untuk mengakhiri pertanyaan ini di stackexchange ?
Aziz
2
jangan mengakhirinya, tidak semua pertanyaan memiliki jawaban yang dapat diterima atau bahkan valid. Beberapa kali itu baik untuk mengetahui bahwa orang lain juga melihat masalah yang sama dan tidak menemukan jawaban, kadang-kadang seseorang memang membuat jawaban yang sangat terlambat
Mark Kaplun

Jawaban:

1

Meskipun ini tidak langsung menjawab pertanyaan, kode yang menjadi dasarnya menyediakan fungsionalitas. Set kode adalah:

function install_menus () {
    require_once dirname (__FILE__). '/ data.php';
    $ menus = get_menus_data ();
    if (! kosong ($ menu)) foreach ($ menu sebagai $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

function create_nav_menu ($ menu) {
    if ($ exist = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ exist -> term_id;
          if (kosong ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    lain {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    return $ menu_id;
}
function add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items sebagai $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Home')? 'home': $ item ['slug'];
            if (! menu_item_exists ($ slug, $ menu_id)) {
                wp_update_nav_menu_item ($ menu_id, 0, array (
                    'menu-item-title' => __ ($ item ['title']),
                    'menu-item-class' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'publikasikan'
                    ));
            }
        }
    }
}
function menu_item_exists ($ slug, $ menu_id) {
    $ args = array (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publikasikan',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => true,
        'update_post_term_cache' => false); 

    $ existing = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = false;
    foreach ($ ada sebagai $ ada) {
        if (strpos ($ exist-> post_name, $ slug)! == FALSE) {// Pencarian cukup bagus (tidak tepat).
            $ found = true;
            istirahat;
        }

    }
    return $ found;
}

dan file datanya adalah:

function get_menus_data () {
    $ items = array ( 
        Himpunan ( 
            'name' => 'Menu Utama', 'slug' => 'menu-utama', 'build' => 1, 
            'item' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // slug harus kosong
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        Himpunan ( 
            'name' => 'Menu Sekunder', 'siput' => 'menu sekunder', 'build' => 0,
            'item' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1),
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        Himpunan ( 
            'name' => 'Menu Footer', 'slug' => 'footer-menu', 'build' => 1,
            'item' => array (
                array ('title' => 'Istilah', 'slug' => 'istilah', 'build' => 1),
                array ('title' => 'Privasi', 'slug' => 'privasi', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    mengembalikan $ item;
}

Antarmuka perlu dibangun di atas ini untuk memungkinkan pemilihan yang diminta, tetapi kode ini berfungsi dan diuji.

cbos
sumber
Halo, terima kasih atas jawaban Anda. Bisakah Anda menjelaskan dan menjelaskan kode yang Anda posting?
Aziz
Jika Anda menyalin dan melewati kode ke plugin atau fungsi theme.php itu harus membuat item menu yang terkandung dalam get_menus_data()fungsi. Untuk mendapatkan hasil pencarian secara dinamis mengisi item menu, fungsi diperlukan yang menggunakan API WordPress untuk melakukan itu. Fungsi-fungsi ini adalah bagian dari paket instal mandiri lengkap dimana item menu dapat dikonfigurasi terlebih dahulu, idealnya menghilangkan kebutuhan untuk melakukan ini setelah fakta. Karena fungsi-fungsi ini menyediakan "di belakang layar berfungsi", mereka dapat digunakan sebagai dasar untuk fungsi pencarian yang Anda cari.
cbos
1

Saya tidak yakin ini adalah jawaban, tetapi lebih merupakan titik diskusi.

Adakah yang pernah mempertimbangkan Bidang Kustom Lanjutan untuk membuat menu WP? Saya telah melakukan ini beberapa kali, dan itu memungkinkan saya untuk membangun struktur kustom bersama dengan atribut menu-item kustom dan membangun HTML untuk menu tanpa walker yang rumit yang akan diperlukan dengan menu WP default.

masukkan deskripsi gambar di sini

ACF

if( function_exists('acf_add_local_field_group') ):

acf_add_local_field_group(array (
    'key' => 'group_56532ec144a4b',
    'title' => 'Menu',
    'fields' => array (
        array (
            'key' => 'field_5653338918f43',
            'label' => 'Menus',
            'name' => 'menus',
            'type' => 'flexible_content',
            'instructions' => '',
            'required' => 0,
            'conditional_logic' => 0,
            'wrapper' => array (
                'width' => '',
                'class' => '',
                'id' => '',
            ),
            'button_label' => 'Add Menu',
            'min' => '',
            'max' => '',
            'layouts' => array (
                array (
                    'key' => '56533396b10bc',
                    'name' => 'menu',
                    'label' => 'Menu',
                    'display' => 'block',
                    'sub_fields' => array (
                        array (
                            'key' => 'field_56533fc6f25e7',
                            'label' => 'Menu Name',
                            'name' => 'menu__name',
                            'type' => 'text',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'default_value' => '',
                            'placeholder' => '',
                            'prepend' => '',
                            'append' => '',
                            'maxlength' => '',
                            'readonly' => 0,
                            'disabled' => 0,
                        ),
                        array (
                            'key' => 'field_56532ec718f40',
                            'label' => 'Menu Items',
                            'name' => 'menu__items',
                            'type' => 'flexible_content',
                            'instructions' => '',
                            'required' => 0,
                            'conditional_logic' => 0,
                            'wrapper' => array (
                                'width' => '',
                                'class' => '',
                                'id' => '',
                            ),
                            'button_label' => 'Add Menu Item',
                            'min' => '',
                            'max' => '',
                            'layouts' => array (
                                array (
                                    'key' => '56532eee6ef81',
                                    'name' => 'menuItem',
                                    'label' => 'Menu Item',
                                    'display' => 'block',
                                    'sub_fields' => array (
                                        array (
                                            'key' => 'field_56532f0418f41',
                                            'label' => 'Label',
                                            'name' => 'menuITem__label',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565333d218f45',
                                            'label' => 'Class',
                                            'name' => 'menuItem__class',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 50,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_565342ef11b29',
                                            'label' => 'Link Type',
                                            'name' => 'menuItem__type',
                                            'type' => 'radio',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => 0,
                                            'wrapper' => array (
                                                'width' => 25,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'choices' => array (
                                                'page' => 'Page',
                                                'cat' => 'Category',
                                                'url' => 'URL',
                                                'cust' => 'Custom',
                                            ),
                                            'other_choice' => 0,
                                            'save_other_choice' => 0,
                                            'default_value' => '',
                                            'layout' => 'vertical',
                                        ),
                                        array (
                                            'key' => 'field_56532f2d18f42',
                                            'label' => 'Page',
                                            'name' => 'menuItem__page',
                                            'type' => 'page_link',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'page',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'post_type' => array (
                                            ),
                                            'taxonomy' => array (
                                            ),
                                            'allow_null' => 0,
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653434f11b2a',
                                            'label' => 'Category',
                                            'name' => 'menuItem__cat',
                                            'type' => 'taxonomy',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cat',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'taxonomy' => 'category',
                                            'field_type' => 'select',
                                            'allow_null' => 0,
                                            'add_term' => 1,
                                            'save_terms' => 0,
                                            'load_terms' => 0,
                                            'return_format' => 'id',
                                            'multiple' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653439311b2c',
                                            'label' => 'Custom',
                                            'name' => 'menuItem__cstm',
                                            'type' => 'text',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'cust',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                            'prepend' => '',
                                            'append' => '',
                                            'maxlength' => '',
                                            'readonly' => 0,
                                            'disabled' => 0,
                                        ),
                                        array (
                                            'key' => 'field_5653437011b2b',
                                            'label' => 'URL',
                                            'name' => 'menuItem__url',
                                            'type' => 'url',
                                            'instructions' => '',
                                            'required' => 0,
                                            'conditional_logic' => array (
                                                array (
                                                    array (
                                                        'field' => 'field_565342ef11b29',
                                                        'operator' => '==',
                                                        'value' => 'url',
                                                    ),
                                                ),
                                            ),
                                            'wrapper' => array (
                                                'width' => 75,
                                                'class' => '',
                                                'id' => '',
                                            ),
                                            'default_value' => '',
                                            'placeholder' => '',
                                        ),
                                    ),
                                    'min' => '',
                                    'max' => '',
                                ),
                            ),
                        ),
                    ),
                    'min' => '',
                    'max' => '',
                ),
            ),
        ),
    ),
    'location' => array (
        array (
            array (
                'param' => 'options_page',
                'operator' => '==',
                'value' => 'acf-options-theme-options',
            ),
        ),
    ),
    'menu_order' => 0,
    'position' => 'normal',
    'style' => 'default',
    'label_placement' => 'top',
    'instruction_placement' => 'label',
    'hide_on_screen' => '',
    'active' => 1,
    'description' => '',
));

endif;

UX

function acfMenu($name) {
    if( function_exists('get_field') ) :
        $getMenus = get_field('menus', 'option');
        foreach($getMenus as $menuData) : 
            if( $menuData['menu__name'] == $name ) : 
              // Do stuff to build your menu
            endif;
        endforeach;
    endif;
}

Ini hanya contoh cepat, tetapi dengan opsi yang ditawarkan ACF, Anda bisa memaku semua jenis barang ke item menu dan kemudian kode keluar UI sesuka hati.

Dalam aplikasi untuk pertanyaan spesifik Anda, seseorang pada gilirannya dapat menerapkan pilihan bersyarat untuk jenis tautan apa yang Anda berikan (lihat gambar terlampir). ACF memungkinkan banyak parameter berbeda seperti tautan halaman, tautan kategori, atau URL langsung. Pilihan bersyarat dari item-item ini akan memungkinkan seseorang untuk mengubah jenis item menu tanpa menghapus kelas atau atribut lainnya.

Tim Plummer
sumber
Senang melihat saran - Saya yakin tangkapan layar akan membantu memahami ide Anda dengan lebih baik ;-)
birgire
Saya tidak yakin bisa mendapatkan tangkapan layar sebesar itu. Fitur ACF bersarang bisa menjadi agak berantakan.
Tim Plummer
0

Ini dapat membantu mendefinisikan pendekatan yang tepat.

Filosofi dummy-down di balik WP mendorong cara mereka mengatur menu di tempat pertama, dan hanya salah satu alasan mengapa WP bisa menjadi pilihan yang buruk sebagai kerangka kerja untuk menangani situs dengan sejumlah besar konten yang sering berubah.

Dalam mencoba menjadikan manajemen konten sebagai bukti dummy mungkin, ia menguncinya ke dalam paradigma tertentu yang seringkali menghasilkan kerja ekstra, seringkali tanpa alasan yang bagus. Anda tidak dapat menyimpan template menu, atau menduplikasi menu yang ada, atau menyimpan item menu yang dapat digunakan kembali dengan aman tanpa mengalami kehilangan konfigurasi.

Saya menyukai saran Anda yang akan menjadi alternatif yang baik untuk format menu asli yang mereka sediakan, karena ini merupakan jalan tengah yang baik antara pendekatan dummy-proof sambil tetap menawarkan lebih banyak fleksibilitas dan kecepatan penyebaran. Dan saya akan menambahkan parameter sortir sebagai alternatif dari proses drag and drop yang mengganggu yang dapat membuat banyak hal yang diputar-balik.

Namun, sementara saya ingin manajemen menu di WP diubah, mendorong terlalu jauh ke jalan ini bertentangan dengan filosofi WP inti dan mungkin berarti bahwa itu tidak lagi melayani penyebut umum terendah yang sebagian besar merupakan alasan untuk popularitas WP.

halaman dalam
sumber