Ottenere il Permalink senza dominio (cioè ottenere il permalink relativo)
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.

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.

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
.

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

@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?

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

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

@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.

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 )

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));
