我只想为某些页面(不是所有页面)添加一个重写,将基本段塞插入永久链接。这是一种独特的情况,我们事先知道所有的页面名称,它们不会改变。
For example:
sitename.com/pagetitle
到
sitename.com/service/pagetitle
我正在尝试使用“add\\u rewrite\\u rule”,但运气不太好。下面是我的一个迭代,我有很多迭代。如有任何指导,将不胜感激。
我知道有一个插件可以让你将你的文章和页面的永久链接完全更改为你想要的任何内容,但我希望我可以自己通过编程实现。
add_action( \'init\', \'page_change\' );
function page_change()
{
add_rewrite_rule(
\'^pagenamehere/?\',
\'index.php?post_type=service\',
\'top\' );
}
Updated code below:
function new_rewrite_rule()
{
add_rewrite_rule(\'^services/statictitle$\', \'index.php?pagename=oldname\', \'top\');
}
add_action(\'init\', \'new_rewrite_rule\');
因此,此代码允许在“services/statictitle”上访问该链接但是,旧链接仍然可以访问。因此,我不确定我是否会以正确的方式进行。。。。。任何帮助都将不胜感激。
谢谢
Update
这里有一种我认为可能更合适的替代方法。尽管如此,这是针对所有页面的。有没有一种方法可以只针对pagename或id?
function custom_page_rules() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root . \'services/%pagename%\';
}
SO网友:jgraup
这种方法可能更灵活一些。
$basePageRewrite->add_rule( \'service\', \'page-title\' );
在类定义的末尾,您应该能够添加
base
和
page
. 将为您添加的规则动态构建URL重写。如果a
page
直接调用is将重定向到
$base/$pageTitle
.
<?php
if ( ! class_exists( \'BasePageRewrite\' ) ):
class BasePageRewrite {
const ENDPOINT_QUERY_PARAM_REDIRECT = \'____base_page_rewrite__redirect\';
private static $_hash_map = array ();
/**
* BasePageRewrite constructor.
*/
public function __construct() {
add_filter( \'query_vars\', array ( $this, \'add_query_vars\' ), 0 );
add_action( \'parse_request\', array ( $this, \'sniff_requests\' ), 0 );
add_action( \'init\', array ( $this, \'add_endpoint\' ), 0 );
}
/**
* Add rewrite rules here.
*
* @param string $base Base of URL
* @param string $page Slug of page
*/
public function add_rule( $base, $page ) {
if ( ! array_key_exists( $base, static::$_hash_map ) ) {
static::$_hash_map[ $base ] = array ();
}
if ( ! array_key_exists( $page, static::$_hash_map[ $base ] ) ) {
static::$_hash_map[ $base ][ $page ] = \'name\';
}
}
/**
* Add our custom query arg to check in `parse_request`.
*
* @param $vars
*
* @return array
*/
public function add_query_vars( $vars ) {
$vars[] = static::ENDPOINT_QUERY_PARAM_REDIRECT;
return $vars;
}
/**
* Add rewrite rules.
*
* page --> base/page
*
* base/page === page
*
* Note:
*
* `flush_rewrite_rules()` is only added for testing.
*/
public function add_endpoint() {
foreach ( static::$_hash_map as $base => $pages ) {
foreach ( $pages as $pageName => $param ) {
// page --> service/page
add_rewrite_rule( "^$pageName/", \'index.php?\' . static::ENDPOINT_QUERY_PARAM_REDIRECT . "=/$base/$pageName/", \'top\' );
// service/page === page
add_rewrite_rule( "^$base/$pageName/", "index.php?$param=$pageName", \'top\' );
}
}
//////////////////////////////////
flush_rewrite_rules( true ); //// <---------- REMOVE THIS WHEN DONE TESTING
//////////////////////////////////
}
/**
* Redirect regular page to base/page,
*
* @param $wp_query
*/
public function sniff_requests( $wp_query ) {
global $wp;
if ( isset( $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ] ) ) {
// page --> service/page
$redirect = $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ];
$new_url = site_url( $redirect );
wp_redirect( $new_url, 301 );
die();
}
}
}
// Create the class
$basePageRewrite = new BasePageRewrite();
// Add individual rules
$basePageRewrite->add_rule( \'service\', \'page-title\' );
$basePageRewrite->add_rule( \'another-service\', \'another-page-title\' );
endif; // BasePageRewrite
SO网友:Michael Ecklund
我遇到了一个与你的期望非常相似的情况。
我们有一个父页面“我们的服务”(domain.com/services/
) ...
我们还有几个子页面,代表父页面“我们的服务”下提供的每个服务。例如:“Web设计”(domain.com/services/web-design/
)
现在,我们还有一个“投资组合”。我们没有在网站上为投资组合专门设置一个完整的顶级部分,而是决定将其放在主要的“服务”部分下面(domain.com/services/
).
例如,我们投资组合的主要部分将位于此处:domain.com/services/portfolio/
公文包是它自己的自定义帖子类型,包含各个公文包项目。
因此,特定公文包项目的URL如下所示:domain.com/services/portfolio/sample-portfolio-item/
.
注册自定义帖子类型时,有一个可配置的参数rewrite[\'slug\']
. 这是您要指定的位置$args[\'rewrite\'][\'slug\'] = \'services/portfolio\';
当然,无论何时更改URL重写规则,都需要刷新重写规则。以编程方式使用flush_rewrite_rules();
对于快速测试,您可以随时导航到Dashboard -> Settings -> Permalinks
因为这会自动为您刷新重写规则,只需访问该管理页面即可。
希望您(或某人)发现我的答案中的信息有用且相关。