好的,所以-我正在制作一个杂志风格的网站,需要“区域化”的内容。
例如,我有:
英国(包括所有)曼彻斯特(Brighton)伦敦(Brighton)我已经成功地实现了此功能,为某些内容(主要是帖子)添加了自定义分类法。
然后用pre_get_posts
过滤器,为您提供如下想法:
protected function regionalize() {
add_filter( \'pre_get_posts\', array( $this, \'pre_posts\' ) );
}
function pre_posts( $query ) {
if (
$query->is_main_query()
&& ! is_admin()
|| ( is_archive() || is_search() || is_front_page() || is_home() || is_tax() )
) {
if(in_array ( $query->get(\'post_type\'), $this->ENABLED_POST_TYPES )) {
$query->set( \'tax_query\', array( $this->getRegionTaxQuery() ) );
}
}
return $query;
}
现在,正如我再次指出的,这一切都像预期的那样完美地工作。我现在需要做的是创建一些自定义重写规则-我在这方面没有太多经验,因此我正在寻求外部帮助:)
我需要能够前缀的所有URL是由区域覆盖。
例如:
www.mywebsite。com/london/post name www.mywebsite。com/manchester/post name等。。。
我正在使用Yoast提供的WP SEO,因此仍然希望设置规范的URL&;可到达的
区域化不适用于页面,仅适用于“帖子”&;“事件”。
我做了一点尝试,得到了其中的四分之一:
public function rewrite() {
global $wp_rewrite;
$wp_rewrite->page_structure = $wp_rewrite->root .sanitize_title($this->getCurrentRegion()).\'/%pagename%\';
$wp_rewrite->flush_rules();
}
有什么想法吗?希望这足够清楚!
UPDATE:
通过以下几点,我成功地实现了90%的目标:
“重置”我要使用区域化的帖子类型:
public function rewrite_resets() {
global $wp_rewrite;
foreach($this->ENABLED_POST_TYPES as $post_type) {
$args = get_post_type_object($post_type);
switch($post_type) {
case \'post\':
$slug = \'/%region%/%postname%\';
break;
case \'event\':
$slug = \'/%region%/events\';
break;
}
$args->rewrite["slug"] = $slug;
$args->rewrite["with_front"] = 0;
register_post_type($args->name, $args);
}
// Fixes pages but breaks posts :(
add_rewrite_rule(\'^([^/]*)?\', \'index.php?pagename=$matches[1]\', \'bottom\');
}
这是连接到
init
然后我控制永久链接(&A);具有以下功能的模板:
public function post_permalink_structure($post_link, $id = 0, $leavename = FALSE) {
if ( strpos(\'%region%\', $post_link) === \'FALSE\' ) {
return $post_link;
}
$post = get_post($id);
if ( !is_object($post) || !in_array($post->post_type, $this->ENABLED_POST_TYPES )) {
return $post_link;
}
$terms = wp_get_object_terms($post->ID, \'region\');
if(!$terms) $terms[0]->slug = sanitize_title(self::DEFAULT_REGION);
return str_replace(\'%region%\', $terms[0]->slug, $post_link);
}
public function intercept_template() {
global $wp_query, $post;
if( array_key_exists( \'region\', $wp_query->query_vars ) ) {
if(
!has_term(get_query_var(\'region\'), \'region\', $post->ID) &&
is_single() && in_array($post->post_type, $this->ENABLED_POST_TYPES)
) {
$wp_query->set_404();
status_header( 404 );
nocache_headers();
include TEMPLATEPATH . "/404.php";
exit;
}
}
}
现在还有另一个问题(可能还有其他重写中隐藏的潜在问题,我目前还没有意识到!)
当尝试查看页面时,我现在收到一个404错误,因为这与我在重置帖子类型时设置的新规则相冲突。
我之所以知道这一点,是因为我在404模板中添加了一些代码,该模板在“关于我们”页面中显示了以下内容:
Request: about
Matched Rewrite Rule: ([^/]+)/?$
Matched Rewrite Query: region=about
Loaded Template: 404.php
很清楚这里发生了什么,它正在检测
region
而不是
pagename
.
我不知道如何解决这个问题:(