Como adicionar um link personalizado a um menu com um URL relativo ao URL do blog

16

Parte do meu trabalho é criar sites Wordpress. Normalmente, trabalho no meu laptop até ter algo bom o suficiente para ser carregado no servidor de teste em que o cliente o revisa.

Eu crio um VirtualHost para cada novo projeto, por isso estou sempre trabalhando com uma instalação do Wordpress em um domínio que se parece http://local.example.com/, mas quando o site é carregado no servidor de teste (não controlado por mim), o domínio pode acabar sendo algo parecido http://testserver.com/arbitrary/path/example/.

O problema é que, se eu adicionar um link personalizado a um menu que aponte para, por exemplo, /events/funcionaria bem localmente criando um link para http://local.example.com/events/, mas no servidor de teste, o link apontará para http://testserver/events/, o que obviamente não está certo.
O que eu quero é fornecer ao link personalizado um URL que funcione tanto no meu ambiente local quanto no servidor de teste.

Eu já manuseio o problema de alterar as opções homee siteurlWordpress:

  • alterando essas configurações no banco de dados local
  • criando um despejo do banco de dados
  • atualizar o banco de dados no servidor
  • restaurando as opções locais.

Não quero usar URLs completos para os links personalizados e ter que substituí-los pelo URL do servidor sempre que precisar atualizar o banco de dados do servidor.

Para links dentro do conteúdo da postagem, existe um plug-in que resolve o problema de adição de dois códigos de acesso: http://wordpress.org/extend/plugins/url-shortcodes/ , mas não consegui encontrar algo semelhante para Links personalizados .

Willington Vega
fonte
5
Willington, não posso ajudá-lo a um URL que funcione em qualquer lugar. O que posso fazer é apontar para spectacu.la/search-and-replace-for-wordpress-databases . Estou usando a pesquisa e substituição de David há algum tempo e trabalha bem para alterar, por exemplo, URLs - mesmo quando em dados serializados. Então é assim que eu faço: apenas links codificados e convertidos depois de mover o banco de dados para outro domínio. Boa sorte, Peter #
1100
Até agora, a única maneira que eu descobri ao passar com êxito de um ambiente de desenvolvimento para um ambiente ativo é depois de fazer o dump do SQL para fazer uma pesquisa e substituir o arquivo inteiro, não apenas alterar as opções home e siteurl. Eu tive arquivos nos quais o URL estava lá mais de 1000 vezes. (ainda não sei como ele conseguiu que a alta :))
Rob Williams
@ Peter, @ Rob, obrigado por responder, eu tinha medo que a busca e substituição fosse a única solução, mas queria perguntar primeiro. Vou dar uma olhada nesse script.
precisa
O melhor é usar um script como o que sugeri. Observe que uma pesquisa e substituição de texto em um db db estragará os dados serializados (especialmente encontrados em wp_options) se e quando o comprimento das cadeias de pesquisa e substituição não for o mesmo, pois esses dados são armazenados no db com uma especificação de comprimento . Sucesso, Peter #
Peter

Respostas:

9

Eu também estava procurando uma solução para isso e achei uma simples.

É isso que você precisa colocar no campo URL:

/index.php/internal-site-name

insira a descrição da imagem aqui

Funciona muito bem!

Atenciosamente Chris

Christian Hatz
fonte
1
Isso funciona, mas também altera o URL para incluir o index.php. No caso de um aplicativo de página única com # links, ele atualizaria a página primeiro e depois o levaria ao destino (somente na primeira vez). Mesmo assim, uma boa idéia
Catalin Deaconescu
Eu usei / algo sem a parte index.php e parece funcionar
user3808307
4

Você pode usar o nav_menu_link_attributesfiltro para inspecionar e modificar o atributo href para cada item de menu antes que ele seja produzido.

Neste exemplo, procuramos por qualquer atributo href que comece com /ae, e precede o URL do site de teste nesse caso:

function wpd_nav_menu_link_atts( $atts, $item, $args, $depth ){
    if( '/' == substr( $atts['href'], 0, 1 ) ){
        $atts['href'] = 'http://testserver.com/example' . $atts['href'];
    }
    return $atts;
}
add_filter( 'nav_menu_link_attributes', 'wpd_nav_menu_link_atts', 20, 4 );

Você pode criar um plugin simples com esse código e ativá-lo apenas no servidor de teste ou criar algum tipo de sinalizador que aplique condicionalmente esse filtro quando o ambiente do site de teste estiver presente.

