真正的正则表达式来捕获wordpress子页面永久链接


True regex to catch wordpress subpage permalinks

我有wordpress正则表达式'(get/(.*)?)',它非常适合以下地址。

http://localhost/akasia/get/gulets/for/sale/

我的问题是此代码与以下网址不匹配

http://localhost/akasia/var/var/get/gulets/for/sale/
http://localhost/akasia/var/get/gulets/for/sale/var/
http://localhost/akasia/var/var/get/gulets/for/sale/var/var
http://localhost/akasia/n..0/var/var/get/gulets/for/sale/var/var/n..0

正则表达式好友匹配它,但 wordpress 正则表达式不匹配。

'。(get/(.)?)', '(.?.+?)(得到/(.)?并且各种正则表达式不起作用。

我不明白为什么它不起作用。

注意:使用 $matches[] 检索匹配 URL 的值时,捕获组数据从 1 开始,而不是 0。

这是我的代码。

add_filter('rewrite_rules_array', 'create_rewrite_rule');
function create_rewrite_rule($rules){
    $newrules = array(
        '(get/(.*)?)' => 'index.php?&get=$matches[1]',
        //'for/([^/]+)?' => 'index.php?for=$matches[1]',
    );
    return $newrules + $rules;
}
function get_rewrite_rules(){
    // return get_option('rewrite_rules');
    global $wp_rewrite; 
    return $wp_rewrite->rewrite_rules();
}
add_filter('query_vars', 'create_query_vars');
function create_query_vars($vars){
    $vars[] = 'get';
    $vars[] = 'for';
    return $vars;
}
function get_flush_rewrite_rules() {
    $rules = $GLOBALS['wp_rewrite']->wp_rewrite_rules();
    if (!isset($rules['(get/(.*)?)'])){ // must be the same rule as in create_rewrite_rule($wp_rewrite)
        press('Regex kurallari guncellendi. Bu normal degil. Admin''i haberdar edin.');
        flush_rewrite_rules();
    }
}
add_filter('init', 'get_flush_rewrite_rules');

更新 几天+小时后,我发现正则表达式好友是真的。 以下过滤器不起作用。

add_filter('rewrite_rules_array', 'create_rewrite_rule');
function create_rewrite_rule($rules){
    $newrules = array(
        '(get/(.*)?)' => 'index.php?get=$matches[1]',
    );
    return $newrules + $rules;
}

取而代之的是你应该使用

function create_rewrite_rule() {
    add_rewrite_rule('(.*(get/(.*)?))', 'index.php?get=$matches[1]', 'top');
}
add_action('init', 'create_rewrite_rule', 10, 0);

你的代码应该是这样的。

function create_rewrite_rule() {
    add_rewrite_rule('(.*(get/(.*)?))', 'index.php?get=$matches[1]', 'top');
}
add_action('init', 'create_rewrite_rule', 10, 0);
function get_rewrite_rules(){
    // return get_option('rewrite_rules');
    global $wp_rewrite; 
    return $wp_rewrite->rewrite_rules();
}
add_filter('query_vars', 'create_query_vars');
function create_query_vars($vars){
    $vars[] = 'get';
    $vars[] = 'for';
    return $vars;
}
function get_flush_rewrite_rules() {
    $rules = $GLOBALS['wp_rewrite']->wp_rewrite_rules();
    if (!isset($rules['--(get/(.*)?)'])){ // must be the same rule as in create_rewrite_rule($wp_rewrite)
        flush_rewrite_rules();
    }
}
add_filter('init', 'get_flush_rewrite_rules');

希望能帮助一些人。

注意:get_flush_rewrite_rules可能不是必需的。我会检查一下。一些测试向我表明add_rewrite_rule正在这样做。如果我没有忘记,我会做更多的测试并写信给这里。

更新 几天+小时后,我发现正则表达式好友是真的。 以下过滤器不起作用。

add_filter('rewrite_rules_array', 'create_rewrite_rule');
function create_rewrite_rule($rules){
    $newrules = array(
        '(get/(.*)?)' => 'index.php?get=$matches[1]',
    );
    return $newrules + $rules;
}

取而代之的是你应该使用

function create_rewrite_rule() {
    add_rewrite_rule('(.*(get/(.*)?))', 'index.php?get=$matches[1]', 'top');
}
add_action('init', 'create_rewrite_rule', 10, 0);

你的代码应该是这样的。

function create_rewrite_rule() {
    add_rewrite_rule('(.*(get/(.*)?))', 'index.php?get=$matches[1]', 'top');
}
add_action('init', 'create_rewrite_rule', 10, 0);
function get_rewrite_rules(){
    // return get_option('rewrite_rules');
    global $wp_rewrite; 
    return $wp_rewrite->rewrite_rules();
}
add_filter('query_vars', 'create_query_vars');
function create_query_vars($vars){
    $vars[] = 'get';
    $vars[] = 'for';
    return $vars;
}
function get_flush_rewrite_rules() {
    $rules = $GLOBALS['wp_rewrite']->wp_rewrite_rules();
    if (!isset($rules['--(get/(.*)?)'])){ // must be the same rule as in create_rewrite_rule($wp_rewrite)
        flush_rewrite_rules();
    }
}
add_filter('init', 'get_flush_rewrite_rules');

希望能帮助一些人。

注意:get_flush_rewrite_rules可能不是必需的。我会检查一下。一些测试向我表明add_rewrite_rule正在这样做。如果我没有忘记,我会做更多的测试并写信给这里。