刷新init或rest_api_init上的重写规则?

时间:2018-09-24 作者:Michael Ecklund

如果我使用REST API在插件中创建端点,我应该刷新重写规则吗init 或在中rest_api_init?

我意识到这应该在插件激活/停用时完成。然而,一旦这些even中的任何一个被触发,您是否仍然需要尊重传统的挂钩过程,以确保重写规则在修改后被刷新?答/答-在添加剩余路线之后。

Example:

function activate() {

    // do something when this plugin is activated...

    add_action( \'init\', function () {

        flush_rewrite_rules( true );
    }, 9999 );

    return true;

}

# Plugin Activation
register_activation_hook( __FILE__, function () {

    require_once( PATH . \'/backend/inc/activation.php\' );
    Backend\\activate();

} );

init

add_action( \'init\', function () {

    flush_rewrite_rules( true );
}, 9999 );

rest_api_init

add_action( \'rest_api_init\', function () {

    flush_rewrite_rules( true );
}, 9999 );

1 个回复
SO网友:Johansson

按照codex的规定,刷新重写规则不应按常规进行:

不要在任何常规触发的挂钩上执行此操作。

您应该通过插件激活挂钩或主题切换挂钩来实现:

add_action( \'after_switch_theme\', \'wpse315001_flush_rewrite_rules\' );

register_deactivation_hook( __FILE__, \'wpse315001_flush_rewrite_rules\' );
register_activation_hook( __FILE__, \'wpse315001_flush_rewrite_rules\' );
function wpse315001_flush_rewrite_rules() {
    flush_rewrite_rules();
}
以上任何一项,都应该在注册自定义帖子类型后完成。

此外,您应该在停用插件后刷新重写规则。这确保没有留下任何无效规则。

然而,与其他所有问题一样,这也有一个棘手的解决方法。如果重写规则包含半唯一关键字,则可以从选项中获取重写规则,对其进行搜索,并仅在必要时刷新规则:

add_action( \'init\', \'wpse315001_flush_rewrite_rules\', 99999 );
function wpse315001_flush_rewrite_rules(){

    // Get the rewrite rules
    $rules = get_option(\'rewrite_rules\');

    // Check if your semi-unique rule exists in this string
    if ( ! strpos( $rules, \'your-rewrite-rules\' ) ) {
        // Flush\'em All!
        flush_rewrite_rules();
    }
}
也许不是最好的解决方案,但也可以。

结束

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x