在刷新规则之前,如果当前和现有的相同,如何检查wp_Options的重写_规则?

时间:2021-08-13 作者:princeexpedition

我在自定义插件中发现了一个主要错误,我们只需添加新规则,并在每次页面加载时刷新现有的重写规则(“add\\u action(\'wp\\u loaded\',\'flush\\u rules\')”),这似乎不是一个好的做法。我很好奇,在调用flush\\u rules()方法之前,是否有任何方法可以检查现有的rewrite\\u规则(已存储在DB中)与最新的rewrite\\u规则之间的差异?大多数情况下,现有和最新的rewrite\\u规则是相同的。

谢谢

2 个回复
最合适的回答,由SO网友:Pat J 整理而成

以下是我一直在使用的技巧:

使用数组存储重写,对数组进行哈希运算,将哈希数组存储为选项,检查存储的选项是否与当前重写哈希匹配;如果不是,请更新“重写”代码段(这是一个起点,而不是成品):

add_action( \'init\', \'wpse_393260_rewrites\' );
function wpse_393260_rewrites() {
    // Array of rewrites.
    $my_rewrites = array(
        \'foo/([a-z0-9-]+)[/]?$\' => \'index.php?foo=$matches[1]\',
        \'bar/([a-z0-9-]+)[/]?$\' => \'index.php?bar=$matches[1]\',
        // etc.
    );
    // Implements the rewrite rules.
    foreach ( $my_rewrites as $regex => $query ) {
        add_rewrite_rule( $regex, $query, \'top\' );
    }
    // Hashes the $my_rewrites array.
    $hashed_rewrites = md5( serialize( $my_rewrites ) );
    // Gets the currently-active rewrites from the option.
    $my_current_rewrites = get_option( \'my_rewrites_option\' );
    // If anything\'s changed, flush the rewrites and update the option.
    if ( $my_current_rewrites !== $hashed_rewrites ) {
        flush_rewrite_rules();
        update_option( \'my_rewrites_option\', $hashed_rewrites );
    }
}

SO网友:JCV

您只能在提交表单时添加刷新重写:

if ( (isset($_POST[\'update_myform\'])) && check_admin_referer(\'check_form\', \'check_form\') ) { 

    flush_rewrite_rules(false);
}
“false”确保rules are only updated, 没有完全重写。

您甚至可以在if中进一步添加条件规则,例如确保已提交特定字段(从而减少触发刷新的次数)。