获取不带/ page / {pagenum} /的当前URL(永久链接)


11

如何检索当前URL(无论是主页,存档,文章类型存档,类别存档等),但如果存在则始终没有/page/{pagenum}/部分?因此,如果实际网址是:

example.com/category/uncategorized/

要么

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

那么返回值将始终为

example.com/category/uncategorized/

Answers:


12

您可以通过获取当前URL home_url( $wp->request )

请尝试以下示例:

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;

这工作了!尽管如果URL中没有/ page / X /,它什么也不返回,但是我还是做了一些修改以使其通用。非常感谢!
Ihor Vorotnov

7

Govind Kumar的回答有效,但是,仅在URL中存在/ page / {pagenum} /时才返回URL,否则不返回任何内容。我需要一个通用的解决方案,该解决方案将始终不分页地返回基本URL,因此我对Govind的代码进行了一些修改并将其包装为一个函数:

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

现在,它总是返回正确的URL。

如果您需要实现某种后置过滤器,该过滤器会添加一个参数以通过元文件过滤帖子,这很有用。因此,即使用户在X页上设置了过滤器参数,新的过滤结果也将始终从基本网址开始,而不是第X页,如果过滤的帖子较少,则抛出404。


很好。很接近。但是'/ page'不够严格。例如,page-me.com将返回一个值;一个不正确的值。
首席炼金术士

@ChiefAlchemist好点,甚至都没有想到/page子字符串是域名的一部分(当然,如果不使用www的话)。也就是说,imo只是一种边缘情况。但是,我鼓励您通过添加也涵盖这种情况的代码来做出贡献。
Ihor Vorotnov

沃罗托夫-会的。请看下面。首先,里面有很多带有substr'page'的单词。我认为假定这是一个极端情况并不安全。最好使其尽可能紧密。从长远来看,不必担心。
首席炼金术士

是的,但是虽然我总体上同意您的意见,但是这个问题是一个特定的问题,对于特定案例,它已以最有效的方式解决了。如果我的域没有此子字符串,那么我只需要使用比简单substr慢的正则表达式(对于我的情况来说效果很好)。它不是公共插件或主题,因此我不需要介绍任何和所有可能的情况。但是,您的加入受到赞赏,希望对以后的开发人员有所帮助。谢谢!
Ihor Vorotnov

5

实际上,最简单的方法是使用get_pagenum_link()它将返回当前URL的任何/page/*参数。


奖金

您也可以使用'paged'查询变量简单地使用它动态地构建“上一个”和“下一个”链接:

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

我的细节与Ihor Vorotnov的非常相似,只是我有多个参数。因此,从他的答案开始,我修改了代码以使用正则表达式:

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

如果要删除所有可能的分页组合,请使用以下代码段:

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

它将照顾

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

并且不区分大小写,适用于任何分页页码,并且还将删除尾随编号/数字/编号的任何组合...(此处测试:https : //regex101.com/r/9fQaLC/1

如果要获取带有领先的http(s)的完整网址,只需添加

$url = home_url($url);

在该行中,您还可以添加任何自定义GET参数,如下所示

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

1
就个人而言,如果没有正则表达式,我总是在尝试避免正则表达式(并且保持足够简单)。另外,应使用add_query_arg()来添加GET参数而不是字符串连接。但是,答案本身是正确的,可以完成工作,谢谢。
Ihor Vorotnov

-1

尽管此问题已在此处得到回答(不接受),但此代码段应该可以解决问题:home_url(add_query_arg(NULL, NULL));


我已经尝试过这个技巧,但是没有用。输出仍附加/ page / 2 /。
Ihor Vorotnov

抱歉,我知道您想获取完整的URL,但失败了,因为它始终返回不带的URL 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;
    }
}

请问如果$ str_url不是字符串,为什么返回false?如果您不小心(此后不应该发生)通过其他任何操作,那么您正在破坏数据。我想返回未修改的$ str_url会更好。另外,您需要检查字符串,但不能确保它实际上是可以解析的URL(否则,以下代码将中断-wp_parse_url可能返回false,null,int,字符串和数组)。另外,我不确定将其用作特质是否有意义,不是每个人都在各处使用类(嘿,它是WordPress,对吗?)。
Ihor Vorotnov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.