Aktuelle URL (Permalink) ohne / page / {pagenum} / abrufen

10

Wie kann ich die aktuelle URL abrufen (ob Homepage, Archiv, Post-Typ-Archiv, Kategoriearchiv usw.), jedoch immer ohne das /page/{pagenum}/Teil, wenn es vorhanden ist? Also, wenn die echte URL lautet:

example.com/category/uncategorized/

ODER

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

dann ist der Rückgabewert immer

example.com/category/uncategorized/

Ihor Vorotnov
quelle

Antworten:

12

Sie können die aktuelle URL durch erhalten home_url( $wp->request ).

Versuchen Sie das folgende Beispiel:

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;
Govind Kumar
quelle
Das hat funktioniert! Obwohl es nichts zurückgab, wenn die URL kein / page / X / enthielt, habe ich ein wenig geändert, um es universell zu machen. Vielen Dank!
Ihor Vorotnov
7

Die Antwort von Govind Kumar funktionierte, gab jedoch nur die URL zurück, wenn / page / {pagenum} / in der URL vorhanden war, und gab nichts zurück, wenn nicht. Ich brauchte eine universelle Lösung, die immer die Basis-URL ohne Paginierung zurückgibt, also habe ich Govinds Code ein wenig geändert und in eine Funktion eingebunden:

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

Jetzt wird immer die richtige URL zurückgegeben.

( Dies ist nützlich, wenn Sie eine Art Post-Filter implementieren müssen, die einen Parameter zum Filtern von Posts nach beispielsweise einer Meta-Datei hinzufügen. Selbst wenn ein Benutzer den Filter-Parameter auf Seite X festlegt, werden die neuen gefilterten Ergebnisse immer angezeigt Beginnen Sie mit der Basis-URL, nicht mit Seite X, und werfen Sie 404, wenn weniger gefilterte Beiträge vorhanden sind. )

Ihor Vorotnov
quelle
Sehr gut. Sehr nah. Aber '/ page' ist nicht streng genug. Beispielsweise gibt page-me.com einen Wert zurück. Ein Wert, der falsch ist.
Chef Alchemist
@ChiefAlchemist guter Punkt, habe nicht einmal daran gedacht, dass der /pageTeilstring Teil des Domainnamens ist (wenn www natürlich nicht verwendet wird). Das ist imo eher ein Randfall. Ich möchte Sie jedoch dazu ermutigen, einen Beitrag zu leisten, indem Sie Code hinzufügen, der auch diesen Fall abdeckt.
Ihor Vorotnov
Vorotbov - wird es tun. Siehe unten. fwiw, es gibt viele Wörter mit der substr 'Seite' darin. Ich denke nicht, dass es sicher ist anzunehmen, dass es sich um einen Randfall handelt. Am besten so eng wie möglich machen. Langfristig weniger Sorgen.
Chef Alchemist
Es stimmt, aber obwohl ich Ihnen im Allgemeinen zustimme, war die Frage ein spezifisches Problem und wurde für den jeweiligen Fall auf die effizienteste Weise gelöst. Wenn meine Domain diesen Teilstring nicht hat, muss ich keine regulären Ausdrücke verwenden, die langsamer als einfacher Teilstring sind (und für meinen Fall gut funktionieren). Es ist kein öffentliches Plugin oder Thema, daher muss ich nicht alle möglichen Randfälle behandeln. Ihre Hinzufügung wird jedoch geschätzt und Hoffnung kann einigen zukünftigen Entwicklern helfen. Vielen Dank!
Ihor Vorotnov
5

Am einfachsten wäre es, get_pagenum_link()die aktuelle URL ohne /page/*Parameter zurückzugeben.


Bonus

Sie können es auch einfach verwenden, um mithilfe der 'paged'Abfragevariablen dynamisch "Vorherige" und "Nächste" Links zu erstellen :

// 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>';
Leymannx
quelle
3

Meine Angaben waren denen von Ihor Vorotnov sehr ähnlich, außer dass ich mehr als einen Parameter hatte. Ausgehend von seiner Antwort habe ich den Code so geändert, dass ein regulärer Ausdruck verwendet wird:

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

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

    return  $nopaging_url;
}
Lorenzo
quelle
0

Wenn Sie alle möglichen Paginierungskombinationen entfernen möchten, verwenden Sie dieses Snippet:

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

Es wird sich darum kümmern

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

und unterscheidet nicht zwischen Groß- und Kleinschreibung, funktioniert für jede Paginierungsseitenzahl und entfernt auch jede Kombination aus nachfolgender Nummer / Nummer / Nummer ... (Tests hier: https://regex101.com/r/9fQaLC/1 )

Wenn Sie die vollständige URL mit führenden http (s) erhalten möchten, fügen Sie einfach hinzu

$url = home_url($url);

In dieser Zeile können Sie auch einen beliebigen benutzerdefinierten GET-Parameter hinzufügen

$url = home_url($url . '?typ=test');
Larzan
quelle
1
Persönlich versuche ich immer, reguläre Ausdrücke zu vermeiden, wenn etwas ohne sie möglich ist (und trotzdem einfach genug bleibt). Außerdem sollte add_query_arg () zum Hinzufügen von GET-Parametern anstelle der Verkettung von Zeichenfolgen verwendet werden. Aber die Antwort selbst ist richtig und macht den Job, danke.
Ihor Vorotnov
-1

Während diese Frage hier bereits beantwortet wurde (nicht akzeptiert), sollte dieses Snippet den Trick machen : home_url(add_query_arg(NULL, NULL));.

Fabian Marz
quelle
Ich habe diesen Trick ausprobiert, funktioniert nicht. Die Ausgabe hat noch / page / 2 / angehängt.
Ihor Vorotnov
Oh, tut mir leid, ich habe verstanden, dass Sie die vollständige URL erhalten möchten, aber dies ist fehlgeschlagen, da die URL immer ohne zurückgegeben wurde 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;
    }
}
Chefalchemist
quelle
Darf ich fragen, warum Sie false zurückgeben, wenn $ str_url kein String ist? Wenn Sie versehentlich (was übrigens nicht passieren sollte) etwas anderes übergeben, zerstören Sie die Daten. Ich nehme an, stattdessen wäre es besser, unmodifiziertes $ str_url zurückzugeben. Außerdem müssen Sie die Zeichenfolge überprüfen, aber nicht sicherstellen, dass es sich tatsächlich um eine URL handelt, die analysiert werden kann (und wenn nicht, wird der folgende Code unterbrochen - wp_parse_url gibt möglicherweise false, null, int, string und array zurück). Außerdem bin ich mir nicht sicher, ob es sinnvoll ist, es als Merkmal zu verwenden, nicht jeder verwendet überall Klassen (hey, es ist WordPress, oder?).
Ihor Vorotnov