真正的正则表达式来捕捉 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

Regex buddy 匹配,但是wordpress regex 不匹配。

'.(get/(.)?)', '(.?.+?)(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 正在这样做。如果我没有忘记,我会做更多的测试并写到这里。