【问题标题】:Hide get parameters names from the URL从 URL 中隐藏获取参数名称
【发布时间】:2019-02-21 10:13:07
【问题描述】:

我知道这可以使用重写引擎来完成,但我无法做到这一点 这是我的 .htaccess 文件

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

我有这个网址 www.mysite.com/report?page=my-report-name

现在我想要实现的是:www.mysite.com/report/my-report-name

我访问这个获取变量名称页面的文件是reports.php,它不在我的根目录中 我的文件的路径是:root/themes/fount/intel/reports.php

谁能帮忙?

【问题讨论】:

    标签: php wordpress mod-rewrite url-rewriting custom-pages


    【解决方案1】:

    试试这个代码,

    <IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine on
    RewriteBase /
    
    # /anything/anything -> anything.php?url=anything
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([A-Za-z0-9_])/([^/]*)$ /$1.php?url=$2 [L]
    
    </IfModule>

    如果 page.php 文件名总是相同,那么就这样做:

    <IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine on
    RewriteBase /
    
    # /page/anything -> page.php?url=anything
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^page/([^/]*)$ /page.php?url=$1 [L]
    
    </IfModule>

    谢谢!

    【讨论】:

    • 我应该用我的 .htaccess 文件替换你的代码 sn-p 吗?
    • 是的...一旦您可以备份并替换 .htaccess 文件中的代码。
    • "RewriteRule . /index.php [L]" 如果我​​从 .htaccess 文件中删除此行,我的网站将无法正常工作
    • 但是您要从 .htaccess 文件中删除该行?
    • 我已经在我的答案中发布了我的解决方案,最终对我有用,谢谢
    【解决方案2】:

    更新答案

    要添加指向外部处理程序 PHP 文件的路由,应使用以下 sn-p:

    function wprre_add_rewrite_rules() {
        global $wp_rewrite;
    
        // pattern with regexps
      $wp_rewrite->add_external_rule( '^wp_report/([\w\d-]+)/?', PATH_TO_THE_EXTERNAL_HANDLER.'report.php?report_name=$1' );
    }
    add_action('init', 'wprre_add_rewrite_rules');
    

    您可以发现 add_external_rule() 和 add_rewrite_rule 之间参数处理的一个区别。您必须使用匹配选择器,因为 Apache 在这种情况下使用它。

    这个 sn-p 必须放在一个文件中,该文件总是由你的插件或主题加载。如果您编写插件,它可以是主插件文件。在主题开发的情况下,它可以是主要的functions.php文件。

    自定义 GET 参数注册正在正常工作,正如原始答案中提到的那样。

    重要

    通过代码(外部或内部两者)编辑重写规则后,您必须转到管理面板中的永久链接设置页面,然后单击保存按钮而不进行任何更改。这是必要的,因为这将刷新重写规则,而 WP 会将规则写入 .htaccess 文件。

    这就是为什么我建议你挂钩插件激活事件并注册重写规则然后立即运行 flush_rewrite_rules() 命令的原因。

    注意事项

    原始答案的问题在于,add_rewrite_rule() 函数仅在您路由到默认基本 index.php 时才有效。只能修改参数,不能路由到外部文件。

    原答案

    我认为您应该使用 WordPress API 来实现这一点。您需要使用以下语法在主题或插件中添加重写规则和标签:

    !!免责声明这仅适用于路由到基本 index.php !!

    对于路由,添加一个指向您的 PHP 文件的重写规则。

    function custom_rewrite_basic() {
      add_rewrite_rule('^report/([\w-]+)/?', 'index.php?page=$matches[1]', 'top');
    }
    add_action('init', 'custom_rewrite_basic');
    

    如果要使用标准 WP 参数列表中没有的查询参数,则需要添加该自定义参数名称。

    function custom_rewrite_tag() {
      add_rewrite_tag('%page%', '([^&]+)');
    }
    add_action('init', 'custom_rewrite_tag', 10, 0);
    

    如果您不用作 WP API,请注意使用内置参数。

    在这篇 Codex 文章中,您可以找到有关该主题的更多详细信息: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

    为了进行故障排除和更深入的了解,您也可以查看这篇 Codex 文章,该文章描述了正确的重写规则用法。因为在某些情况下您需要重置重写规则(插件激活/停用)。 https://codex.wordpress.org/Function_Reference/flush_rewrite_rules

    【讨论】:

    • 我应该在哪里使用这些功能?我可以在我的任何课程中使用这些吗?或者我应该在我的 report.php 文件中使用它?
    • 这应该去你的插件文件,或者如果你开发一个主题然后去functions.php文件。
    • 我已在我的 functions.php 文件中添加了它,但它不起作用。请注意,这是我在 wordpress 模板中的自定义页面,文件名是 reports.php,我得到 $_GET['page'] 变量的文件是 review-details.php 文件
    • function custom_rewrite_basic() { add_rewrite_rule('^report/([\w-]+)/?', 'reports.php?page=$matches[1]', 'top'); } add_action('init', 'custom_rewrite_basic');我已经在functions.php所在的同一目录中添加了这个函数reports.php是我的模板文件名
    • 我修改了我的答案。 add_rewrite_rule() 函数我错了,因为它不能用于路由外部路径。但是更新部分中的 sn-p 将起作用。你可以在这里找到一个演示插件,我写给你的:github.com/pappk/WordpressDemos/tree/master/plugins/… 重要提示:每次重写规则修改后,转到永久链接设置页面并单击保存按钮以刷新修改。祝你好运!
    【解决方案3】:

    最后这个解决方案对我有用 我已将其添加到我的主题文件夹中的 functions.php 文件中

        function rewrite_photo_url(){
    add_rewrite_rule('^report/([^/]*)/?','index.php?page_id=2671&value=$matches[1]','top');
    }
    function register_custom_query_vars($query_vars){
        $query_vars[] = 'value';
        return $query_vars;
    }
    
    
    add_action('init','rewrite_photo_url');
    add_filter('query_vars','register_custom_query_vars');
    

    然后在我的 php 文件中,我使用 get_query_var('vale') 来获取我的参数值

    【讨论】:

    • 老实说,我不建议您在代码中硬编码 ID,因为如果不修改代码,您无法将代码部署到不同的站点。
    • 但我不需要在不同的站点上部署此代码。我在我的站点上仅将其用于一页。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多