URLs relativos no WordPress

115

Sempre achei frustrante no WordPress que imagens, arquivos, links, etc. sejam inseridos no WordPress com uma URL absoluta em vez de uma URL relativa. Um url relativo é muito mais conveniente para trocar nomes de domínio, mudar entre http e https etc. Hoje eu descobri que se você definir WP_CONTENT_URL com um url relativo, quando você inserir arquivos em postagens eles usarão o url relativo para src em vez de url absoluto . Exatamente o que sempre quis! Mas a documentação oficial do WordPress diz que você deve usar um URI completo se estiver definindo WP_CONTENT_URL.

O códice do WordPress diz :

Defina WP_CONTENT_URL para o URI completo deste diretório (sem barra final), por exemplo

define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');

Tudo parece funcionar bem quando uso um URL relativo, por exemplo

define( 'WP_CONTENT_URL', '/my-content-folder');

Mas há algum problema em usar um URI relativo? Só estou pensando que deve haver um motivo para o WordPress declarar que deve ser definido com um URI completo.

AidanCurran
fonte
3
Acho que a resposta é auditar todos os usos dele no código WP e no código dos plug-ins que você está usando para garantir que nenhum deles presuma que seja um URL completo quando não é, mas não consigo pensar em nenhum motivo não estaria bem de cabeça.
Rup
2
experimente este plugin wordpress.org/plugins/relative-url ou leia isto pode ajudá-lo deluxeblogtips.com/2012/06/relative-urls.html
krishna
5
@Krishna: Por que precisaríamos de um plugin se podemos apenas inserir a URL relativa no wp-config? O ponto da questão é descobrir se o uso de URL relativa em wp-config pode causar um problema.
AidanCurran
36
Eu choro quando tenho que tocar no wordpress.
Tony Cronin
6
@TonyCronin Fique feliz, não é Drupal.
motorbaby

Respostas:

75

Acho que esse é o tipo de pergunta que apenas um desenvolvedor central poderia / deveria responder. Eu pesquisei e encontrei o tíquete principal # 17048: URLs entregues ao navegador devem ser relativos à raiz . Onde podemos encontrar as razões explicadas por Andrew Nacin, desenvolvedor líder do núcleo. Ele também tem um link para este tópico [wp-hackers] . Em ambos os links, estas são as citações principais sobre por que o WP não usa URLs relativos:

Tíquete principal:

  • URLs relativos à raiz não são realmente adequados. /path/pode não ser WordPress, pode estar fora da instalação. Então, realmente não é muito diferente de um URL absoluto.

  • Quaisquer URLs relativos também tornam significativamente mais difícil realizar transformações quando a instalação é movida. A localização e substituição será necessária na maioria das situações, e ter uma URL absoluta é ironicamente mais portátil por esses motivos.

  • URLs absolutos são necessários em vários outros lugares. A necessidade de adicioná-los condicionalmente aumentará o processamento, bem como introduzirá possíveis bugs (e incompatibilidades com plug-ins).

discussão [wp-hackers]

  • Em relação ao que, não tenho certeza, já que o WordPress costuma estar em um subdiretório, o que significa que sempre precisaremos processar o conteúdo para adicionar o resto do caminho. Isso introduz sobrecarga.

  • Lembre-se de que existem dois tipos de URLs relativos, com e sem barra inicial. Ambos têm ressalvas que tornam isso impossível de implementar adequadamente.

  • O WordPress deve (e faz) armazenar URLs absolutos. Isso não requer nenhum pré-processamento de conteúdo, nenhuma sobrecarga, nenhuma ambigüidade. Se você precisar realocar, é um localizar-substituir global no banco de dados.


E, a título pessoal, mais de uma vez encontrei tema e plug-ins mal codificados que simplesmente quebram quando WP_CONTENT_URLsão definidos.
Eles não sabem que isso pode ser definido e presumem que isso é verdade: WP.URL / wp-content / WhatEver , e nem sempre é o caso. E algo vai quebrar ao longo do caminho.


O plugin URLs relativos ( link na Resposta do edse ), aplica a função wp_make_link_relativeem uma série de filtros no gancho de açãotemplate_redirect . É um código bastante simples e parece uma boa opção.

