Obter URL atual (link permanente) sem / page / {pagenum} /

11

Como recuperar o URL atual (seja página inicial, arquivo, arquivo de tipo de postagem, arquivo de categoria etc.), mas sempre sem a /page/{pagenum}/parte, se estiver presente? Portanto, se o URL real for:

example.com/category/uncategorized/

OU

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

então o valor de retorno será sempre

example.com/category/uncategorized/

Ihor Vorotnov
fonte

Respostas:

12

Você pode obter o URL atual home_url( $wp->request ).

Tente o exemplo abaixo:

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
fonte
Isso funcionou! Embora não retornasse nada se não houvesse / page / X / na URL, modifiquei um pouco para torná-la universal. Muito obrigado!
Ihor Vorotnov
7

Resposta de Govind Kumar funcionou, no entanto, ele retornou a URL apenas se / page / {pagenum} / estava presente na URL e não retornou nada se não. Eu precisava de uma solução universal que sempre retornasse a URL base sem paginação, então modifiquei um pouco o código de Govind e envolvi uma função:

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

Agora, ele sempre retorna o URL correto.

( Isso é útil se você precisar implementar algum tipo de filtro de postagem que adicione um parâmetro para filtrar postagens por, digamos, um meta-arquivado. Portanto, mesmo se um usuário definir o parâmetro de filtro na página X, os novos resultados filtrados sempre serão comece pelo URL base, não pela página X e lance 404 se houver menos postagens filtradas. )

Ihor Vorotnov
fonte
Muito bom. Muito perto. Mas '/ page' não é estrito o suficiente. Por exemplo, page-me.com retornará um valor; um valor incorreto.
Chefe Alchemist
Bom ponto do @ChiefAlchemist, nem sequer pensou na /pagesubstring como parte do nome de domínio (se www não for usado, é claro). Isto é, na verdade, um caso extremo. No entanto, incentivamos você a contribuir adicionando código que cubra esse caso também.
Ihor Vorotnov 18/06/19
Vorotbov - Vai fazer. Por favor veja abaixo. fwiw, há muitas palavras com o substr 'page' nele. Eu não acho que seja seguro presumir que seja um caso extremo. Melhor torná-lo o mais firme possível. Menos preocupação a longo prazo.
Chefe Alchemist
É verdade, mas, embora eu concorde com você em geral, a questão era uma questão específica e foi resolvida da maneira mais eficiente para o caso em particular. Se o meu domínio não tiver essa substring, simplesmente não preciso usar nenhuma expressão regular que seja mais lenta que a substr simples (e que funcione bem no meu caso). Não é um plug-in ou tema público, portanto, não preciso cobrir todos e quaisquer casos de borda possíveis. No entanto, sua adição é apreciada e a esperança pode ajudar alguns desenvolvedores futuros. Obrigado!
Ihor Vorotnov
5

Na verdade, o mais fácil seria usar o get_pagenum_link()que retornará a URL atual sem nenhum /page/*parâmetro.


Bônus

Você também pode simplesmente usá-lo para criar links "Anterior" e "Próximo" dinamicamente usando a 'paged'variável de consulta:

// 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
fonte
3

Minhas especificidades eram muito semelhantes às de Ihor Vorotnov, exceto que eu tinha mais de um parâmetro. Então, partindo de sua resposta, modifiquei o código para usar uma expressão regular:

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
fonte
0

Se você deseja remover todas as combinações de paginação possíveis , use este trecho:

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

Vai cuidar de

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

e não diferencia maiúsculas de minúsculas, funciona para qualquer número de página de paginação e também remove qualquer combinação de número / número / número à direita ... (testes aqui: https://regex101.com/r/9fQaLC/1 )

Se você deseja obter o URL completo com os principais http, adicione

$url = home_url($url);

Nessa linha, você também pode adicionar qualquer parâmetro GET personalizado como esse

$url = home_url($url . '?typ=test');
Larzan
fonte
1
Pessoalmente, estou sempre tentando evitar expressões regulares se algo puder ser feito sem elas (e ainda assim permanecer simples o suficiente). Além disso, add_query_arg () deve ser usado para adicionar parâmetros GET em vez de concatenação de strings. Mas a resposta em si está correta e faz o trabalho, obrigado.
Ihor Vorotnov 08/08/19
-1

Embora esta questão já foi respondida aqui (não aceite), esse trecho deve fazer o truque: home_url(add_query_arg(NULL, NULL));.

Fabian Marz
fonte
Eu tentei esse truque, não funciona. A saída ainda possui / página / 2 / anexada.
Ihor Vorotnov
Desculpe, entendi que você deseja obter o URL completo, mas falhou porque sempre retornava o URL sem 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;
    }
}
Alquimista Chefe
fonte
Posso perguntar por que você retorna false se o $ str_url não é uma string? Se você acidentalmente (o que não deveria acontecer entre) passa mais nada, você está destruindo os dados. Suponho que retornar $ str_url não modificado seria melhor. Além disso, você verifica a string, mas não garante que seja realmente uma URL que possa ser analisada (e, caso contrário, o código a seguir será interrompido - wp_parse_url poderá retornar false, null, int, string e array). Além disso, não tenho certeza se usá-lo como uma característica faz sentido, nem todo mundo está usando aulas em todos os lugares (ei, é o WordPress, certo?).
Ihor Vorotnov