我想添加自定义PHP代码,以确保在我的浏览器中加载网站上的页面时,该页面的URL都会回显到屏幕上。我可以使用echo get_permalink(),但这不适用于所有页面。有些页面(例如我的首页)显示了几则帖子,如果我在这些页面上使用get_permalink(),则不会返回所显示页面的URL(我相信它会返回循环中最后一篇文章的URL)。对于这些页面,如何返回URL?

我可以将get_permalink()附加到在执行循环之前触发的特定挂钩吗?还是我可以以某种方式跳出循环,或者在完成后重设循环?

谢谢。

评论

您能否提供一些有关此URL想要做什么的上下文?您是否要创建可共享的URL?组装用于链接/操作的自定义URL吗?

@TomJNowell我想加入一个特定的JS脚本,但仅在某些页面上入队(在这种情况下,这些页面是我网站以各种语言显示的主页:example.com,example.com / fr,example.com / es,等等)。 JS文件将服务器添加到仅显示在首页上的几个标题的超链接。

为什么不只使用is_home()或is_page('fr')等,仅在脚本为真时才入队?

@TomJNowell现在,我的代码是if(home_url($ wp-> request)== home_url()){wp_enqueue_script();}这似乎在每个主页上触发,无论使用哪种语言。那是你的建议吗?

为什么不使用$ _SERVER ['REQUEST_URI']和公司呢?看到这个问题:stackoverflow.com/q/6768793/247696

#1 楼

get_permalink()仅对单个页面和帖子非常有用,并且仅在循环内有效。

我见过的最简单的方法是:

global $wp;
echo home_url( $wp->request )


$wp->request包含URL的路径部分,例如/path/to/pagehome_url()在“设置”>“常规”中输出URL,但是您可以为其添加路径,因此我们在此代码中将请求路径附加到了原始URL。

请注意,这可能不会可以将永久链接设置为“纯”,并保留查询字符串(URL的?foo=bar部分)。

要在永久链接设置为“纯”时获取URL,可以改用$wp->query_varsadd_query_arg()

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );


,并且可以将这两种方法结合使用以获取当前URL,包括查询字符串,而无需考虑永久链接设置:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );


评论


如果永久链接设置为plain:echo'//'。 $ _SERVER ['HTTP_HOST']。 $ _SERVER ['REQUEST_URI'];。

– Max Yudin
17年7月25日在12:18



@Jacob我尝试过,但是似乎只返回我主页的URL。如您在此页面左上方所看到的(dev.horizo​​nhomes-samui.com/properties/hs0540),我在其中插入了代码以回显home_url($ wp-> request)。我确保也包括全局$ wp。永久链接不是“普通”,而是设置为“帖子名称”。我也没有在日志中看到任何相关的PHP错误。该特定页面是我的开发站点的一部分,否则将其阻止访问者访问。我不确定这是否重要。编辑:实际上,请保持这种想法-可能是用户错误。支持...

–cag8f
17年7月25日在16:14



@Jacob编辑2:确定您的代码确实起作用。我的问题是我将代码包含在functions.php'naked'中,即未包含在连接到钩子的任何函数中。因此,无论我的浏览器中显示的页面是什么,您的代码都将返回主页的URL。一旦将代码移到一个函数中(一个附加到WP钩子的函数(wp_enqueue_scripts))中,它确实返回了所显示页面的URL。您知道这种行为的原因吗?也许我需要为此提出一个新问题。

–cag8f
17年7月25日在16:20

@ cag8f如果代码在functions.php中处于“裸”状态,则您需要在$ wp对象的所有属性都已设置之前运行它。当将其包装到附加到适当的钩子的函数中时,您将延迟其执行,直到运行Wordpress代码中的适当点为止。

–安迪·麦考利-布鲁克(Andy Macaulay-Brook)
18年4月5日在11:28

这些方法都很棒,并且是使用WordPress的好主意。不过,您可以根据需要向它们添加Trailingslashit()。

–杰克
19-10-17在22:56

#2 楼

您可以使用以下代码在WordPress中获取整个当前URL:

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));


这将显示完整路径,包括查询参数。

评论


嗨-如果您查看developer.wordpress.org/reference/functions/add_query_arg,您会发现您的代码实际上并未保留现有的查询参数。

