Ottenere l'URL corrente (permalink) senza /page/{pagenum}/

29 nov 2016, 10:49:16
Visualizzazioni: 48.5K
Voti: 14

Come posso recuperare l'URL corrente (sia homepage, archivio, archivio dei tipi di post, archivio di categoria, ecc.) ma sempre senza la parte /page/{pagenum}/ se presente? Quindi, se l'URL reale è:

example.com/category/uncategorized/

OPPURE

example.com/category/uncategorized/page/2/

allora il valore restituito sarà sempre

example.com/category/uncategorized/

0
Tutte le risposte alla domanda 8
1
14

Puoi ottenere l'URL corrente attraverso home_url( $wp->request ).

Prova l'esempio qui sotto:

global $wp;

// ottieni l'url corrente con la query string.
$current_url =  home_url( $wp->request ); 

// ottieni la posizione dove inizia il testo '/page..'.
$pos = strpos($current_url , '/page');

// rimuovi la stringa dalla posizione specifica
$finalurl = substr($current_url,0,$pos);


echo $finalurl;
29 nov 2016 11:22:37
Commenti

Ha funzionato! Anche se non restituiva nulla se non c'era /page/X/ nell'URL, quindi ho modificato un po' per renderlo universale. Grazie mille!

Ihor Vorotnov Ihor Vorotnov
29 nov 2016 11:44:07
2
13

In realtà il modo più semplice sarebbe usare get_pagenum_link() che restituirà l'URL corrente senza alcun parametro /page/*.


Bonus

Puoi anche usarlo semplicemente per creare dinamicamente i link "Precedente" e "Successivo" utilizzando la variabile di query 'paged':

// Ottieni il numero della pagina corrente.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$first_page = '<a href="' . get_pagenum_link() . '" class="page-first"><<</a>';
$prev_page = '<a href="' . get_pagenum_link($paged - 1) . '" class="page-prev"><</a>';
$next_page = '<a href="' . get_pagenum_link($paged + 1) . ' class="page-next">></a>';

// E avendo un oggetto `WP_Query` puoi anche creare il link per l'ultima pagina:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';
8 mag 2019 13:08:11
Commenti

Questo è utile, ma aggiunge anche i parametri di query nell'URL. Dovrai rimuoverli separatamente.

trainoasis trainoasis
5 ott 2020 09:12:00

Questo è facile da usare.

vee vee
23 giu 2024 16:06:58
4
10

La risposta di Govind Kumar ha funzionato, tuttavia restituiva l'URL solo se /page/{numeropagina}/ era presente nell'URL e non restituiva nulla in caso contrario. Avevo bisogno di una soluzione universale che restituisse sempre l'URL base senza paginazione, quindi ho modificato leggermente il codice di Govind e l'ho racchiuso in una funzione:

function get_nopaging_url() {

    global $wp;

    $current_url =  home_url( $wp->request );
    $position = strpos( $current_url , '/page' );
    $nopaging_url = ( $position ) ? substr( $current_url, 0, $position ) : $current_url;

    return trailingslashit( $nopaging_url );

}

echo get_nopaging_url();

Ora restituisce sempre l'URL corretto.

