ADD_REWRITE_RULE仅在刷新时有效

时间:2019-05-03 作者:JKL

我的函数中有以下代码。php文件。我有一页projects. 我有两种自定义帖子类型:projectprojecttype. 每个项目帖子都有自己的permalink/projects/project name。项目类型确实需要显示“项目”页面。

我的代码检查url是否是项目的子页面。如果子页面是projecttype,它将加载项目页面的模板(id 8)。

if(substr( $_SERVER[\'REQUEST_URI\'], 0, 11 ) === \'/projects/\'){
  $request_subpage = str_replace(\'/\', \'\', str_replace(\'/projects/\', \'\', $_SERVER[\'REQUEST_URI\']));
  if($request_subpage !== \'\') {
    $valid_subpage_url = false;
    $project_types = get_posts( array( \'post_type\' => \'projecttype\', \'posts_per_page\' => -1 ) );
    foreach( $project_types as $project_type ) :
      if( $project_type->post_name === $request_subpage ) :
        $valid_subpage_url = true;
        break;
      endif;
    endforeach;
    //flush_rewrite_rules();
    if($valid_subpage_url) add_rewrite_rule( "^projects\\/$request_subpage$", "index.php?page_id=8", \'top\');

  }
}
当我取消注释时flush_rewrite_rules(); 我的代码有效。当我不刷新重写规则时,它就不起作用(所有projecttype子页面都返回404)。由于冲洗是一项昂贵的操作,我可能不应该使用它。

这是怎么回事?

1 个回复
SO网友:nmr

规则出现问题,因为给定projecttype 在您访问相关URL时添加。

每次您访问projects/{projectstype}/ 地址和刷新重写规则,they are deleted and only one rule (仅适用于当前项目类型)已保存/创建。

您可以将代码添加到request 过滤器挂钩,则无需添加重写规则。由规则设置的所有查询变量(仅限您设置page_id), 您可以手动设置。

add_filter( \'request\' , \'se336968_request\' );
function se336968_request( $query_vars )
{
    if(substr( $_SERVER[\'REQUEST_URI\'], 0, 11 ) === \'/projects/\'){
        $request_subpage = str_replace(\'/\', \'\', str_replace(\'/projects/\', \'\', $_SERVER[\'REQUEST_URI\']));
        if($request_subpage !== \'\') {
            $project_types = get_posts( array( \'post_type\' => \'projecttype\', \'posts_per_page\' => -1 ) );
            foreach( $project_types as $project_type ) {
                if( $project_type->post_name === $request_subpage ) {

                          // your current rewrite 
                    $query_vars[\'page_id\'] = 8;
                    $query_vars[\'post_type\'] = \'page\';

                    //  --- to open "projecttype" type post from URL ---
                    // $query_vars[\'post_type\'] = \'projecttype\';
                    // $query_vars[\'projecttype\'] = $request_subpage;
                    // unset( $query_vars[\'page_id\'], $query_vars[\'p\'], $query_vars[\'pagename\'], $query_vars[\'name\'] );

                    break;
                }
            }
        }
    }
    return $query_vars;
}

相关推荐