PHP - 从 URL 中删除最后一部分

PHP - remove last part from URL

大家好!

我需要获取文章的 URL 并通过删除它的最后一部分(向上移动一级)来修改它。

使用 Wordpress 函数 <?php echo get_permalink( $post->ID ); ?>

抓取当前 URL

使用示例。我当前文章的 URL:

http://example.com/apples/dogs/coffee

删除 URL 的最后一部分,因此它将是:

http://example.com/apples/dogs

(最后没有斜线)

所以这将 return 当前的 Wordpress URL:

<a href="<?php echo get_permalink( $post->ID ); ?>">Text</a>

但是我怎样才能删除它的最后一部分呢?

提前致谢!

这将满足您的要求 -

 echo implode('/',array_slice(explode('/',get_permalink( $post->ID )),0,-1))

但它很弱。

只有在您可以保证在 URL 末尾没有任何您需要保留的额外内容时,才使用如此简单的解决方案。

有很多方法(分解、strpos 和 substr、正则表达式)。使用正则表达式你可以做这样的事情:

$url = 'http://example.com/apples/dogs/coffee';
$url = preg_replace('#/[^/]+?$#', '', $url);
$url = 'http://example.com/apples/dogs/coffee';
$newurl = dirname($url);

这里写的大部分答案都可行,但使用 explode 和 RegExp 解析 url 是一种不好的做法。最好用PHP函数parse_url。在这种情况下,如果 url 发生变化,您不会遇到问题。此代码将省略 url 片段的最后一部分。

代码如下:

<?php
$url = 'http://example.com/apples/dogs/coffee';
$parsed_url = parse_url($url);
$fragment = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
$scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] : '';
$new_fragment = '';
if(!empty($fragment)){
    $fragment_parts = explode('/', $fragment);
    // Remove the last item
    array_pop($fragment_parts);
    // Re-assemble the fragment
    $new_fragment = implode('/', $fragment_parts);
}
// Re-assemble the url
$new_url = $scheme . '://' . $host . $new_fragment;
echo $new_url;
?>

您似乎只是在寻找帖子的父级。既然如此,你需要使用 'get_post_ancestors($post->ID)'.

来自 wordpress codex...

</head>
<?php

/* Get the Page Slug to Use as a Body Class, this will only return a value on pages! */
$class = '';
/* is it a page */
if( is_page() ) { 
    global $post;
        /* Get an array of Ancestors and Parents if they exist */
    $parents = get_post_ancestors( $post->ID );
        /* Get the top Level page->ID count base 1, array base 0 so -1 */ 
    $id = ($parents) ? $parents[count($parents)-1]: $post->ID;
    /* Get the parent and set the $class with the page slug (post_name) */
        $parent = get_page( $id );
    $class = $parent->post_name;
}
?>

<body <?php body_class( $class ); ?>