rewrite rules and querystring

时间:2012-04-10 作者:Jacksonkr

当我转到url时mysite.com/photos/120 我想得到120 出来

在PHP中,我希望能够像url一样获取这些“参数”mysite.com?page=photos&id=120 甚至只是mysite.com/photos?id=120

我可以利用rewrite rules? 或者我需要做什么regex 在php中获得我想要的?

****编辑1****

就我个人而言,我无法让这项工作发挥作用。根据这里给出的答案,我得到了如下结论:

add_action( \'init\', \'rewrite_photo_url\' );
function rewrite_photo_url() {
    add_rewrite_rule( \'^photos/([^/]*)/?\',\'index.php?page=photos&photo_id=$matches[1]\', \'top\' );
}

add_rewrite_tag(\'%id%\',\'([0-9]+)\');

print(get_query_var(\'photo_id\'));
我怀疑我在什么地方遗漏了一个概念?

****编辑2****

我开始意识到这可能需要在函数中实现。php所以我现在有:

function rewrite_photo_url() {
    add_rewrite_rule( \'^photos/([^/]*)/?\',\'index.php?page=photos&photo_id=$matches[1]\', \'top\' );
}
function register_custom_query_vars( $vars ) {
    array_push( $vars, \'photo_id\' );
    return $vars;
}

add_action( \'init\', \'rewrite_photo_url\');
add_filter( \'query_vars\', \'register_custom_query_vars\', 1 );
现在我只需要知道如何在页面模板中获取所需的var。我试过了

print(get_query_var(\'photo_id\'));
但这并没有奏效。

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

经过几天的研究,答案很简单:

$wp_query->query_vars[\'page\']
把它包起来intval 还有维奥拉。

SO网友:Rachel Carden

您可以添加自己的重写规则,该规则将允许您通过URL参数调整查询:

add_action( \'init\', \'rewrite_photo_url\' );
function rewrite_photo_url() {
    add_rewrite_rule( \'photos/([^/]+)/?$\',\'index.php?page=photos&photo_id=$matches[1]\', \'top\' );
}
如果需要使用自定义变量,即“photo\\u id”,则必须注册该变量,以便查询能够识别该变量:

add_filter( \'query_vars\', \'register_custom_query_vars\', 1 );
function register_custom_query_vars( $vars ) {
    array_push( $vars, \'photo_id\' );
    return $vars;
}

SO网友:Stephen Harris

您可以使用add_rewrite_tag 要注册自定义查询变量(“id”),请执行以下操作:

add_rewrite_tag(\'%id%\',\'([0-9]+)\');
(regex告诉它只接受数字)。然后,要创建重写规则,可以使用add_rewrite_rule

(这两个都应连接到init).

add_rewrite_rule(\'^photos/([0-9]+)/?\',\'index.php?p=1234&id=$matches[1]\',\'top\');
其中1234是“照片”页面的ID。添加这些规则后,需要刷新一次重写规则(转到永久链接设置页面)。然后作为@DanielBachhuber 说,你可以用掉get_query_var( \'id\' ) 获取ID。

Note, 而regex在add_rewrite_tag 意味着这将只接受数字-您可能仍应使用intval (在任何情况下,它都可以是数字的字符串表示)。

SO网友:Daniel Bachhuber

根据规则的生成方式,您可以使用get_query_var() 函数获取“photo”查询变量的值。如果操作正确,“photo”应该是可用的查询变量。当然,您需要使用intval()或类似的工具清理该值。

SO网友:Tsegereda Mulugeta

嗨,伙计们,这对我来说很有用:

    $pagination_args = array(
    \'base\'            => user_trailingslashit( trailingslashit( remove_query_arg( \'s\', strtok(get_pagenum_link( 1 ), \'?\') ) ) . \'page/%#%/\'.rtrim(str_replace(\'%2F\',\'\',substr(get_pagenum_link( 1 ),strlen(strtok(get_pagenum_link( 1 ), \'?\')))),\'/\'), \'paged\' ),
    \'format\'          => \'page/%#%\',
    \'total\'           => $numpages,
    \'current\'         => $paged,
    \'show_all\'        => False,
    \'end_size\'        => 1,
    \'mid_size\'        => $pagerange,
    \'prev_next\'       => True,
    \'prev_text\'       => __(\'«\'),
    \'next_text\'       => __(\'»\'),
    \'type\'            => \'plain\',
    \'add_args\'        => false,
    \'add_fragment\'    => \'\'
);
基本值是真正起作用的魔法。无需对基值进行任何更改。通过阅读这篇帖子,我找到了正确的方向:https://wordpress.org/support/topic/plugin-simple-pagination-page2-and-_get-parameters

结束

相关推荐

GET_SHORTCODE_regex()只与第一个短码匹配

法典中有an example 使用get\\u shortcode\\u regex()检查是否在给定页面上调用了短代码:$pattern = get_shortcode_regex(); preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches); if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') { /