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 ); ?>
大家好!
我需要获取文章的 URL 并通过删除它的最后一部分(向上移动一级)来修改它。
使用 Wordpress 函数 <?php echo get_permalink( $post->ID ); ?>
使用示例。我当前文章的 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 ); ?>