Existe uma maneira fácil de substituir um link de menu personalizado por uma página ou postagem?

13

Eu procurei plugins e não consegui encontrar nada, e acredito que isso deve ser um recurso essencial.

O problema:

A metodologia atual para substituir um link personalizado ou qualquer link de menu é fazer o seguinte processo:

  1. Remover o link do menu antigo
  2. Inserir novo link
  3. Arraste o novo link do final da lista
  4. Solte o novo link no local desejado
  5. repita os passos 3 e 4 até atingir o jackpot
  6. Insira as opções de menu novamente (css, label etc.)

Por que isso é um problema

É muito ineficiente, especialmente quando: (a) lidar com menus enormes (b) menus com muitos subníveis (c) substituindo muitos itens de menu que possuem opções personalizadas

Requisitos da solução

  1. Mantém a posição / hierarquia do menu
  2. Retém opções (classe css, rótulo, título)
  3. Escolha entre Páginas / Publicações / Categorias, etc.

Demonstração

Deveserassimtãosimples:

Outrasideiaspossíveissãoduplicadas/"adicionar link filho a isso" / ou até mesmo adicionar novos links ao topo da lista, em vez de à parte inferior.

Qualquer feedback apreciado.

    
por Aziz 06.11.2015 / 01:27

3 respostas

1

Embora isso não responda diretamente à pergunta, o código no qual ela é baseada fornece a funcionalidade. O conjunto de códigos é:

function install_menus() {
    require_once dirname( __FILE__) . '/data.php';
    $menus = get_menus_data();
    if ( ! empty ( $menus ) ) foreach ( $menus as $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 ( $exists = wp_get_nav_menu_object( $menu['name'] ) ) {
        $menu_id = $exists -> term_id;
          if ( empty ( $menu_id ) ) {
            $menu_id = wp_create_nav_menu( $menu['name'] );
        } 
    }
    else {
        $menu_id = wp_create_nav_menu( $menu['name'] );
    }
    return $menu_id;
}
function 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' => 'publish'
                    ) );
            }
        }
    }
}
function menu_item_exists( $slug, $menu_id ) {
    $args = array(
        'order'                  => 'ASC',
        'orderby'                => 'menu_order',
        'post_type'              => 'nav_menu_item',
        'post_status'            => 'publish',
        '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 ( $existing as $exists ) {
        if( strpos( $exists->post_name, $slug ) !== FALSE  ) {  //pretty good search (not exact).
            $found = true;
            break;
        }

    }
    return $found;
}

e o arquivo de dados é:

function get_menus_data() {
    $items = array ( 
        array ( 
            'name' => 'Main Menu', 'slug' => 'main-menu', 'build' => 1, 
            'items' => array (
                array ( 'title' => 'Home', 'slug' => '', 'build' => 1 ), //slug should be empty
                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' => 'Footer Menu', 'slug' => 'footer-menu', '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 ),
                ),
            ) 
    );
    return $items;
}

Uma interface precisaria ser criada em cima disso para permitir a seleção solicitada, mas esse código está funcionando e testado.

    
por cbos 17.11.2015 / 00:20
1

Não tenho certeza se isso é uma resposta, mas mais um ponto de discussão.

Alguém já considerou Advanced Custom Fields para construir menus WP? Eu fiz isso algumas vezes, e isso me permite criar uma estrutura personalizada junto com atributos de itens de menu personalizados e criar o HTML para o menu sem um walker complicado que seria necessário com os menus padrão do WP.

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

Este é apenas um exemplo rápido, mas com as opções que o ACF oferece, você pode juntar todos os tipos de coisas em um item de menu e depois codificar a interface à vontade.

No aplicativo da sua pergunta específica, pode-se aplicar seleções condicionais ao tipo de link que você está fornecendo (consulte a imagem anexada). O ACF permite vários parâmetros diferentes, como links de páginas, links de categorias ou URLs diretos. Uma seleção condicional desses itens permitiria alterar o tipo do item de menu sem apagar classes ou outros atributos.

    
por Tim Plummer 23.11.2015 / 16:44
0

Isso pode ajudar a definir a abordagem correta.

A filosofia falsa por trás do WP impulsiona a maneira como eles têm menus de configuração, e é apenas uma das razões pelas quais o WP pode ser uma escolha ruim como a estrutura para lidar com um site com grandes quantidades de mudanças frequentes. conteúdo.

Ao tentar tornar o gerenciamento de conteúdo o mais fictício possível, ele o coloca em paradigmas específicos, que geralmente criam trabalho extra, muitas vezes sem um bom motivo. Você não pode salvar modelos de menu, nem duplicar menus existentes, nem armazenar com segurança itens de menu reutilizáveis do menu sem perder a configuração.

Eu gosto da sua sugestão, que seria uma boa alternativa aos formatos de menu nativos que eles fornecem, pois é um bom meio-termo entre a abordagem à prova de dummy e ainda oferece muito mais flexibilidade e velocidade de implantação. E eu adicionaria um parâmetro de classificação como uma alternativa ao processo irritante de arrastar e soltar, que pode criar tanta confusão.

No entanto, embora eu queira que o gerenciamento de menus no WP seja alterado, avançar muito nesse caminho é contra a filosofia principal do WP e pode significar que ele não está mais atendendo ao menor denominador comum, que é em grande parte o motivo a popularidade do WP.

    
por garth 07.12.2015 / 06:14