brasofilo
fonte
14
Boas informações. Eu sempre uso caminhos relativos à raiz para que eu possa implantar em dev.mysite.com -> qa.mysite.com -> www.mysite.com ou mesmo www.anothersite.com sem problemas. É uma pena que o WP não tenha sido projetado com isso em mente. Uma vez que a configuração WP_CONTENT_URLnão parece ter como objetivo (embora permita) a configuração de urls relativos, o plug-in parece ser a melhor opção. Existe um caso de teste em que um plug-in falha durante a configuração, WP_CONTENT_URLmas funciona bem ao usar o plug-in?
Justin
2
Caminhos relativos nunca começam com / e URIs relativos (para uso interno <a>) nunca começam http://.
Tulains Córdova
13
O Wordpress nunca foi feito para sites adequados, sempre foi um hack rápido, escrito por hackers que (claramente pelas citações aqui) não pensaram ou olharam fora da caixa. A única maneira de mover um site é se ele usar CORRETAMENTE URLs relativos e / ou relativos à raiz. URLs absolutos impedem isso absolutamente.
Haqa
8
Criei sites que podem ser configurados para viver em subdomínios, raiz ou subpasta. Não é muito difícil. Eu sinto que as razões são basicamente dizendo "Nós construímos isso há muito tempo e essa mudança seria interrompida demais, então não a estamos consertando."
Donny V.
3
ainda acho que nenhuma das razões dos desenvolvedores é válida. O url codificado tem os mesmos problemas que um relativo, é apenas outra prática realmente ruim que os desenvolvedores originais têm em seu kit de ferramentas de 'hábitos ruins' ... há muitos deles no wordpress, por isso ele foi bifurcado várias vezes para remover estas questões.
Dawesi
15
<?php wp_make_link_relative( $link ) ?>

Converta caminhos de URL completos em caminhos relativos.

Remove os protocolos http ou https e o domínio. Mantém o caminho '/' no início, então não é um link relativo verdadeiro, mas da base da raiz da web.

Referência: Wordpress Codex

davidcondrey
fonte
e onde você deixa cair esse snippet de php?
Edward
6

Eu concordo com Rup. Acho que o principal motivo é evitar confusão em caminhos relativos. Acho que o wordpress pode funcionar do zero com caminhos relativos, mas o problema pode surgir ao usar vários plug-ins, como o tema é configurado etc.

Uma vez usei este plugin para caminhos relativos, ao trabalhar em servidores de teste:

URLs relativos
à raiz Converte todos os URLs em URLs relativos à raiz para hospedar o mesmo site em vários IPs, migração de produção mais fácil e melhores testes de dispositivos móveis.

Danielsalare
fonte
5
Por que um plugin seria mesmo necessário se tudo o que precisamos é configurar uma constante no arquivo wp-config? A menos que forneça uma solução para evitar uma armadilha particular de tornar WP_CONTENT_URLrelativo e não sucumba a nenhuma armadilha com sua própria abordagem. O que eu gostaria de saber é se existe realmente uma armadilha conhecida em tornar WP_CONTENT_URLrelativo.
AidanCurran
1
Um URL que começa com uma barra /wp-content/some-file.jpgé um caminho absoluto, não um caminho relativo. Não há confusão possível. É a inclusão do protocolo e do nome de domínio na URL absoluta que torna o WordPress inútil sem justificativa. Para implantar um site WP de dev a staging to live, tenho que executar um script de localizar e substituir em nomes de domínio em um despejo de banco de dados. O problema que eu acho é que ele foi projetado para editar conteúdo em produção que funcione para blogs (que é para o que foi feito), mas não para muitos sites comerciais.
Ade
1
como dude.com/bob/jane vs / bob / jane é confuso? #serious #badpractice
Dawesi
1
@Ade, por favor, faça sua lição de casa sobre os caminhos relativos. Você está incorreto sobre /wp-content/some-file.jpgser um caminho absoluto. Para outros que lerem seu comentário no futuro, observe que um caminho relativo da web é um caminho que tem o protocolo e o domínio excluídos do caminho. Assim, /wp-content/some-file.jpge wp-content/some-file.jpgsão relativos, com o /primeiro exemplo tendo o propósito de fazer referência ao diretório raiz acessível do titular da conta ou servidor.
Pegues
1
@Pegues OK, encontrei muitas fontes (algumas no SO) usando o termo "caminho absoluto" em oposição a "url absoluto". Também é conhecido como caminho "Relativo à raiz". Embora a semântica e a terminologia sejam obviamente importantes, o ponto ainda é válido: elas são fundamentalmente diferentes uma da outra. Ser relativo à raiz tem todos os benefícios de consistência de um url absoluto. A menos que haja algum outro raciocínio que eu desconheça.
Ade
4

