echo get_permalink()
,但这不适用于所有页面。有些页面(例如我的首页)显示了几则帖子,如果我在这些页面上使用get_permalink()
,则不会返回所显示页面的URL(我相信它会返回循环中最后一篇文章的URL)。对于这些页面,如何返回URL?我可以将
get_permalink()
附加到在执行循环之前触发的特定挂钩吗?还是我可以以某种方式跳出循环,或者在完成后重设循环?谢谢。
#1 楼
get_permalink()
仅对单个页面和帖子非常有用,并且仅在循环内有效。我见过的最简单的方法是:
global $wp;
echo home_url( $wp->request )
$wp->request
包含URL的路径部分,例如/path/to/page
和home_url()
在“设置”>“常规”中输出URL,但是您可以为其添加路径,因此我们在此代码中将请求路径附加到了原始URL。请注意,这可能不会可以将永久链接设置为“纯”,并保留查询字符串(URL的
?foo=bar
部分)。要在永久链接设置为“纯”时获取URL,可以改用
$wp->query_vars
到add_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.horizonhomes-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'])
我希望它能对某人有所帮助,我尝试了所有答案,但这对我很有帮助。
评论
您能否提供一些有关此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