Regionalised Content

时间:2015-07-13 作者:Nathan Fitzgerald - Fitzgenius

好的,所以-我正在制作一个杂志风格的网站,需要“区域化”的内容。

例如,我有:

英国(包括所有)曼彻斯特(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.

我不知道如何解决这个问题:(

1 个回复
SO网友:gabrielperezs

我认为您可以为每个“区域”创建一个重写规则,以避免覆盖您可能需要的其他重要规则(如页面、类别等)。我在玩你的代码示例,在rewrite\\u resets中稍作更改即可:

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

    }

    $categories = get_terms( \'region\', array(
        \'orderby\'    => \'count\',
        \'hide_empty\' => 0,
    ));

    // Rewrite rule for each taxonomy
    foreach($categories as $_category) {
        add_rewrite_rule(\'^\'.$_category->slug.\'/([^/]+)?\', \'index.php?name=$matches[1]\', \'bottom\');
    }

}
如果你的分类法名称是“region”(我在玩分类法“category”的标准,结果是一样的),那么这就行了

通过这种方式,您可以创建一个名为“伦敦”的分类区域,就像您正在做的那样,同时创建一个具有相同slug(伦敦)的页面。只有当url以区域名称开头并且还有一个“路径”时,这种重写才有效。如果有树或其中一个不匹配,这就是为什么不打破其他重写规则。

只是一个想法,我希望这对你有所帮助:)

结束

相关推荐