通过 URL 重写和永久链接访问自定义 WordPress 块中的 URL 变量

问题描述 投票:0回答:1

前言:我知道这是一个非常常见的问题。我已经阅读了其中大约两打,并尝试了所有建议的解决方案,但就是无法让它在我的网站上工作。我的商店里没有其他 WordPress 开发人员,我需要更多地关注代码。

我正在编写一个自定义 WordPress 块,并且需要能够出于 SEO 原因重写 URL。具体来说,当浏览器点击如下 URL 时:

mydomain.edu/url-rewrite-tester-post/foovar

提供的内容应类似于 URL:

mydomain.edu/url-rewrite-tester-post?URLvar=foovar

更具体地说,考虑到重写不会遇到某些默认重定向规则来假设索引页,重写应该服务:

mydomain.edu/index.php?pagename=url-rewrite-tester-post&URLvar=foovar

重要提示:该网站的永久链接结构设置为“帖子名称”。我已经能够使用“普通”永久链接结构获得此类代码,但不能使用“帖子名称”永久链接结构。

这应该很简单吧?在我的自定义块的 PHP 文件中,我包含以下内容:

function custom_block_url_rewrite() {
    add_rewrite_rule('^url-rewrite-tester-post/([^/]+)/?$', 'index.php?pagename=url-rewrite-tester-post&URLvar=$matches[1]', 'top');
    add_rewrite_tag('%URLvar%','([^/]+)');
}
add_action('init', 'custom_block_url_rewrite');

我保存永久链接设置以刷新缓冲区,规则生效。然后我应该能够使用同一 PHP 文件中包含的以下脚本访问“URLvar”变量:

function url_rewrite_test_url_rewrite_test_block_init($request_url) {
    register_block_type( __DIR__ . '/build', array(

        'render_callback' => function ($attributes, $request_url) {
            
            $html_render_output = '';
            if (isset($_GET['URLvar'])) {
                $html_render_output .= 'You have fetched a URL variable using the GET method.<br>It is: ';
                $html_render_output .= $_GET['URLvar'] . '<br><br>';
            } else {
                $html_render_output .= 'Could not fetch a URL variable via the GET method.<br>';
            }

            if (get_query_var('URLvar') != '') {
                $URLvar = get_query_var('URLvar');
                $html_render_output .= 'You have fetched a URL variable using the get_query_var method.<br>It is: ';
                $html_render_output .= $URLvar . '<br><br>';
            } else {
                $html_render_output .= 'Unable to access a variable via the get_query_var method.<br>';
            }

            $html_render_output .= 'The URL at time of main function execution is: ' . $_SERVER['REQUEST_URI'] . '<br>';

            return "$html_render_output";
        }
    ));
}
add_action( 'init', 'url_rewrite_test_url_rewrite_test_block_init');

$_GET 方法不起作用,这是我根据我在网上阅读的内容所期望的。但是 get_query_vars 方法应该可以工作!

通过查看浏览器开发人员面板中的网络选项卡,我可以看到,一旦我尝试点击“http://mysite.local/url-rewrite-tester-post/foovar”之类的 URL,我就会收到 301重定向到“http://mysite.local/url-rewrite-tester-post/”。这似乎不对!代码应该重写,而不是重定向,对吗?

神秘的其他层:如果我在实施重写规则之前尝试点击 URL“http://mysite.local/url-rewrite-tester-post/foovar”,则该网站会返回 404 错误。

我尝试使用以下方法访问查询变量:

$wp_query->query_vars['URLvar']
但我收到一个 PHP 错误,指出 query_vars 没有键“URLvar”。

我尝试使用优先级参数并使用在“init”之前激活的各种挂钩(例如“muplugins_loaded”和“setup_theme”)来确保 URL 重写规则在主函数之前执行。这些都不能改变问题。

我正在使用“本地”[https://localwp.com/] 运行本地站点,所以我知道没有其他重写或重定向规则导致此问题。

到目前为止我还没有耗尽的唯一线索是 bcworks 在 add_rewrite_tag 文档页面 [https://developer.wordpress.org/reference/functions/add_rewrite_tag/] 上的评论。我不是 100% 清楚如何实施他的建议。这会是我的金子弹吗?

wordpress url-rewriting urlvariables
1个回答
0
投票

好吧,我破解了它。我在帖子中测试该块,而不是在页面上。 URL 重写仅适用于正确的页面,不适用于帖子或预览单个帖子的伪页面。布莱赫。为此浪费了很多时间。

© www.soinside.com 2019 - 2024. All rights reserved.