Milo
fonte
Foi a melhor maneira que encontrei! Mas, por favor, @Milo, altere a terceira linha com este URL de base mais inteligente do wordpress (obtenha o site_url do wordpress): $ atts ['href'] = site_url (). $ atts ['href'];
Gtamborero 22/10/19
2

O uso da <base href=" ">tag na meta head fornecerá um URL base para todas as âncoras relativas na página.

Referência:
https://www.w3.org/TR/html4/struct/links.html
12.4 Informações do caminho: o elemento BASE

Links personalizados relativos no wordpress:
se você quiser que o URL do site seja o URL base de todas as âncoras, adicione-o ao theme / header.php dentro de <head>:

<base href="<?php echo site_url(); ?>/">

Eu sei que poderia estar atrasado para você, mas poderia ajudar outra pessoa.

David Pacheco
fonte
Parece promissor. Vou testá-lo e relatar de volta.
Eric Hepperle - CodeSlayer2010
Não funciona com caminhos como, a ehepperle.com/sites/in-progress/some-wp-site-root/menos que você defina explicitamente a raiz do site. A velocidade de desenvolvimento da Web não é visivelmente melhorada usando a basetag, pois quando você migra para outro site, você terá que redefinir o que é base. No entanto, posso ver o valor na redução do comprimento dos valores href.
Eric Hepperle - CodeSlayer2010
A idéia é boa, mas parece que o Wordpress ignora o caminho de base ao usar caminhos relativos em menus personalizados wp (por exemplo: contato /)
gtamborero
1

Em um URL personalizado na configuração do menu, é possível usar links relativos ao [blogurl]. O segredo é iniciar o URL relativo com um único /. Quando um único / inicia o URL personalizado, o sistema não precede o típico http://e, em seguida, o URLUR do blog atual será gerado no URL de destino no momento da execução.

EXEMPLO
Se você quiser acessar sua página inicial, basta colocar /como o URL personalizado

Se você quiser ir para a página de índice na pasta bbforums, coloque /bbforumscomo o URL personalizado.

Isso permite que você mova um site para um domínio de teste sem precisar codificar o novo blogURL em todos os links personalizados para os menus.

Por exemplo:
se meu blog for http://example.come quero testá-lo em um subdomínio, http://test.example.como site poderá ser movido entre teste e produção sem problemas de menu usando a convenção relativa de URL mencionada acima. Testei com êxito essa abordagem usando o plug-in XCloner para mover o site.

user41251
fonte
6
Isso não funciona para URLs de blogs com barras, por exemplo exemplo.com/blog . Seguir o item de menu '/' levaria você ao example.com .
Jimpanzee
1

Primeiro você precisa instalar este plugin para códigos de acesso de URL.

Adicione este código ao seu functions.phparquivo no seu tema:

class description_walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $depth, $args ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
        $class_names = ' class="'. esc_attr( $class_names ) . '"';

        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) . '"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) . '"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) . '"' : '';

        // echo $item->url;
        $string = explode( '::', $item->url, 3 );
        if ( $string[1] ) {
            $string[1] = str_replace( '-', ' ', $string[1] );
            $item->url = do_shortcode( "[$string[1]]" ); 
        }

        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $prepend = '<strong>';
        $append = '</strong>';
        $description  = ! empty( $item->description ) ? '<span>' . esc_attr( $item->description ) . '</span>' : '';

        if ( $depth != 0 ) {
            $description = $append = $prepend = "";
        }

        $item_output  = $args->before;
        $item_output .= '<a'. $attributes . '>';
        $item_output .= $args->link_before . $prepend . apply_filters( 'the_title', $item->title, $item->ID ) . $append;
        $item_output .= $description . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    } 
}

Então você deve chamar a wp_nav_menufunção nos arquivos de modelos:

$arg = array( 
    'menu'        => "main-menu", 
    'echo'        => true, 
    'fallback_cb' => 'wp_page_menu', 
    'depth'       => 0, 
    'walker'      => new description_walker() 
); 
wp_nav_menu( $arg );

É isso aí. Em seguida, vá para a seção do menu back-end.

Por exemplo, se eu quiser atribuir o URL da página a um link personalizado, adicionarei-o assim:

http://::blogurl-id='1302'::

Agora você pode ir para o front-end e verificar se o código curto funciona.

Manimaran
fonte