为可能包含未知父页面的页面重写

时间:2014-07-05 作者:David Labbe

我正在尝试为我的插件添加一个可湿性粉剂重写,允许用户在页面上包含一个短代码,然后显示日历。然后,此日历需要url参数才能导航日期。所有这些都很好,没有问题。。。现在,如果用户在具有父页面或多个页面的页面上包含短代码,它就可以正常工作。因此,另一个词是,如果带有快捷码的页面被称为“班级日历”,并且用户将其作为名为“瑜伽”的父页面的子页面,那么url可能看起来像mysite。com/yoga/class-calendar/如果你浏览日程安排,那么它看起来就像mysite。com/yoga/class calendar/2014年7月4日。我有它的工作很好,如果它像我的网站。com/class calendar/2014年7月4日,但我需要能够使其适用于未知的父页面。我可以让它像下面的代码示例一样工作$newrules=array();

        $newrules[\'([^/]*)/([^/]*)/\' . $this->schedule_page_slug . \'/([^/]*)/([^/]*)/([^/]*)/?$\'] = \'index.php?pagename=$matches[1]/$matches[2]/\' . $this->schedule_page_slug . \'&month=$matches[3]&days=$matches[4]&years=$matches[5]\';

        $newrules[\'([^/]*)/\' . $this->schedule_page_slug . \'/([^/]*)/([^/]*)/([^/]*)/?$\'] = \'index.php?pagename=$matches[1]/\' . $this->schedule_page_slug . \'&month=$matches[2]&days=$matches[3]&years=$matches[4]\';

        $newrules[$this->schedule_page_slug . \'/([^/]*)/([^/]*)/([^/]*)/?$\'] = \'index.php?pagename=\' . $this->schedule_page_slug . \'&month=$matches[1]&days=$matches[2]&years=$matches[3]\';

        return $newrules + $rules;
然而,即使这样做有效,我知道这是不对的,它只处理短代码为2页深的页面(并不是说它真的应该更深入,但我知道我是怎么做的,这是不对的)

如果能帮我找到正确的方向,我将不胜感激。我一直想和一个外卡家长捣乱,但都没能奏效。谢谢

2 个回复
SO网友:Thyamarkos

您可以使用该模式(([^/]*)/)? 匹配完整的<component>/ 构造-这将在$matches数组中创建多维元素,第一级包含完整表达式,内部匹配包含<component> 没有“/”字符。但是,在处理结果时需要非常小心,因为它可能会显示一些意外的行为,因为您基本上是在尝试将两个组件“合并”到一个匹配的元素中-例如,如果整个元素不存在(两个组件),则所有后续匹配将在$matches数组中移动一个位置。

有关如何创建$matches数组的更多参考资料,请学习PHP的preg_match_all 方法,还有一些好的tutorials 在…上regular expressions 找出这些重写规则是如何构建的。

SO网友:Milo

另一种解决方法是添加rewrite endpoint, 它可以在任何页面深度和/或帖子类型的任何位置工作。唯一的缺点是,您必须使用php解析出单个enpoint查询变量中的日期,而不是为您设置单个查询变量,但这应该是一个足够简单的任务,可以通过使用php的explode.

function wpd_calendar_endpoint(){
    add_rewrite_endpoint( $this->schedule_page_slug, EP_PERMALINK | EP_PAGES );
}
add_action(\'init\', \'wpd_calendar_endpoint\');

结束

相关推荐