–安迪·麦考利-布鲁克(Andy Macaulay-Brook)
18年4月5日在10:55

要保留查询参数,您需要用$ _GET替换空的array()。即:home_url(add_query_arg($ _ GET,$ wp-> request));

–布拉德·亚当斯(Brad Adams)
18年6月14日在12:48

如果将WordPress安装在子目录中,则无法使用

–ManzoorWani
18年11月26日在12:01

#3 楼

为什么不只使用?

get_permalink(get_the_ID());


评论


+1所有其他答案非常复杂,这只是最简单的解决方案

–马克
4月16日13:37

这是最简单的方法。 +1

– Syafiq Freman
5月23日18:30

不适用于我网站上的博客类别

– Iggy
6月21日14:04

对于类别页面,请使用get_category_link(get_query_var('cat'));

–达里奥·扎德罗(Dario Zadro)
6月23日19:38

#4 楼

以下代码将提供当前URL:

global $wp;
echo home_url($wp->request)


您可以使用以下代码获取完整的URL和查询参数。

global $wp;  
$current_url = home_url(add_query_arg(array($_GET), $wp->request));


这将显示完整路径,包括查询参数。如果URL中已有查询参数,则会保留。

评论


该代码段跳过了我当前URL中的wp-admin / plugins.php,它只是根路径和查询字符串。

– RyszardJędraszyk
19年8月3日,在1:25

#5 楼

function current_location()
{
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

echo current_location();


评论


您能解释一下该代码如何以及为何解决该问题吗?

– kero
18年11月29日在11:29

我认为最灵活的解决方案。它可以在任何WP页面上运行(甚至在wp-admin,wp-login.php,存档页面等上)。请注意,它不包含任何URL参数

– Philipp
19年4月1日在16:09

#6 楼

这是前面提到的改进的示例方式。当启用了漂亮的URL时,它可以工作,但是如果存在任何查询参数(例如/ page-slug /?param = 1或URL完全丑陋),它将丢弃。 br />
    $query_args = array();

    $query = wp_parse_url( $YOUR_URL );

    $permalink = get_option( 'permalink_structure' );

    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    echo home_url( add_query_arg( $query_args , $wp->request ) )


#7 楼

这对我有用(简短且干净的解决方案,它也在URL中包括查询字符串):
$current_url = add_query_arg( $_SERVER['QUERY_STRING'], '', home_url( $wp->request ) );

输出URL如下所示
http://sometesturl.test/slug1/slug2?queryParam1=testing&queryParam2=123

解决方案是从这里取

#8 楼

我意识到这是一个古老的问题,但是我注意到的一件事是使用get_queried_object()时没有提到过。
这是一个全局wp函数,它可以捕获与您当前所在的URL相关的任何内容。因此,例如,如果您在页面或帖子上,它将返回一个post对象。如果您在存档中,它将返回一个发布类型的对象。
WP还具有许多辅助功能,例如get_post_type_archive_link,您可以将对象的发布类型字段赋予该对象并像这样返回其链接
get_post_type_archive_link(get_queried_object()->name);

重点是,您不需要依赖于上面的一些骇客回答,而使用查询的对象始终获取正确的url。不需要额外的工作,因为使用wp的功能,您始终可以获得正确的url。

#9 楼

也许wp_guess_url()是您所需要的。从2.6.0版开始可用。

评论


这只是猜测基本URL。在前端,您最终得到的效果与home_url()相似。

–杰克
19-10-17在22:54

#10 楼

经过对一个简单任务的大量研究后,上面所有答案的混合对我们有用:

function get_wp_current_url(){
    global $wp;
    if('' === get_option('permalink_structure')) return home_url(add_query_arg(array($_GET), $wp->request));
        else return home_url(trailingslashit(add_query_arg(array($_GET), $wp->request)));
}


末尾没有遗漏的斜线,依此类推。作为有关输出当前URL的问题ID,这与安全性和内容无关。但是,在PHP中找不到像#comment这样的哈希。

#11 楼

就我而言,此代码可以正常工作:
$current_url = home_url($_SERVER['REQUEST_URI'])

我希望它能对某人有所帮助,我尝试了所有答案,但这对我很有帮助。