Gibt es eine einfache Möglichkeit, einen benutzerdefinierten Menü-Link durch eine Seite oder einen Beitrag zu ersetzen?

14

Ich habe nach Plugins gesucht und konnte nichts finden und ich glaube, dies sollte ein Kernfeature sein.

Das Problem:

Die aktuelle Methode zum Ersetzen eines benutzerdefinierten Links oder eines beliebigen Menü-Links sieht folgendermaßen aus:

  1. Alte Menüverknüpfung entfernen
  2. Neuen Link einfügen
  3. Ziehen Sie den neuen Link vom Ende der Liste
  4. Legen Sie den neuen Link an der gewünschten Stelle ab
  5. Wiederholen Sie die Schritte 3 und 4, bis Sie den Jackpot knacken
  6. Geben Sie die Menüoptionen erneut ein (CSS, Label usw.).

Warum ist das ein Problem

Es ist sehr ineffizient, insbesondere wenn: (a) große Menüs behandelt werden (b) Menüs mit vielen Unterebenen (c) viele Menüelemente mit benutzerdefinierten Optionen ersetzt werden

Lösungsanforderungen

  1. Behält die Menüposition / -hierarchie bei
  2. Behält Optionen bei (CSS-Klasse, Bezeichnung, Titel)
  3. Wählen Sie aus Seiten / Posts / Kategorien usw

Demonstration

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

Sollte so einfach sein:

Bildbeschreibung hier eingeben

Andere mögliche Ideen sind das Duplizieren / "Hinzufügen eines untergeordneten Links zu diesem" / oder sogar das Hinzufügen neuer Links zum Anfang der Liste anstatt zum Ende.

Feedback erwünscht.

Aziz
quelle
4
+1 für eine gut formulierte Frage - ich stimme Ihnen zu, es ist nicht sehr effizient.
Birgire
3
Das Problem bei dieser Frage ist, dass ich keine einfache Lösung für das Problem sehe, die in dieses Format passt. Möglicherweise müssen einige Funktionen in mehreren Bereichen angepasst werden. Ich schlage vor, ein Ticket dafür in trac zu öffnen, da dies nach einer würdigen Feature-Anfrage klingt.
Mark Kaplun
1
Vielleicht können Sie die Suche aus dem TinyMCE hinzufügen, um die Beiträge, Seiten im URL-Feld, Skript wplink.js
bueltge
1
@MarkKaplun Ich dachte , jemand unbeliebt oder sonst private Plugin für sie wissen könnte, wie auch immer, ich folgte Ihren Vorschlag und eine trac Anfrage @ erstellt core.trac.wordpress.org/ticket/34648 was die passende Art ist , diese Frage auf Stack zu beenden ?
Aziz
2
Beende es nicht, nicht alle Fragen haben eine akzeptable oder sogar gültige Antwort. Manchmal ist es gut zu wissen, dass sich auch andere Leute mit dem gleichen Thema befassten und keine Antwort fanden. Manchmal gibt jemand eine sehr späte Antwort
Mark Kaplun,

Antworten:

1

Obwohl dies die Frage nicht direkt beantwortet, bietet der Code, auf dem es basiert, die Funktionalität. Der Code lautet:

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

Funktion create_nav_menu ($ menu) {
    if ($ exists = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ existiert -> term_id;
          if (leer ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    sonst {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    return $ menu_id;
}
Funktion add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items as $ 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-classes' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'veröffentlichen'
                    ));
            }
        }
    }
}
function menu_item_exists ($ slug, $ menu_id) {
    $ args = array (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'veröffentlichen',
        '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 ($ existent als $ existent) {
        if (strpos ($ exists-> post_name, $ slug)! == FALSE) {// ziemlich gute Suche (nicht genau).
            $ found = true;
            brechen;
        }

    }
    return $ found;
}

und die Datendatei ist:

Funktion get_menus_data () {
    $ items = array ( 
        Array ( 
            'name' => 'Hauptmenü', 'slug' => 'Hauptmenü', 'build' => 1, 
            'items' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // slug sollte leer sein
                Array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                Array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                Array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        Array ( 
            'name' => 'Secondary Menu', 'slug' => 'secondary-menu', 'build' => 0,
            'items' => 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),
                ),
        ),
        Array ( 
            'name' => 'Fußzeilenmenü', 'slug' => 'Fußzeilenmenü', 'build' => 1,
            'items' => array (
                Array ('title' => 'Terms', 'slug' => 'terms', 'build' => 1),
                Array ('title' => 'Privacy', 'slug' => 'privacy', 'build' => 1),
                Array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
            ) 
    );
    $ items zurückgeben;
}