(Questo è utile se hai bisogno di implementare filtri per i post che aggiungono un parametro per filtrare i post, ad esempio, per un campo meta. In questo modo, anche se un utente imposta il parametro del filtro sulla pagina X, i nuovi risultati filtrati inizieranno sempre dall'URL base, non dalla pagina X, evitando errori 404 se ci sono meno post filtrati.)

29 nov 2016 11:57:39
Commenti

Molto bene. Molto vicino. Ma '/page' non è sufficientemente rigoroso. Ad esempio, http://page-me.com restituirà un valore; un valore che è errato.

Chief Alchemist Chief Alchemist
15 giu 2018 20:09:44

@ChiefAlchemist ottimo punto, non avevo nemmeno pensato che la sottostringa /page potesse far parte del nome del dominio (se non si usa www, ovviamente). Questo è, secondo me, piuttosto un caso limite. Tuttavia, ti incoraggio a contribuire aggiungendo del codice che copra anche questo caso.

Ihor Vorotnov Ihor Vorotnov
19 giu 2018 00:27:30

Vorotbov - Lo farò. Vedi sotto. Per quel che vale, ci sono molte parole con la sottostringa 'page' al loro interno. Non credo sia sicuro presumere che sia un caso limite. Meglio renderlo il più preciso possibile. Meno preoccupazioni a lungo termine.

Chief Alchemist Chief Alchemist
20 giu 2018 16:25:58

Vero, ma anche se sono d'accordo con te in linea generale, la domanda riguardava un problema specifico, che è stato risolto nel modo più efficiente per quel caso particolare. Se il mio dominio non ha questa sottostringa, allora semplicemente non ho bisogno di usare espressioni regolari, che sono più lente di un semplice substr (e che funziona bene per il mio caso). Non è un plugin o un tema pubblico, quindi non ho bisogno di coprire tutti i possibili casi limite. Tuttavia, il tuo contributo è apprezzato e spero possa aiutare alcuni sviluppatori in futuro. Grazie!

Ihor Vorotnov Ihor Vorotnov
22 giu 2018 11:41:43
0

Le mie specifiche erano molto simili a quelle di Ihor Vorotnov, tranne che avevo più di un parametro. Quindi, partendo dalla sua risposta, ho modificato il codice per utilizzare un'espressione regolare:

function get_nopaging_url() {
    $current_url =  $_SERVER[REQUEST_URI];

    $pattern = '/page\\/[0-9]+\\//i';
    $nopaging_url = preg_replace($pattern, '', $current_url);

    return  $nopaging_url;
}
20 apr 2017 15:31:32
1

Se vuoi rimuovere tutte le possibili combinazioni di paginazione allora usa questo snippet:

// rimuove la paginazione dall'url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Si occuperà di

/page
/page/
/page/1
/page/1/
...

ed è case insensitive, funziona per qualsiasi numero di pagina di paginazione e rimuoverà anche qualsiasi combinazione di numeri finali/numeri/numeri... (test qui: https://regex101.com/r/9fQaLC/1)

Se vuoi ottenere l'URL completo con http(s) iniziale aggiungi semplicemente

$url = home_url($url);

In quella riga puoi anche aggiungere qualsiasi parametro GET personalizzato così

$url = home_url($url . '?typ=test');
8 ago 2019 12:27:49
Commenti

Personalmente, cerco sempre di evitare le espressioni regolari se qualcosa può essere fatto senza di esse (e rimanere comunque abbastanza semplice). Inoltre, add_query_arg() dovrebbe essere utilizzato per aggiungere parametri GET invece della concatenazione di stringhe. Ma la risposta in sé è corretta e fa il suo lavoro, grazie.

Ihor Vorotnov Ihor Vorotnov
8 ago 2019 23:59:51
2
/**
 * Ottiene l'URL corrente ottimizzato per SEO
 * Rimuove la paginazione dagli URL per evitare contenuti duplicati
 * @return string URL pulito con trailing slash
 */
function getCurrentUrlSeo() {
    global $wp;
    $current_url = home_url($wp->request);
    $pos = mb_strpos($current_url, '/page');
    $finalurl = $pos ? substr($current_url, 0, $pos) : $current_url;
    return $finalurl.'/';
}
16 mar 2022 13:57:12
Commenti

Grazie - a prima vista è lo stesso della risposta di Ihor. Puoi modificare la risposta per spiegare cosa hai cambiato e perché questa soluzione è migliore?

Rup Rup
16 mar 2022 17:22:17

È esattamente lo stesso codice, tranne che aggiungo manualmente / invece di usare trailingslashit() (che, tra l'altro, si assicura che venga aggiunto solo uno slash)

Ihor Vorotnov Ihor Vorotnov
17 mar 2022 14:41:20
2
-1

Sebbene questa domanda sia già stata risposta qui (non accettata), questo snippet dovrebbe funzionare: home_url(add_query_arg(NULL, NULL));.

29 nov 2016 11:13:22
Commenti

Ho provato questo trucco, ma non funziona. L'output ha ancora /page/2/ aggiunto.

Ihor Vorotnov Ihor Vorotnov
29 nov 2016 11:38:08

Oh scusa, ho capito che volevi ottenere l'URL completo ma non ci sono riuscito perché restituiva sempre l'URL senza page/{pagenum}.

Fabian Marz Fabian Marz
29 nov 2016 11:57:30
1
-1
trait TraitURLStrip {

    /**
     * Rimuove la paginazione e la query string. Restituisce un URL ottimizzato per il filtraggio dei risultati
     *
     * @param bool   $str_url
     * @param string $str_page
     *
     * @return bool|string
     */
    protected function urlStrip( $str_url = false , $str_page = 'page' ){

        if ( is_string( $str_url) ) {

            $arr_parse_url = wp_parse_url( $str_url );

            $str_path_no_page = '';
            if ( isset( $arr_parse_url['path'] ) ) {

                // Se c'è la paginazione, rimuovila per favore!
                $str_path_no_page = preg_replace( "/\/{$str_page}\/[0-9]*\/$/", "/", $arr_parse_url['path'] );

            }

            $str_scheme_host = "{$arr_parse_url['scheme']}://{$arr_parse_url['host']}";

            return $str_scheme_host . $str_path_no_page;
        }
        return false;
    }
}
20 giu 2018 16:22:10
Commenti

Posso chiedere perché restituisci false se $str_url non è una stringa? Se accidentalmente (cosa che comunque non dovrebbe accadere) passi qualsiasi altra cosa, stai distruggendo i dati. Suppongo che sarebbe meglio restituire $str_url non modificato. Inoltre, hai un controllo per la stringa, ma non ti assicuri che sia effettivamente un URL che può essere analizzato (e se non lo è, il codice seguente si interromperà - wp_parse_url può restituire false, null, intero, stringa e array). Inoltre, non sono sicuro che abbia senso usarlo come trait, non tutti usano le classi ovunque (hey, è WordPress, giusto?).

Ihor Vorotnov Ihor Vorotnov
22 giu 2018 11:46:01