Resolvi no meu site fazendo isso em functions.php

add_action("template_redirect", "start_buffer");
add_action("shutdown", "end_buffer", 999);

function filter_buffer($buffer) {
    $buffer = replace_insecure_links($buffer);
    return $buffer;
}
function start_buffer(){
    ob_start("filter_buffer");
}

function end_buffer(){
    if (ob_get_length()) ob_end_flush();
}

function replace_insecure_links($str) {

   $str = str_replace ( array("http://www.yoursite.com/", "https://www.yoursite.com/") , array("/", "/"), $str);

   return apply_filters("rsssl_fixer_output", $str);

}

Participei de um plugin, cortei-o em pedaços e fiz isso. Ele substituiu TODOS os links no meu site (menus, css, scripts etc.) e tudo estava funcionando.

ikebastuz
fonte
0

Em Configurações => Mídia, há uma opção para 'Caminho de URL completo para arquivos'. Se você definir isso para o caminho do diretório de mídia padrão '/ wp-content / uploads' em vez de em branco, ele irá inserir caminhos relativos, por exemplo, '/wp-content/uploads/2020/06/document.pdf'.

Não tenho certeza se isso torna todos os links relativos, por exemplo, a posts, mas pelo menos lida com mídia, o que provavelmente é o que preocupa a maioria das pessoas.

abraço
fonte
Esta opção 'Caminho de URL completo para arquivos' não aparece nas Configurações de mídia por padrão. Existe alguma configuração no wp-config que o ativa?
AidanCurran 01 de
@AidanCurran Tenho certeza de que está lá há muito tempo, mas depois de alguma pesquisa, parece que há algum wp-config habilitando isso, porque foi removido por padrão do WP 3.5+. Ele pode ser trazido de volta usando um plug-in antigo como: wordpress.org/plugins/upload-url-path-enabler Então, eu acho que um dos meus plug-ins está adicionando isso de volta, embora eu quase não tenha nenhum instalado. Basta usar o Elementor e o tema Futurio com o plugin Futurio Extra. Tentei desativá-los sem qualquer alteração, então não tenho certeza: /
abraço em
@AidanCurran Você poderia adicionar algo como: update_option ('upload_url_path', '/ wp-content / uploads'); em seu arquivo functions.php para o tema ou por meio de algum plugin de snippet de código, e deve ter o mesmo efeito.
abraço
-3

deve usar get_home_url (), então seus links são absolutos, mas não afetará se você alterar o url do site

Botond Vajna
fonte
-4

O que eu acho que você faz é enquanto você altera os nomes de domínio, o arquivo de despejo sql que você tem pode substituir todas as instâncias do nome de domínio antigo por um novo. Esta é a única opção disponível, pois não há plug-ins que o ajudem a fazer isso.

Esta é a maneira mais rápida ..

Shiva
fonte
1
Lembre-se de que você também deseja substituir o nome de domínio em strings PHP serializadas. Esta ferramenta útil de busca e substituição parece ser a maneira padrão de fazer as coisas (repositório GitHub aqui ). Isso é usado por soluções de implantação Capistrano que uso como capistrano-wp e parece funcionar muito bem. Também é referenciado na página oficial do Moving WordPress Codex .
Matt Gibson
3
Essa abordagem é confusa e sujeita a erros. Se pudermos evitá-lo usando URLs relativos em wp-config, não será muito melhor? O ponto da questão é descobrir se o uso de URL relativa em wp-config pode causar um problema.
AidanCurran
-4

Existe uma maneira facil

Em vez de /pagename/usar index.php/pagename/ou se você não usar permalinks, faça o seguinte:

Postar

index.php?p=123

Página

index.php?page_id=42

Categoria

index.php?cat=7

Mais informações aqui: http://codex.wordpress.org/Linking_Posts_Pages_and_Categories

Ger
fonte
Isso não responde à pergunta.
Mateng