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


14

Procurei plugins e não consegui encontrar nada e acredito que esse seja um recurso essencial.

O problema:

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

  1. Remover 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 as etapas 3 e 4 até atingir o jackpot
  6. Insira as opções do menu novamente (css, etiqueta etc.)

Por que isso é um problema

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

Requisitos de solução

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

Demonstração

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

Deve ser tão simples:

insira a descrição da imagem aqui

Outras idéias possíveis são duplicar / "adicionar link filho a este" / ou até mesmo adicionar novos links ao topo da lista em vez de ao fundo.

Qualquer feedback apreciado.


4
+1 para uma pergunta bem formulada - concordo com você, não é muito eficiente.
birgire

3
O problema com esta pergunta é que não vejo nenhuma solução simples para o problema que possa se ajustar ao formato aqui. Provavelmente, é necessário fazer alguns ajustes de funcionalidade em várias áreas. Sugiro abrir um ticket para ele no trac, pois soa como uma solicitação de recurso válida.
Mark Kaplun

1
Talvez você pode adicionar a busca do TinyMCE para encontrar as mensagens, páginas no campo de URL, roteiro wplink.js
bueltge

1
@ MarkKaplun Eu pensei que alguém pudesse conhecer um plugin impopular ou privado para ele, de qualquer maneira, segui sua sugestão e criei uma solicitação trac @ core.trac.wordpress.org/ticket/34648 qual é a maneira apropriada de encerrar esta pergunta no stackexchange ?
Aziz

2
não termine, nem todas as perguntas têm uma resposta aceitável ou até válida. Algumas vezes é bom saber que outras pessoas também estavam olhando para o mesmo problema e não encontrar uma resposta, às vezes alguém faz uma resposta muito tarde
Mark Kaplun

Respostas:


1

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

função install_menus () {
    require_once dirname (__FILE__). '/data.php';
    $ menus = get_menus_data ();
    if (! empty ($ menus)) foreach ($ menus como $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['itens']);
        }
    }
}

função create_nav_menu ($ menu) {
    if ($ existe = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ existe -> term_id;
          if (vazio ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    outro {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    retornar $ menu_id;
}
função add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items como $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Página inicial')? 'home': $ item ['lesma'];
            if (! menu_item_exists ($ slug, $ menu_id)) {
                wp_update_nav_menu_item ($ menu_id, 0, matriz (
                    'menu-item-title' => __ ($ item ['title']),
                    'menu-item-classes' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'publicar'
                    ));
            }
        }
    }
}
função menu_item_exists ($ slug, $ menu_id) {
    $ args = matriz (
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'publicar',
        'output' => ARRAY_A,
        'output_key' => 'menu_order',
        'nopaging' => true,
        'update_post_term_cache' => false); 

    $ existente = wp_get_nav_menu_items ($ menu_id, $ args);
    $ encontrado = falso;
    foreach ($ existente como $ existe) {
        if (strpos ($ existe-> post_name, $ slug)! == FALSE) {// pesquisa muito boa (não exata).
            $ encontrado = verdadeiro;
            pausa;
        }

    }
    return $ encontrado;
}

e o arquivo de dados é:

função get_menus_data () {
    $ items = array ( 
        matriz ( 
            'name' => 'Menu principal', 'slug' => 'menu principal', 'build' => 1, 
            'items' => array (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // slug deve estar vazio
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'Contact', 'slug' => 'contact', 'build' => 1),
                ),
        ),
        matriz ( 
            'name' => 'Menu secundário', 'slug' => 'menu secundário', '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),
                ),
        ),
        matriz ( 
            'name' => 'Menu do rodapé', 'slug' => 'rodapé-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),
                ),
            ) 
    );
    retornar $ itens;
}

Uma interface precisaria ser construída sobre isso para permitir a seleção solicitada, mas esse código está funcionando e testado.


Olá, obrigado pela sua resposta. Você poderia elaborar e explicar o código que postou?
Aziz

Se você copiar e colar o código em um plug-in ou no functions.php de um tema, ele deverá criar os itens de menu contidos na get_menus_data()função. Para que um resultado de pesquisa preencha dinamicamente um item de menu, são necessárias funções que usam a API do WordPress para fazer isso. Essas funções fazem parte de um pacote completo de instalação automática pelo qual os itens de menu podem ser configurados com antecedência, eliminando idealmente a necessidade de fazer isso após o fato. Como essas funções fornecem o "trabalho nos bastidores", elas podem ser usadas como base para a funcionalidade de pesquisa que você procura.
cbos

1

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

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

insira a descrição da imagem aqui

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 colocar todos os tipos de itens em um item de menu e codificar a interface do usuário à vontade.

Na aplicação de sua pergunta específica, pode-se aplicar seleções condicionais para o tipo de link que você está fornecendo (veja a imagem em anexo). O ACF permite muitos 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.


Bom ver sugestões - Eu tenho certeza que um screenshot ajudaria a compreender a sua idéia melhor ;-)
birgire

Não tenho certeza se posso conseguir uma captura de tela tão grande. Recursos ACF aninhados podem ficar meio confusos.
Tim Plummer

0

Isso pode ajudar a definir a abordagem correta.

A filosofia dummy-down por trás do WP mostra como eles têm menus de configuração e é apenas uma das razões pelas quais o WP pode ser uma má escolha como estrutura para lidar com um site com grandes quantidades de conteúdo frequentemente alterado.

Ao tentar tornar o gerenciamento de conteúdo o mais fictício possível, ele o prende a paradigmas específicos, que muitas vezes criam trabalho extra, muitas vezes sem uma boa razão. Você não pode salvar modelos de menu, nem duplicar menus existentes, nem armazenar com segurança itens de menu reutilizáveis ​​sem experimentar a perda de configuração.

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 falsificação 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 muita coisa.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.