Quando uma única postagem é clicada em uma página de categoria ou, em qualquer caso, em qualquer página, você pode obter o URL desse referenciador e analisá-lo para obter a string de consulta. Mas isso só funciona com a estrutura permalink padrão
Exemplo quando o referenciador é uma página de categoria:
A var_dump( parse_url( wp_get_referer() ) );
fornece a seguinte saída com a estrutura de ligação permanente padrão
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(11) "/wordpress/"
["query"]=>
string(5) "cat=7"
}
Com o mesmo var_dump()
conjunto de links permanentes definido /%postname%/
, é isso que você obtém
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(32) "/wordpress/category/uit-my-lewe/"
}
Eu posso usar o path
do segundo bloco de código com get_category_by_path()
, posso obter os objetos de categoria
Meu problema é: como faço para fazer isso em termos de taxonomia.
Eu fiz um teste. Eu tenho uma taxonomia personalizada event_cat
. Se eu reescrevê-lo event-slug
, recebo o seguinte path
usando /%postname%/
como estrutura de link permanente
/wordpress/event-slug/5-star/
e
event_cat=5-star
usando a estrutura padrão
Automaticamente, meu nome de taxonomia não estará no URL, apenas a lesma do meu termo. Portanto, esse não será um método muito seguro de obter objetos do termo.
Minha pergunta é: como faço para obter corretamente a estrutura de link permanente padrão obter a string de consulta ou a string de consulta ou a taxonomia e o nome do termo da /%postname%/
estrutura de link permanente
fonte
Respostas:
Antes de tudo, devo dizer que
wp_get_referer()
não é 100% confiável, porque depende$_SERVER['HTTP_REFERER']
disso não é 100% confiável, a partir do php.net docs:Solução alternativa
Se você pode adicionar ao URL da postagem um argumento de consulta que diga de onde vem a postagem, será mais confiável e você não precisará analisar uma URL para obter um objeto de termo.
Exemplo:
Com isso, os permalinks de postagem clicados em uma página de categoria o enviarão a um URL como
E você pode entender facilmente de onde o usuário vem sem confiar
$_SERVER['HTTP_REFERER']
e sem nenhum outro esforço.Responda sua pergunta
Obter informações de consulta a partir de um URL é algo que o WordPress faz dentro do
WP::parse_request()
método.Esse método deve ser usado apenas uma vez e apenas para o URL "principal" (o URL que um usuário está visualizando) e não para URLs arbitrários.
Alguns meses atrás, eu escrevi o plugin Url To Query com o objetivo de fazer a mesma coisa para URLs arbitrários.
O que fiz foi pegar
WP::parse_request()
e refatorá-lo para um código OOP mais sensato e fazê-lo funcionar com URLs arbitrários (por exemplo, o URL para processar é recebido como argumentos em vez de ser retirado de$_SERVER
var).Usando meu plugin, você pode
Então você obtém os argumentos da consulta (algo para o qual você pode passar diretamente
new WP_Query
) a partir de um URL, é exatamente issoWP::parse_request()
isso faz.No seu caso, você provavelmente pode verificar a matriz args sem precisar executar uma consulta.
Isso certamente pode funcionar, no entanto, acho que o esforço adicional necessário para analisar o URL e a falta de confiabilidade
$_SERVER['HTTP_REFERER']
tornam a primeira solução melhor para seus escopos.fonte
A intenção original dessa pergunta era saber de onde uma única postagem foi referida e, de acordo com isso, servir as próximas e as anteriores de acordo com o referenciador da postagem.
O que eu queria realizar era, por exemplo:
Uma postagem é clicada em uma página de categoria, taxonomia, tag, pesquisa ou arquivo de autor. Esses arquivos servem como referenciadores. Agora, normalmente, seria usado, como na minha pergunta,
wp_get_referer()
para obter esse referenciador e usá-lo em consultas adicionais. Conforme descrito por @GM em sua resposta aceita acima , esse método não é confiável, então fui e usei sua Solução Alternativa .O outro problema era a necessidade de usar algum tipo de cookie ou sessão para armazenar esse referenciador, para que você ainda divulgue as postagens do referenciador original quando sair da postagem única original que foi clicada no arquivo específico. Como os cookies também são controlados pelo usuário final e, portanto, não são confiáveis, e o fato de o WordPress não usar sessões por padrão, refatorei os links de postagem seguinte e anterior usando o @GM Alternative Solution para ter uma maneira confiável de verificar e armazenar meu original referenciador.
Foi isso que eu criei, e espero que alguém ache útil no futuro próximo. Por favor, use e abuse do código para atender às suas necessidades, apenas uma solicitação: deixe um link para esta pergunta. :-)
NOTAS SOBRE O CÓDIGO A SEGUIR
Esse código é bastante longo e intenso, então não vou entrar em detalhes. O código foi bem comentado
Este código tem a opção de paginar entre as postagens dentro do mesmo termo, assim como o padrão
next_post_link()
e asprevious_post_link()
funções no WordPress. Assim como as funções nativas, você deve definir a taxonomia. O valor padrão parain_same_term
étrue
e a taxonomia écategory
Mais importante ainda, esse código requer PHP 5.4+
O CÓDIGO
USO EM MODELOS ÚNICOS
Se você não precisar navegar pelas postagens no mesmo termo, obter postagens de todos os tipos de post e personalizar o texto seguinte e anterior com o seu link, faça o seguinte:
EDIT 1
A pedido de uma postagem no SO e como parte de uma
@todo
, introduzi agora o suporte para não apenas navegar entre as postagens do tipo de postagem atual, mas também de uma variedade de tipos de postagem definidos pelo usuário usando o métodopost_types
parâmetro na função Por favor, veja o código atualizado.EDIT 2
Adicione
'suppress_filters' => true,
aosWP_Query
argumentos para que a paginação não seja alterada por nenhum filtro usado dentroWP_Query
fonte