Obține URL-ul curent (permalink) fără /page/{pagenum}/

29 nov. 2016, 10:49:16
Vizualizări: 48.5K
Voturi: 14

Cum pot obține URL-ul curent (fie că este pagina principală, arhivă, arhivă tip post, arhivă categorie etc.) dar întotdeauna fără partea /page/{pagenum}/ dacă aceasta există? Astfel, dacă URL-ul real este:

example.com/category/uncategorized/

SAU

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

atunci valoarea returnată va fi întotdeauna

example.com/category/uncategorized/

0
Toate răspunsurile la întrebare 8
1
14

Puteți obține URL-ul curent prin home_url( $wp->request ).

Încercați exemplul de mai jos:

global $wp;

// obține URL-ul curent cu șirul de interogare.
$current_url =  home_url( $wp->request ); 

// obține poziția unde începe textul '/page.. '.
$pos = strpos($current_url , '/page');

// elimină șirul din poziția specifică
$finalurl = substr($current_url,0,$pos);


echo $finalurl;
29 nov. 2016 11:22:37
Comentarii

A funcționat! Totuși, returna nimic dacă nu exista /page/X/ în URL, așa că am modificat puțin pentru a o face universală. Mulțumesc mult!

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

De fapt, cea mai ușoară metodă ar fi să folosești get_pagenum_link() care va returna URL-ul curent fără niciun parametru /page/*.


Bonus

Poți de asemenea să-l folosești simplu pentru a construi link-urile "Anterior" și "Următor" dinamic folosind variabila de interogare 'paged':

// Obține numărul paginii curente.
$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>';

// Și având un obiect `WP_Query` poți construi și link-ul pentru ultima pagină:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';
8 mai 2019 13:08:11
Comentarii

Acest lucru este util, dar adaugă și parametri de interogare în URL. Va trebui să îi eliminați separat.

trainoasis trainoasis
5 oct. 2020 09:12:00

Acest lucru este ușor de utilizat.

vee vee
23 iun. 2024 16:06:58
4
10

Răspunsul dat de Govind Kumar a funcționat, însă returna URL-ul doar dacă /page/{număr_pagină}/ era prezent în URL și nu returna nimic dacă nu era. Aveam nevoie de o soluție universală care să întoarcă întotdeauna URL-ul de bază fără paginare, așa că am modificat puțin codul lui Govind și l-am încapsulat într-o funcție:

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

Acum, returnează întotdeauna URL-ul corect.

(Acest lucru este util dacă trebuie să implementezi un fel de filtre pentru postări care adaugă un parametru pentru a filtra postările după, să zicem, un câmp meta. Astfel, chiar dacă un utilizator setează parametrul de filtrare pe pagina X, noile rezultate filtrate vor începe întotdeauna de la URL-ul de bază, nu de la pagina X, evitând eroarea 404 dacă sunt mai puține postări filtrate.)

29 nov. 2016 11:57:39
Comentarii

Foarte bine. Foarte aproape. Dar '/page' nu este suficient de strict. De exemplu, http://page-me.com va returna o valoare; o valoare care este incorectă.

Chief Alchemist Chief Alchemist
15 iun. 2018 20:09:44

@ChiefAlchemist bun punct, nici măcar nu m-am gândit la faptul că subșirul /page poate face parte din numele de domeniu (dacă nu este folosit www, bineînțeles). Adică, după părerea mea, este mai degrabă un caz marginal. Totuși, te-aș încuraja să contribui prin adăugarea de cod care să acopere și acest caz.

Ihor Vorotnov Ihor Vorotnov
19 iun. 2018 00:27:30

Vorotbov - O voi face. Te rog să vezi mai jos. fwiw, există o mulțime de cuvinte care conțin subșirul 'page'. Nu cred că este sigur să presupunem că este un caz marginal. Cel mai bine este să o facem cât mai precisă. Mai puține griji pe termen lung.

Chief Alchemist Chief Alchemist
20 iun. 2018 16:25:58

Adevărat, dar deși sunt de acord cu tine în general, întrebarea era legată de o problemă specifică, și a fost rezolvată în cel mai eficient mod pentru cazul particular. Dacă domeniul meu nu conține acest substring, atunci pur și simplu nu trebuie să folosesc regex-uri care sunt mai lente decât un simplu substr (și care funcționează bine în cazul meu). Nu este un plugin sau temă publică, așa că nu trebuie să acopăr toate cazurile posibile. Totuși, adăugarea ta este apreciată și sper că poate ajuta alți dezvoltatori în viitor. Mulțumesc!

Ihor Vorotnov Ihor Vorotnov
22 iun. 2018 11:41:43
0

Cerințele mele au fost foarte asemănătoare cu cele ale lui Ihor Vorotnov, cu excepția faptului că aveam mai mult de un parametru. Așadar, pornind de la răspunsul său, am modificat codul pentru a folosi o expresie regulată:

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

Dacă dorești să elimini toate combinațiile posibile de paginare, atunci folosește acest fragment de cod:

// elimină paginarea din URL
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Acesta va gestiona

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

și este insensibil la majuscule/minuscule, funcționează pentru orice număr de pagină și va elimina orice combinație de numere finale/numere/numere... (poți testa aici: https://regex101.com/r/9fQaLC/1)

Dacă dorești să obții URL-ul complet cu prefixul http(s), adaugă

$url = home_url($url);

Pe această linie poți adăuga și parametri GET personalizați, astfel:

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

Personal, încerc mereu să evit expresiile regulate (regex) dacă ceva poate fi făcut fără ele (și să rămână suficient de simplu). De asemenea, add_query_arg() ar trebui folosit pentru a adăuga parametri GET în loc de concatenarea de șiruri. Dar răspunsul în sine este corect și își face treaba, mulțumesc.

Ihor Vorotnov Ihor Vorotnov
8 aug. 2019 23:59:51
2
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
Comentarii

Mulțumesc - la prima vedere, asta este același lucru cu răspunsul lui Ihor. Poți edita răspunsul pentru a explica ce ai schimbat și de ce această variantă este mai bună?

Rup Rup
16 mar. 2022 17:22:17

Este literalmente același cod, cu excepția faptului că adaug manual / în loc să folosesc trailingslashit() (care, apropo, se asigură că este adăugată doar o singură liniuță)

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

Deși această întrebare a fost deja răspunsă aici (răspuns neacceptat), acest fragment de cod ar trebui să facă treaba: home_url(add_query_arg(NULL, NULL));.

29 nov. 2016 11:13:22
Comentarii

Am încercat acest truc, nu funcționează. Rezultatul tot are /page/2/ adăugat.

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

Oh, scuze, am înțeles că vrei să obții URL-ul complet dar nu a funcționat pentru că întotdeauna returna URL-ul fără page/{pagenum}.

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

    /**
     * Elimină paginarea și query string-ul. Returnează un URL prietenos pentru filtrarea rezultatelor
     *
     * @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'] ) ) {

                // dacă avem paginare, o eliminăm
                $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 iun. 2018 16:22:10
Comentarii

Pot să întreb de ce returnezi false dacă $str_url nu este un string? Dacă din greșeală (ceea ce nu ar trebui să se întâmple, de altfel) treci altceva, distrugi datele. Cred că ar fi mai bine să returnezi $str_url nemodificat în schimb. De asemenea, ai o verificare pentru string, dar nu te asiguri că este de fapt un URL care poate fi analizat (iar dacă nu este, codul următor va eșua - wp_parse_url poate returna false, null, int, string și array). În plus, nu sunt sigur dacă folosirea acestuia ca trăsătură are sens, nu toată lumea folosește clase peste tot (hei, este WordPress, nu?).

Ihor Vorotnov Ihor Vorotnov
22 iun. 2018 11:46:01