如何获取当前页面的URL显示?


55

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

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

谢谢。


您能否提供一些有关此URL的背景信息?您是否要创建可共享的URL?为链接/操作组装自定义URL吗?
汤姆·J·诺维尔

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

为什么不只使用is_home()or is_page( 'fr' )等,而是仅在脚本为真时才入队?
汤姆·J·诺威尔

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

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

Answers:


86

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

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

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

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

请注意,这可能不适用于将永久链接设置为Plain的情况,并且会忽略查询字符串(?foo=barURL 的一部分)。

要在永久链接设置为纯链接时获取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 ) );

7
如果永久链接设置为“纯”:echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
Max Yudin

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

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

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

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

8

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

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

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


嗨-如果您查看developer.wordpress.org/reference/functions/add_query_arg,您会发现您的代码实际上并未保留现有的查询参数。
安迪·麦考利-布鲁克

2
要保留查询参数你需要更换空array()$_GET。即:home_url(add_query_arg($_GET,$wp->request));
Brad Adams

如果将WordPress安装在子目录中,它将无法正常工作
-ManzoorWani

1
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

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

1

以下代码将给出当前的URL:

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

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

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

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


此代码段跳过wp-admin/plugins.php了我当前的URL,仅是根路径和查询字符串。
RyszardJędraszyk

0

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

以下示例在两种情况下均适用。

    $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 ) )

0

也许wp_guess_url()就是您所需要的。自版本2.6.0起可用。


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

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.