Obține Permalink fără domeniu (obține permalink relativ)

28 aug. 2012, 16:09:19
Vizualizări: 48.4K
Voturi: 17

Acesta este codul pe care îl folosesc:

<?php echo str_replace( home_url(), '', get_permalink($post->ID) ); ?>

Ceea ce face este să afișeze permalink-ul ca URL relativ, adică doar slug-ul. De exemplu, dacă permalink-ul este http://example.com/2012/01/post-title/, URL-ul relativ generat de cod ar arăta ca /2012/01/post-title/.

Problemă: Toate Articolele și Paginile arată permalink-ul corect, ceea ce este excelent. Dar toate celelalte pagini (inclusiv Prima Pagină, Căutare și Arhive) arată URL-ul relativ al primului articol și nu pe cel al paginilor respective. Aveți vreo idee de ce? Ce fac greșit aici?

Referință: Obține permalink-ul paginii fără wpurl


EDIT: Iată ce altceva am încercat:

În functions.php

function get_relative_permalink( $url ) {
    $url = get_permalink();
    return str_replace( home_url(), "", $url );
}

În header.php

<link rel="alternate" hreflang="en-IN" href="http://in.example.com/<?php echo get_relative_permalink(); ?>" />

Aceeași problemă și cu aceasta. Dar aceasta arată și o eroare mai puțin informativă.

5
Comentarii

Unde anume încerci să folosești acest cod...?? Folosești global $post înainte de codul tău de mai sus?

Joshua Abenazer Joshua Abenazer
28 aug. 2012 16:31:12

@JoshuaAbenazer Folosesc codul exact așa cum este în fișierul meu header.php — se pare că acesta nu este modul corect de a face asta. Voi edita întrebarea mea pentru a reflecta ce altceva am încercat, astfel încât să mă poți ajuta mai bine.

its_me its_me
28 aug. 2012 16:35:29

Pot întreba de ce ai nevoie de asta?

Tom J Nowell Tom J Nowell
28 aug. 2012 16:37:36

@TomJNowell Salut. Trebuie să folosesc un alt domeniu pentru acest markup: <link rel="alternate" hreflang="en-IN" href="http://in.example.com/2012/01/post-title/" /> — dar permalink-ul real arată astfel: http://example.com/2012/01/post-title/. (Citind asta îți va oferi o idee mai bună despre ce încerc să fac.)

its_me its_me
28 aug. 2012 16:41:14

Dacă vrei să mergi pe calea WP, trebuie să înțelegi că get_permalink() este folosit pentru a obține link-uri ale instanțelor clasei WP_Post (articole, pagini, tipuri personalizate de postări, ... )... pentru arhive, etichete, etc - în general doar categorii - instanțe ale clasei WP_Term - se folosește get_term_link(), iar pentru pagina de start este home_url()

jave.web jave.web
18 mar. 2018 21:49:33
Toate răspunsurile la întrebare 3
4
17

Eu folosesc

str_replace(home_url(), '', get_permalink());

Dacă rădăcina site-ului nu este /

1 nov. 2013 00:40:57
Comentarii

Nu, nu funcționează când WP este într-un subdirector...

Nabil Kadimi Nabil Kadimi
27 dec. 2014 10:17:41

Ce vrei să spui, când WP este într-un subdirector?

Jim Maguire Jim Maguire
26 iul. 2017 04:53:17

@JimMaguire http://example.com/not-the-root-dir/

Walf Walf
8 nov. 2017 08:17:47

Nu este nevoie să folosești str_replace sau preg_replace, doar transmite permalink-ul la wp_make_link_relative().

Funcția încorporată este mult mai simplă și, de asemenea, gestionează elegant slash-urile finale, situațiile în care home_url și site_url sunt diferite și diverse alte cazuri particulare.

senectus senectus
19 nov. 2021 14:05:16
6
13

Folosește $_SERVER['REQUEST_URI'] în loc de get_permalink() pentru a obține URL-ul curent. get_permalink va returna adresa completă a postării curente, nu adresa URL-ului vizitat.

De exemplu, pentru example.com/test/page echo $_SERVER['REQUEST_URI']; va afișa /test/page

Reține că acest lucru nu include hashtag-ul, deoarece acea parte nu este niciodată trimisă către server, și de asemenea nu include parametrii de tip ?foo=bar, aceștia se află în tabloul $_GET.

28 aug. 2012 16:46:26
Comentarii

Funcționează perfect!!! Mică corecție — în al doilea cod lipsește un ghilimele. echo $_SERVER['REQUEST_URI']; — și mulțumesc!

its_me its_me
28 aug. 2012 16:51:42

@TomJNowell Dacă nu greșesc, $_SERVER['REQUEST_URI'] vă va oferi URL-ul curent, ceea ce poate fi o problemă dacă este un articol paginat, adică /test/pagina/2 va fi preluat în timp ce utilizarea get_permalink() ar fi soluția pentru această problemă. Am dreptate?

Christine Cooper Christine Cooper
10 iun. 2014 21:36:39

Ceea ce este similar cu problema originală a autorului, ar trebui să fac câteva teste, dar poți să adaugi propriul răspuns și dacă funcționează voi vota pozitiv =]

Tom J Nowell Tom J Nowell
10 iun. 2014 23:34:07

De ce a fost acceptat acest răspuns? Nu răspunde nici pe departe la întrebarea OP!

Jim Maguire Jim Maguire
26 iul. 2017 04:54:54

@JimMaguire este cu siguranță legat de ceea ce a întrebat OP, însă autorul răspunsului a uitat să menționeze că returnează practic TOTUL după domeniu până la hash (care nu este trimis serverului prin design). Deci este doar un punct de plecare, nu soluția finală.

jave.web jave.web
18 mar. 2018 21:59:49

Obține o soluție aproape finală: a) explode() șirul după ? și păstrează doar prima parte [0] pentru a elimina o posibilă interogare GET b) execută o înlocuire (regexp) (preg_replace()) pentru a elimina orice "parametri URL frumoși" posibili, cel mai comun fiind page/N/ - numărul paginii și alți parametri posibili care se pot schimba, de aceea regexp... de exemplu preg_replace( '/\/page\/\d+\//', '/', $url )

jave.web jave.web
18 mar. 2018 22:14:35
Arată celelalte 1 comentarii
0

Aceasta funcționează pentru mine:

function force_relative_url ($url)
{
    return preg_replace ('/^(http)?s?:?\/\/[^\/]*(\/?.*)$/i', '$2', '' . $url);
}

Pentru a o folosi pe un link permanent:

$relative_permalink = force_relative_url (get_permalink ($post->ID));
22 apr. 2016 18:05:07