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


11

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

example.com/category/uncategorized/

O

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

quindi il valore restituito sarà sempre

example.com/category/uncategorized/

Risposte:


12

È possibile ottenere l'URL corrente tramite home_url( $wp->request ).

Prova l'esempio seguente:

global $wp;

// get current url with query string.
$current_url =  home_url( $wp->request ); 

// get the position where '/page.. ' text start.
$pos = strpos($current_url , '/page');

// remove string from the specific postion
$finalurl = substr($current_url,0,$pos);


echo $finalurl;

Questo ha funzionato! Anche se non restituiva nulla se non ci fosse / page / X / nell'URL, quindi ho modificato un po 'per renderlo universale. Molte grazie!
Ihor Vorotnov,

7

La risposta di Govind Kumar ha funzionato, tuttavia, ha restituito l'URL solo se / page / {pagenum} / era presente nell'URL e non ha restituito nulla in caso contrario. Avevo bisogno di una soluzione universale che restituisse sempre l'URL di base senza impaginazione, quindi ho modificato un po 'il codice di Govind e inserito 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.

( Ciò è utile se è necessario implementare un qualche tipo di filtro post che aggiunge un parametro per filtrare i post per, diciamo, un meta archiviato. Quindi, anche se un utente imposta il parametro filtro nella pagina X, i nuovi risultati filtrati saranno sempre inizia dall'URL di base, non dalla pagina X e lancia 404 se ci sono meno post filtrati. )


Molto bene. Molto vicino. Ma "/ page" non è abbastanza rigoroso. Ad esempio, page-me.com restituirà un valore; un valore errato.
Chief Alchemist,

@ChiefAlchemist è un buon punto, non ho nemmeno pensato che la /pagesottostringa facesse parte del nome di dominio (se www non viene usato, ovviamente). Cioè, imo, piuttosto un caso limite. Tuttavia, ti incoraggio a contribuire con l'aggiunta di codice che tratterà anche questo caso.
Ihor Vorotnov,

Vorotbov - Lo farà. Vedi sotto. prima, ci sono molte parole con il substr 'pagina' in esso. Non penso sia sicuro presumere che sia un caso limite. Meglio renderlo il più stretto possibile. Meno preoccupazioni a lungo termine.
Chief Alchemist,

È vero, ma mentre sono d'accordo con te in generale, la domanda era una questione specifica ed è stata risolta in modo molto efficiente per il caso particolare. Se il mio dominio non ha questa sottostringa, non ho bisogno di usare regex più lenti della semplice sottostringa (e che funziona bene nel mio caso). Non è un plugin o un tema pubblico, quindi non ho bisogno di coprire tutti i possibili casi limite. Tuttavia, la tua aggiunta è apprezzata e la speranza può aiutare alcuni sviluppatori futuri. Grazie!
Ihor Vorotnov,

5

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


indennità

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

// Get the current page number.
$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>';

// And having a `WP_Query` object you can also build the link for the last page:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';

3

I miei dettagli erano molto simili a quelli di Ihor Vorotnov, salvo che avevo più di un parametro. Quindi, a partire dalla sua risposta, ho modificato il codice per usare 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;
}

0

Se desideri rimuovere tutte le possibili combinazioni di impaginazione, utilizza questo snippet:

// remove pagination from url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Si prenderà cura di

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

ed è senza distinzione tra maiuscole e minuscole, funziona con qualsiasi numero di pagina di impaginazione e inoltre rimuoverà qualsiasi combinazione di numero / numero / numero finale ... (test qui: https://regex101.com/r/9fQaLC/1 )

Se vuoi ottenere l'URL completo con i principali http (s) aggiungi

$url = home_url($url);

In quella riga puoi anche aggiungere qualsiasi parametro GET personalizzato in questo modo

$url = home_url($url . '?typ=test');

1
Personalmente, cerco sempre di evitare le regex se si può fare qualcosa senza di loro (e rimanere abbastanza semplice). Inoltre, aggiungere_query_arg () dovrebbe essere usato per aggiungere parametri GET invece della concatenazione di stringhe. Ma la risposta in sé è corretta e fa il lavoro, grazie.
Ihor Vorotnov,

-1

Mentre la questione è stata già risposto qui (non acquisito), questo frammento dovrebbe fare il trucco: home_url(add_query_arg(NULL, NULL));.


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

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

-1
trait TraitURLStrip {

    /**
     * Strips off paging and query string. Returns a filter-the-results friendly URL
     *
     * @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'] ) ) {

                // if we're paging then remove that. please!
                $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;
    }
}

Posso chiederti perché restituisci false se $ str_url non è una stringa? Se accidentalmente (cosa che non dovrebbe accadere tra l'altro) passi qualcos'altro, stai distruggendo i dati. Suppongo che restituire $ str_url non modificato invece sarebbe meglio. Inoltre, hai un controllo per la stringa, ma non assicurandoti che sia effettivamente un URL che può essere analizzato (e, in caso contrario, il seguente codice si interromperà: wp_parse_url potrebbe restituire false, null, int, string e array). Inoltre, non sono sicuro che utilizzarlo come tratto abbia senso, non tutti usano le classi ovunque (ehi, è WordPress, giusto?).
Ihor Vorotnov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.