Obtenir l'URL actuelle (permalien) sans / page / {pagenum} /

11

Comment puis-je récupérer l'URL actuelle (que ce soit la page d'accueil, l'archive, l'archive de type de publication, l'archive de catégorie, etc.) mais toujours sans la /page/{pagenum}/partie si elle est présente? Donc, si la véritable URL est:

example.com/category/uncategorized/

OU

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

alors la valeur de retour sera toujours

example.com/category/uncategorized/

Ihor Vorotnov
la source

Réponses:

12

Vous pouvez obtenir l'URL actuelle home_url( $wp->request ).

Essayez l'exemple ci-dessous:

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
la source
Ça a marché! Bien qu'il ne retourne rien s'il n'y avait pas / page / X / dans l'URL, j'ai donc modifié un peu pour le rendre universel. Merci beaucoup!
Ihor Vorotnov
7

Réponse de Govind Kumar a fonctionné, cependant, il ne renvoyait l'URL que si / page / {pagenum} / était présent dans l'URL et ne renvoyait rien sinon. J'avais besoin d'une solution universelle qui retournera toujours l'URL de base sans pagination, j'ai donc modifié un peu le code de Govind et enveloppé dans une fonction:

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

Maintenant, il renvoie toujours l'URL correcte.

( Ceci est utile si vous devez implémenter une sorte de filtre de publication qui ajoute un paramètre pour filtrer les publications par, disons, un méta-fichier. Donc, même si un utilisateur définit le paramètre de filtre à la page X, les nouveaux résultats filtrés seront toujours commencez par l'URL de base, pas la page X et lancez 404 s'il y a moins de messages filtrés. )

Ihor Vorotnov
la source
Très bien. Très proche. Mais '/ page' n'est pas assez strict. Par exemple, page-me.com renverra une valeur; une valeur incorrecte.
Chief Alchemist
@ChiefAlchemist bon point, n'a même pas pensé à la /pagesous - chaîne faisant partie du nom de domaine (si www n'est pas utilisé, bien sûr). C'est, imo, plutôt un cas de bord. Cependant, je vous encourage à contribuer en ajoutant du code qui couvrira également ce cas.
Ihor Vorotnov
Vorotbov - Fera. Veuillez voir ci-dessous. fwiw, il y a beaucoup de mots avec la substr 'page' dedans. Je ne pense pas qu'il soit prudent de présumer qu'il s'agit d'un cas limite. Mieux vaut le rendre aussi serré que possible. Moins d'inquiétude à long terme.
Chief Alchemist
Certes, mais bien que je sois d'accord avec vous en général, la question était un problème spécifique, et elle a été résolue de la manière la plus efficace pour le cas particulier. Si mon domaine n'a pas cette sous-chaîne, alors je n'ai simplement pas besoin d'utiliser des expressions rationnelles qui sont plus lentes que les substr simples (et qui fonctionnent bien pour mon cas). Ce n'est pas un plugin ou un thème public, donc je n'ai pas besoin de couvrir tous les cas de bord possibles. Cependant, votre ajout est apprécié et l'espoir peut aider certains futurs développeurs. Merci!
Ihor Vorotnov
5

En fait, le plus simple serait d'utiliser get_pagenum_link()qui vous renverra l'URL actuelle sans aucun /page/*paramètre.


Prime

Vous pouvez également simplement l'utiliser pour créer dynamiquement des liens "Précédent" et "Suivant" en utilisant la 'paged'variable de requête:

// 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
la source
3

Mes spécificités étaient très similaires à celles d'Ihor Vorotnov, sauf que j'avais plus d'un paramètre. Donc, à partir de sa réponse, j'ai modifié le code pour utiliser une expression régulière:

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
la source
0

Si vous souhaitez supprimer toutes les combinaisons de pagination possibles, utilisez cet extrait de code:

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

Il prendra soin de

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

et ne respecte pas la casse, fonctionne pour tout numéro de page de pagination et supprimera également toute combinaison de numéro / numéro / numéro de fin ... (tests ici: https://regex101.com/r/9fQaLC/1 )

Si vous souhaitez obtenir l'URL complète avec les principaux http, ajoutez simplement

$url = home_url($url);

Dans cette ligne, vous pouvez également ajouter n'importe quel paramètre GET personnalisé comme

$url = home_url($url . '?typ=test');
Larzan
la source
1
Personnellement, j'essaie toujours d'éviter les regex si quelque chose peut être fait sans eux (et reste assez simple). En outre, add_query_arg () doit être utilisé pour ajouter des paramètres GET au lieu de la concaténation de chaînes. Mais la réponse elle-même est correcte et fait le travail, merci.
Ihor Vorotnov
-1

Bien que cette question a été déjà répondu ici (non acceptée), cet extrait devrait faire l'affaire: home_url(add_query_arg(NULL, NULL));.

Fabian Marz
la source
J'ai essayé cette astuce, ça ne marche pas. La sortie contient toujours / page / 2 /.
Ihor Vorotnov
Oh désolé, j'ai compris que vous vouliez obtenir l'URL complète, mais vous avez échoué car il renvoyait toujours l'URL sans 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;
    }
}
Alchimiste en chef
la source
Puis-je demander pourquoi renvoyez-vous false si $ str_url n'est pas une chaîne? Si vous passez accidentellement (ce qui ne devrait pas se produire entre autres), vous détruisez les données. Je suppose qu'il serait préférable de retourner $ str_url non modifié à la place. De plus, vous avez une vérification de la chaîne, mais vous ne vous assurez pas qu'il s'agit bien d'une URL qui peut être analysée (et sinon, le code suivant se cassera - wp_parse_url peut retourner false, null, int, chaîne et tableau). De plus, je ne sais pas s'il est logique de l'utiliser comme trait, tout le monde n'utilise pas les classes partout (bon, c'est WordPress, non?).
Ihor Vorotnov