Darüber müsste eine Schnittstelle erstellt werden, um die angeforderte Auswahl zu ermöglichen, aber dieser Code funktioniert und wird getestet.

cbos
quelle
Hallo, danke für deine Antwort. Könnten Sie bitte den von Ihnen geposteten Code ausarbeiten und erklären?
Aziz
Wenn Sie den Code kopieren und in die Datei functions.php eines Plugins oder Themes einfügen, sollten die in der get_menus_data()Funktion enthaltenen Menüelemente erstellt werden. Damit ein Suchergebnis einen Menüeintrag dynamisch auffüllt, werden Funktionen benötigt, die die WordPress-API verwenden. Diese Funktionen sind Teil eines vollständigen Pakets zur Selbstinstallation, mit dem Menüelemente im Voraus konfiguriert werden können, sodass dies nachträglich nicht mehr erforderlich ist. Da diese Funktionen die "Arbeit hinter den Kulissen" bieten, können sie als Grundlage für die von Ihnen gewünschte Suchfunktion verwendet werden.
cbos
1

Ich bin mir nicht sicher, ob dies eine Antwort ist, sondern eher ein Diskussionspunkt.

Hat jemand jemals über erweiterte benutzerdefinierte Felder nachgedacht, um WP-Menüs zu erstellen? Ich habe dies einige Male getan und es ermöglicht mir, eine benutzerdefinierte Struktur zusammen mit benutzerdefinierten Menüelementattributen zu erstellen und den HTML-Code für das Menü zu erstellen, ohne dass ein komplizierter Walker erforderlich wäre, der für Standard-WP-Menüs erforderlich wäre.

Bildbeschreibung hier eingeben

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

Dies ist nur ein kurzes Beispiel, aber mit den Optionen, die ACF bietet, können Sie alle möglichen Dinge auf ein Menüelement heften und dann die Benutzeroberfläche nach Belieben codieren.

In Anwendung auf Ihre spezifische Frage könnte man wiederum eine bedingte Auswahl treffen, um welche Art von Link es sich handelt (siehe beigefügtes Bild). ACF erlaubt viele verschiedene Parameter wie Seitenlinks, Kategorielinks oder direkte URLs. Eine bedingte Auswahl dieser Elemente ermöglicht es, den Typ des Menüelements zu ändern, ohne Klassen oder andere Attribute zu löschen.

Tim Plummer
quelle
Gut zu sehen, Vorschläge - Ich bin sicher, ein Screenshot würde helfen, Ihre Idee besser zu verstehen
;-)
Ich bin mir nicht sicher, ob ich einen so großen Screenshot machen kann. Verschachtelte ACF-Funktionen können etwas chaotisch werden.
Tim Plummer
0

Dies kann helfen, den richtigen Ansatz zu definieren.

Die Dummy-Down-Philosophie hinter WP bestimmt in erster Linie die Art und Weise, in der Setup-Menüs vorhanden sind, und ist nur einer der Gründe, warum WP eine schlechte Wahl für den Umgang mit einer Site mit großen Mengen von sich häufig ändernden Inhalten sein kann.

Bei dem Versuch, Content Management so einfach wie möglich zu machen, wird es an bestimmte Paradigmen gebunden, was oftmals ohne triftigen Grund zusätzliche Arbeit verursacht. Sie können weder Menüvorlagen speichern, noch vorhandene Menüs duplizieren oder wiederverwendbare Menüelemente sicher speichern, ohne dass die Konfiguration verloren geht.

Ich mag Ihren Vorschlag, der eine gute Alternative zu den von ihnen angebotenen nativen Menüformaten darstellt, da er einen guten Mittelweg zwischen dem Dummy-Proof-Ansatz darstellt und dennoch viel flexibler und schneller einsetzbar ist. Und ich würde einen Sortierparameter als Alternative zu dem lästigen Drag & Drop-Prozess hinzufügen, der so viel Fummelei verursachen kann.

Obwohl ich möchte, dass die Menüverwaltung in WP geändert wird, verstößt ein zu weites Herunterschieben dieses Weges gegen die Kernphilosophie von WP und könnte bedeuten, dass nicht mehr der kleinste gemeinsame Nenner berücksichtigt wird, was hauptsächlich der Grund für die Beliebtheit von ist WP.

garth
quelle