我尝试重写对index.php的所有请求,并根据正则表达式解析它,以从中创建sql语句和模板路径。因此,我开始设计类似永久链接类的东西,在其中我将定义一个结构以及一种机制来根据我的规则正确地解析“ Querystring”。
我创建了一些规则
public $rules = array(
'^\/([a-zA-Z0-9]+)(\/)?$' => array(
'rewrite' => 'item=0'
),
'^\/([a-zA-Z0-9]+)\/([a-zA-Z0-9]+)' => array(
'rewrite' => 'taxonomy=0&term=1'
),
'\/([0-9]{4})(\/)?' => array(
'rewrite' => 'year=0'
),
'([0-9]{4})\/([0-9]{2})(\/)?' => array(
'rewrite' => 'year=0&month=1'
),
'\/([0-9]{4})\/([0-9]{2})\/([0-9]{2})(\/)?' => array(
'rewrite' => 'year=0&month=1&day=2'
),
'\/(page-[0-9])+(\/)?$' => array(
'rewrite' => 'pagenum=0'
)
)
并尝试将其与查询字符串匹配
foreach ( $this->rules as $rule => $options ) {
if ( preg_match( '%' . $rule . '%', $_SERVER['REQUEST_URI'], $matches ) ) {
array_shift( $matches );
echo strtr( $options['rewrite'], $matches ) . '<br>';
}
}
我可以像识别他们一样
./taxonomy/term/year/month/day
array(
"taxonomy" => "taxonomy"
"term" => "term"
"year" => 2018
... and so on
)
... also those uri's
./taxonomy/term/year/month
./taxonomy/term/year
./taxonomy/term
但是在分页末尾匹配“ page-([0-9] +)”时,它不再起作用,因为uri“ ./ mytaxonomy / page-2”给了我
array(
"taxonomy" => "mytaxonomy"
"term" => "page" // <-- "page" wasnt the term!
"pagenum" => 2
)
然后我正在考虑设置某些变量(如果特定规则已匹配),并检查preg_match是否设置了所需的var。因此,我可以设置“ is_not_single”,当要检查分类法时,我可以看到是否设置了变量。但是我再次面临同样的逻辑问题。
之所以这样做,是因为为什么我不使用“ just parse_url,parse_str,..”和预定义的静态结构,所以我还希望能够像wordpress一样创建“自定义永久链接”(对不起,我喜欢wordpress),但是意识到,我的设计将无法正常工作,因为我不知道如何实现这种机制。
它应该能够像
那样在“时间到了之内”解析分类法((((taxonomy/term)/year)/month)/day)
,但还可以匹配可能定时存档中的自定义分类法,例如
((((customtaxonomy/term)/year)/month)/day)
所以我需要将找到的正则表达式与应用它的结构进行匹配。
我也考虑过类似的基本模式
%pagename% // single page
%taxonomy%/%term% // archive
%taxonomy%/%term%/%time% // timed archive
但
%time%
模式本身应该是我可以分组
的模式%year%%month%%day%
模式分为几个部分。他们唯一的关系应该是它们之间没有任何东西,我可以匹配“ pagenum规则”,因为它可以存在%time%模式而没有。当除了%time%之外,它将在%term%和%pagenum%之间,但是当%time%模式不匹配时,%term%紧接%pagenum% 但我无法使它与模式中的模式匹配并处理此信息以进一步尝试构建我的查询。
这不是我想的那么容易,还是我只是想念一些东西?我已经写了wordpress代码并尝试将其应用于我的需要,但我无法使其正常工作,甚至不了解其背后的机制。我对此感到非常沮丧和沮丧,希望今天能找到“任何东西”。
预先感谢