Ottenere il Permalink senza dominio (cioè ottenere il permalink relativo)

28 ago 2012, 16:09:19
Visualizzazioni: 48.4K
Voti: 17

Questo è il codice che sto utilizzando:

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

Quello che fa è restituire il permalink come URL relativo, cioè solo lo slug. Per esempio, se il permalink è http://example.com/2012/01/post-title/, l'URL relativo restituito dal codice sarà /2012/01/post-title/.

Problema: Tutti i Post e le Pagine mostrano il permalink corretto, il che è ottimo. Ma tutte le altre pagine (incluse Home, Ricerca e Archivi) mostrano l'URL relativo del primo post e non quello delle rispettive pagine. Qualche idea sul perché? Cosa sto sbagliando?

Riferimento: Ottenere il permalink della pagina senza wpurl


MODIFICA: Ecco cos'altro ho provato:

In functions.php

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

In header.php

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

Lo stesso problema si verifica anche con questo metodo. Ma questo mostra anche un errore non molto informativo.

5
Commenti

Dove stai provando esattamente questo codice...?? Stai usando global $post prima del tuo codice sopra?

Joshua Abenazer Joshua Abenazer
28 ago 2012 16:31:12

@JoshuaAbenazer Sto usando il codice così com'è nel mio file header.php — sembra che sia il modo sbagliato di farlo. Modificherò la mia domanda per riflettere cos'altro ho provato, in modo che tu possa aiutarmi meglio.

its_me its_me
28 ago 2012 16:35:29

Posso chiederti perché vorresti questo?

Tom J Nowell Tom J Nowell
28 ago 2012 16:37:36

@TomJNowell Ciao. Ho bisogno di utilizzare un dominio diverso per questo markup: <link rel="alternate" hreflang="en-IN" href="http://in.example.com/2012/01/post-title/" /> — ma il permalink effettivo è così: http://example.com/2012/01/post-title/. (Leggere questo ti darà un'idea migliore di cosa sto facendo.)

its_me its_me
28 ago 2012 16:41:14

Se vuoi seguire la strada di WP, devi capire che get_permalink() serve per ottenere i link delle istanze della classe WP_Post (post, pagine, custom post type, ... )... per archivi, tag, ecc - solo categorie in generale - istanze della classe WP_Term - è get_term_link(), per la home è home_url()

jave.web jave.web
18 mar 2018 21:49:33
Tutte le risposte alla domanda 3
4
17

Io uso

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

Se la radice del sito non è /

1 nov 2013 00:40:57
Commenti

No, non funziona quando WP è in una sottodirectory...

Nabil Kadimi Nabil Kadimi
27 dic 2014 10:17:41

Cosa intendi, quando WP è in una sottodirectory?

Jim Maguire Jim Maguire
26 lug 2017 04:53:17

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

Walf Walf
8 nov 2017 08:17:47

Non è necessario usare str_replace o preg_replace, basta passare il permalink a wp_make_link_relative().

La funzione integrata è molto più semplice e gestisce anche in modo pulito gli slash finali, situazioni in cui home_url e site_url sono diversi e vari altri casi limite.

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

Usa $_SERVER['REQUEST_URI'] invece di get_permalink() per ottenere l'URL corrente. get_permalink ti darà l'indirizzo completo del post corrente, non l'indirizzo dell'URL visitato.

Ad esempio, per example.com/test/page echo $_SERVER['REQUEST_URI']; stamperà /test/page

Nota che questo non include l'hashtag, poiché quella parte non viene mai inviata al server, e non include nemmeno parametri del tipo ?foo=bar, che si trovano nell'array $_GET.

28 ago 2012 16:46:26
Commenti

Funziona perfettamente!!! Piccola correzione — nel secondo codice manca una virgoletta. echo $_SERVER['REQUEST_URI']; — e grazie!

its_me its_me
28 ago 2012 16:51:42

@TomJNowell Se non sbaglio, $_SERVER['REQUEST_URI'] ti darà l'URL corrente, il che potrebbe essere un problema se si tratta di un post paginato, cioè /test/page/2 verrà preso mentre usare get_permalink() sarebbe la soluzione per questo problema. Ha senso quello che dico?

Christine Cooper Christine Cooper
10 giu 2014 21:36:39

Che è simile al problema dell'autore originale, dovrei fare qualche test, ma puoi sempre aggiungere la tua risposta e se funziona la voterò =]

Tom J Nowell Tom J Nowell
10 giu 2014 23:34:07

Perché questa risposta è stata accettata? Non risponde nemmeno lontanamente alla domanda dell'OP!

Jim Maguire Jim Maguire
26 lug 2017 04:54:54

@JimMaguire è sicuramente correlato a quanto chiesto dall'OP, tuttavia l'autore della risposta ha dimenticato di menzionare che restituisce praticamente TUTTO ciò che segue il dominio fino all'hash (che per design non viene inviato al server). Quindi è solo un punto di partenza, non la soluzione finale.

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

Per ottenere una soluzione quasi definitiva: a) suddividi la stringa con explode() usando ? e mantieni solo la prima parte [0] per rimuovere un'eventuale query GET b) esegui una sostituzione (regexp) con preg_replace() per rimuovere eventuali "parametri URL estetici", più comunemente page/N/ - numero di pagina e altri possibili parametri che possono variare, ecco perché regexp... ad esempio preg_replace( '/\/page\/\d+\//', '/', $url )

jave.web jave.web
18 mar 2018 22:14:35
Mostra i restanti 1 commenti
0

Questa soluzione funziona per me:

function force_relative_url ($url)
{
    // Sostituisce l'URL assoluto con il percorso relativo
    return preg_replace ('/^(http)?s?:?\/\/[^\/]*(\/?.*)$/i', '$2', '' . $url);
}

Per utilizzarla su un permalink:

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