重写端点和CPT-如何在插件中使用

时间:2014-06-30 作者:nimmolo

我正在为一个使用URL端点的插件编写重写规则,/modifier, 创建query_var &modifier=1 表示它应该做些别的事情。

重写处理URL,其中/modifier 附加到帖子、页面或自定义帖子类型的URL末尾。

看起来像是adding a rewrite endpoint 很理想,但根据Wordpressrewrite endpoints API 传入的URL需要以值结尾,如/modifier/1 为了自动重写为&modifier=1 通过端点API。如果端点后没有值,则解析为&modifier= 在检查isset.

所以我还得走很长的路,viagenerate_rewrite_rules. 对帖子和页面的重写很好——我可以把它包括在内,但可能并不相关。

在顶部添加的自定义帖子类型的重写在帖子类型显式硬编码时也可以工作。

add_filter(\'generate_rewrite_rules\', \'my_rewrite\');
function my_rewrite($wp_rewrite) {
    // rewrite rules for custom post type "specific-type"
    $cpt_rules = array(
        \'specific-type-slug/([^/]+)/modifier\' => \'index.php?specific-type=\'. $wp_rewrite->preg_index(1) .\'&modifier=1\'
    );
    $wp_rewrite->rules = $cpt_rules + $wp_rewrite->rules;
}
问题是对所有自定义帖子类型进行循环。get_post_types() 仅在init. 此重写正在筛选generate_rewrite_rules, 前面的几个步骤。

这是我试过的循环。这显然不起作用,帖子类型尚未设置。

add_filter(\'generate_rewrite_rules\', \'my_rewrite\');
function my_rewrite($wp_rewrite) {
  global $wp_post_types;
  $types = get_post_types( array( \'_builtin\' => false ) );
  // get the registered data about each post type with get_post_type_object
  foreach( $types as $type ) {
    $cpt_rules = \'\';
    $typeobj = get_post_type_object( $type );

    if( isset( $typeobj->rewrite->slug ) ) {
        $slug = $typeobj->rewrite->slug;
        $cpt_rules = array(
            $slug.\'/([^/]+)/modifier\' => \'index.php?\'.$type.\'=\'. $wp_rewrite->preg_index(1) .\'&modifier=1\'
        );
        $wp_rewrite->rules = $cpt_rules + $wp_rewrite->rules;
    }
  }
}
有人告诉我,使用插件类可能是解决这个问题的方法,但我不知道如何解决。

1 个回复
SO网友:nimmolo

抱歉,如果这看起来太明显而无法回答,我只是想看看wordpress中的htaccess重写

通过这样的URL解析修饰符最优雅的方法似乎是添加重写端点,如果不想传递值,只需稍后在URL中检查它。

美妙的是,只要您只检查这个端点,就不需要任何其他重写规则。

add_action( \'init\', \'wp_modifier_endpoint\' );
function wp_modifier_endpoint() {
    add_rewrite_endpoint( \'modifier\', EP_PERMALINK | EP_PAGES );
}
在函数中,创建/modifier 链接后,也无需添加值/modifier/value 或者,除非您需要一个值。我之前的技术检查了端点(作为query\\u var)是否已设置,但您可以使用php在URL中检查端点字符串strrpos 作用

$url = \'http://\' . $_SERVER[\'SERVER_NAME\'] . $_SERVER[\'REQUEST_URI\'];
$endpoint = substr( $url, 9 ); /* number of chars in string "/modifier" */
if( false !== strpos( $endpoint, \'/modifier\' ) ) {
    /* do something; */
}
Update: per Milo\'s comment below, it is preferable to check if modifier is an array_key of query_vars - 如果您想检查多个键,这看起来更简单,也更容易扩展。

global $wp_query;
if( array_key_exists( \'modifier\' , $wp_query->query_vars ) ) {
    /* do your thing; */
}

结束

相关推荐