WordPress自定义区块中结合URL重写与固定链接获取URL变量问题
解决方案
问题根源
当固定链接设置为「文章名称」时,WordPress会自动尝试匹配URL后缀为子页面或内容slug,触发Canonical重定向,将/url-rewrite-tester-post/foovar跳转到不带参数的主页面,导致自定义重写规则失效。
具体修复步骤
1. 调整重写规则与标签的注册顺序
WordPress需要先识别重写标签,才能在规则中正确解析变量。将add_rewrite_tag移到add_rewrite_rule之前:
function custom_block_url_rewrite() { // 先注册重写标签 add_rewrite_tag('%URLvar%','([^/]+)'); // 再添加重写规则,设为top优先级确保优先匹配 add_rewrite_rule('^url-rewrite-tester-post/([^/]+)/?$', 'index.php?pagename=url-rewrite-tester-post&URLvar=$matches[1]', 'top'); } add_action('init', 'custom_block_url_rewrite');
2. 阻止Canonical自动重定向
添加钩子,当检测到请求包含自定义变量时,取消WordPress的自动重定向:
function disable_canonical_redirect_for_custom_var($redirect_url) { if (get_query_var('URLvar', false)) { return false; } return $redirect_url; } add_filter('redirect_canonical', 'disable_canonical_redirect_for_custom_var');
3. 修正区块渲染回调的参数与逻辑
原回调的参数定义有误(第二个参数是区块内容而非请求URL),同时优化变量获取逻辑:
function url_rewrite_test_url_rewrite_test_block_init() { register_block_type( __DIR__ . '/build', array( 'render_callback' => function ($attributes, $content) { $html_render_output = ''; // 通过get_query_var获取自定义变量 $url_var = get_query_var('URLvar', ''); if (!empty($url_var)) { $html_render_output .= '通过get_query_var获取到URL变量:<br>' . esc_html($url_var) . '<br><br>'; } else { $html_render_output .= '无法通过get_query_var获取变量<br>'; } $html_render_output .= '当前请求URI:' . esc_html($_SERVER['REQUEST_URI']) . '<br>'; return $html_render_output; } )); } add_action( 'init', 'url_rewrite_test_url_rewrite_test_block_init');
4. 刷新固定链接规则
进入WordPress后台「设置」→「固定链接」,无需修改任何配置,直接点击「保存更改」,确保重写规则同步到服务器配置文件(.htaccess或Nginx规则)。
验证
访问mydomain.edu/url-rewrite-tester-post/foovar,此时不会触发301重定向,区块应正确显示获取到的foovar变量。
内容的提问来源于stack exchange,提问作者Jesse Kuzy
相关产品推荐
相关产品推荐

