Dynamic Endpoints

时间:2015-07-08 作者:Howdy_McGee

我在WordPress外部有一个数据库表,需要为其创建端点。我已经创建了一个页面/cars/ 我计划使用页面模板生成链接。我希望url看起来像/cars/camaro/ ()/cars/%model%/ ). 起初,我认为我可以使用端点,但不知道如何根据从模型表中提取的段塞使它们动态。我也不确定使用Permalink结构标签是更容易还是更好。

我甚至不完全确定从哪里开始,我以前创建过“静态”端点,所以我有一个基础可以跳出,但当我到达request 我不知道该怎么办。

/**
 * Add endpoint to handle models
 */
function theme_endpoints() {
    add_rewrite_endpoint( \'cars\', \'EP_PAGES\' );     // Since cars is our base
}
add_action( \'init\', \'theme_endpoints\' );

/**
 * Filter request variables
 * @param array $vars
 * @return array $vars
 */
function theme_perma_requests( $vars ) {

    if( isset( $vars[\'model\'] ) ) {
        $vars[\'model_template\'] = true;
    }

    return $vars;
}
add_filter( \'request\', \'theme_perma_requests\' );
我的意思是,这允许我在模板中包含(这就是为什么我添加了model_template 变量),但它实际上不会重写URL。然后我开始玩add_rewrite_rule()

/**
 * Theme rewrite rules
 */
function theme_rewrite_rules() {
    add_rewrite_rule( \'^cars/([^/]*)/?$\', \'index.php?page_id=8&model=$matches[0]\', \'top\' );
}
add_action( \'init\', \'theme_rewrite_rules\' );
我已经刷新了永久链接,但重写似乎没有生效,我只能假设规则的编写方式有问题。

我需要端点和重写规则,还是只需要其中一个?我是不是做错了?如何实现的permalink结构/cars/camaro/?

1 个回复
最合适的回答,由SO网友:jonathanbardo 整理而成

10up工程最佳实践是如何实现这一目标的一个很好的例子。基本上,您可以添加一个新的重写标记和一个新的重写规则,然后使用template\\u redirect操作返回自定义操作。

代码如下:

add_action( \'init\', function() {
  add_rewrite_tag( \'%model%\', \'([^/]+)\' );
  add_rewrite_rule( \'cars/([^/]+)/?\', \'index.php?model=$matches[1]\', \'top\' );
} );

add_action( \'template_redirect\', function() {
  global $wp_query;

  $model = $wp_query->get( \'model\' );

  if ( ! empty( $model ) ) {
    // Return stuff here
  }
} );
在尝试新端点之前,不要忘记刷新永久链接!使用wp cli:

wp rewrite flush
或使用管理UI:http://example.local/wp-admin/options-permalink.php 然后单击保存。

结束

相关推荐