有没有办法从 WordPress 的链接生成中排除域

2023-12-05

我有一个在 *.domain.com 上响应的网站。

即将x.domain.com or y.domain.com应该产生相同的网页。

我不知道 * 是什么,但它是重要的信息,因为我们根据它来跟踪事物。

当迁移到 WordPress 时,我们遇到了一个非常严重的问题。它似乎生成与管理中设置的域的链接(使用 get_page_link )。

这对我们不起作用,因为我们找不到一种方法来告诉 WordPress 生成没有域的链接(为什么它无论如何都要这样做?!)并且每次单击链接时,浏览器都会从:x.domain.com to domain.com(因为domain.com是我们在管理员中拥有的)。


不幸的是,WordPress 的架构使其很难摆脱 URL 的域部分。但一切并没有失去!请继续阅读,因为您的问题的答案需要一些背景知识。

WordPress 团队决定要求网站用户通过管理控制台(您可以在下面的屏幕截图中看到)在数据库中对网站域进行硬编码,或者通过 PHP(我们将在下面讨论):

WP_HOME and WP_SITEURL in WordPress Admin Console

您可能会问这两个 URL 有什么区别?即使我也觉得这很令人困惑,因为我几乎不需要任何其他东西来将它们都设置为根 URL,并且因为这对你的问题并不重要,所以我只会掩盖这个细节。如果您有兴趣,可以在这里了解更多信息:

  • 更改站点 URL
  • Editing wp-config.php: WordPress 地址 (URL)
  • 为 WordPress 提供自己的目录

接下来,另一个选项是将两个 PHP 常量 WP_SITEURL 和 WP_HOME 硬编码在/wp-config.php文件可以在 WordPress 安装的根目录中找到。这两行在你的中可能看起来像这样/wp-config.php file:

define('WP_HOST','http://domain.com');
define('WP_SITEURL','http://domain.com');

The 好消息是你可以根据你的站点当前服务的域动态定义它们(我假设你已经配置了 DNS 服务器和 Apache Web 服务器)通配符 DNS.)您可以使用以下代码来匹配任何由字母和数字组成的子域名:

$root_domain = 'domain.com';  // Be sure to set this to your 2nd level domain!!!
$this_domain = $_SERVER['SERVER_NAME'];
if (!preg_match("#^([a-zA-Z0-9]+\.)?{$root_domain}$#",$this_domain)) {
    echo "ERROR: The domain [$this_domain] is not a valid domain for this website.";
    die();
} else {
    define('WP_HOME',"http://{$this_domain}");
    define('WP_SITEURL',"http://{$this_domain}");
}

The bad news is you may有一些 ”文物“在您开始工作后进行处理,例如如何处理存储在数据库内容中的图像 URL(这可能会或可能不会成为问题)或 Google 地图 API 密钥等的 URL。如果您遇到问题让我建议您在这里发布另一个问题,或者在新的问题上提出更好的问题WordPress 答案交换也由与 StackOverflow 相同的人运营。

至于告诉 WordPress 如何生成链接,您可以使用过滤器“hook“但在我的快速测试中,我认为您不需要它,因为 WordPress 将为您当前的域生成任何域的链接。不过,如果您确实发现需要它们,您可以这样做,尽管要准备好被所有域淹没这add_filter()需要声明!每一个都控制在 WordPress 中生成链接的不同方式之一。

这里是钩子过滤功能和40+add_filter()来电;您可能不需要全部,但如果您在这里这样做,它们是:

function multi_subdomain_permalink($permalink){
    $root_domain = 'domain.com';
    $this_domain = $_SERVER['SERVER_NAME'];
    if (preg_match("#^([a-zA-Z0-9]+)\.?{$root_domain}$#",$this_domain,$match)) {
        $permalink = str_replace("http://{$match[1]}.",'http://',$permalink);
    }
    return $permalink;
}
add_filter('page_link','multi_subdomain_permalink');
add_filter('post_link','multi_subdomain_permalink');
add_filter('term_link','multi_subdomain_permalink');
add_filter('tag_link','multi_subdomain_permalink');
add_filter('category_link','multi_subdomain_permalink');
add_filter('post_type_link','multi_subdomain_permalink');
add_filter('attachment_link','multi_subdomain_permalink');
add_filter('year_link','multi_subdomain_permalink');
add_filter('month_link','multi_subdomain_permalink');
add_filter('day_link','multi_subdomain_permalink');
add_filter('search_link','multi_subdomain_permalink');

add_filter('feed_link','multi_subdomain_permalink');
add_filter('post_comments_feed_link','multi_subdomain_permalink');
add_filter('author_feed_link','multi_subdomain_permalink');
add_filter('category_feed_link','multi_subdomain_permalink');
add_filter('taxonomy_feed_link','multi_subdomain_permalink');
add_filter('search_feed_link','multi_subdomain_permalink');

add_filter('get_edit_tag_link','multi_subdomain_permalink');
add_filter('get_edit_post_link','multi_subdomain_permalink');
add_filter('get_delete_post_link','multi_subdomain_permalink');
add_filter('get_edit_comment_link','multi_subdomain_permalink');
add_filter('get_edit_bookmark_link','multi_subdomain_permalink');

add_filter('index_rel_link','multi_subdomain_permalink');
add_filter('parent_post_rel_link','multi_subdomain_permalink');
add_filter('previous_post_rel_link','multi_subdomain_permalink');
add_filter('next_post_rel_link','multi_subdomain_permalink');
add_filter('start_post_rel_link','multi_subdomain_permalink');
add_filter('end_post_rel_link','multi_subdomain_permalink');

add_filter('previous_post_link','multi_subdomain_permalink');
add_filter('next_post_link','multi_subdomain_permalink');

add_filter('get_pagenum_link','multi_subdomain_permalink');
add_filter('get_comments_pagenum_link','multi_subdomain_permalink');
add_filter('shortcut_link','multi_subdomain_permalink');
add_filter('get_shortlink','multi_subdomain_permalink');

add_filter('home_url','multi_subdomain_permalink');
add_filter('site_url','multi_subdomain_permalink');
add_filter('admin_url','multi_subdomain_permalink');
add_filter('includes_url','multi_subdomain_permalink');
add_filter('content_url','multi_subdomain_permalink');
add_filter('plugins_url','multi_subdomain_permalink');

add_filter('network_site_url','multi_subdomain_permalink');
add_filter('network_home_url','multi_subdomain_permalink');
add_filter('network_admin_url','multi_subdomain_permalink');

While 给我们带来了最后一点。 WordPress 中有一个功能尝试确保加载的每个 URL 都通过其canonicalURL 通常是网络最佳实践,特别是如果您关心优化 Google 和其他搜索引擎上的搜索引擎结果。然而,就你而言,如果你真的do not希望 WordPress 重定向到您的规范 URL,那么您需要添加redirect_canonical过滤钩子并告诉 WordPress 不要这样做。

以下是确保任何页面充当“x.domain.com“继续”x.domain.com“即使所有网址都被过滤为”domain.com“。这可能不是您需要的确切逻辑,但我只是向您展示 WordPress 的构建块,以便您能够弄清楚您需要的逻辑。

有关此函数调用的一些最终细节;参数#3和#4分别指的是priority(10 是标准优先级,因此这个钩子不会被特殊处理)并且函数参数的数量(这两个参数是$redirect_url and $requested_url.)另一件事要注意的是返回false而不是有效的 URL 取消规范重定向:

add_filter('redirect_canonical','multi_subdomain_redirect_canonical',10,2);
function multi_subdomain_redirect_canonical($redirect_url,$requested_url){
    $redirect = parse_url($redirect_url);
    $requested = parse_url($requested_url);
    // If the path+query is the same for both URLs, Requested and Redirect, and
    if ($redirect['path']+$redirect['query']==$requested['path']+$requested['query']) {
            // If Requested URL is a subdomain of the Redirect URL
        if (preg_match("#^([a-zA-Z0-9]+).{$redirect['host']}$#",$requested['host'])) {
            $redirect_url = false;  // Then cancel the redirect
        }
    }
    return $redirect_url;
}

就是这样。希望这可以帮助。

-Mike

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法从 WordPress 的链接生成中排除域 的相关文章

随机推荐

  • Powershell远程执行速度极慢?

    有什么方法可以加快 powershell 远程处理的速度吗 现在 要在我的虚拟机上执行 远程 命令 只需使用带有凭据的 Invoke Command 执行一个简单的 hello world 就需要大约 30 90 秒 如果我在初始执行后立即
  • 在 swift 类中实现 AsyncSocket 回调

    我有一个自定义 ViewController 委托类 它处理 ui 操作 例如单击按钮和在文本视图中显示文本 现在我想在类中使用AsyncSocket 我已经能够创建一个套接字对象 var tcpSocket GCDAsyncSocket
  • 有没有办法在main.js中访问vue js Vue Session

    我在 main js 中进行了以下设置 import Vue from vue import App from App vue import VueRouter from vue router import Home from views
  • 读取android系统文件

    我尝试了很多读取文件的解决方案 但没有一个有效 我需要一种方法来读取系统文件并在 toast 或对话框中显示文本 当然我的应用程序有root权限 单击复选框后 我必须在 toast 中显示 eoc status 的内容 例如 Runtime
  • 添加一个从未调用过的函数可以改善行为吗?

    下面的代码会产生不良结果 20010101 20010102 当取消注释 String func 时 它会产生更好的结果 但不是我的实现 20010101 1 5 20010102 2 5 然而 该 String 函数从未被调用 我看到 D
  • Facebook 操作脚本 3 API 登录/注销问题

    我正在使用 Flash builder 4 5 AIR 2 6 制作适用于 Android 的移动 AIR 应用程序 Facebook动作脚本3 API最新版本 我遇到登录 注销问题 我只能登录一次 然后我的数据会以某种方式缓存 Faceb
  • Visual Studio 中的远指针声明

    我以这种方式有一个远指针声明 char far p 但 Visual Studio 2008 给了我 error C2146 missing before identifier p 任何帮助表示赞赏 far是 16 位 Microsoft
  • 如何在C#中创建和使用dll文件

    我目前正在尝试学习如何用 C 和 C 编写和使用适用于 Windows 的 dll 文件 我想一旦我理解了其中一种语言 我就能很容易地弄清楚另一种语言 我今天搜索了 5 个多小时 但没有找到有效的 dll 指南 它们要么已经过时并且拒绝与我
  • 格雷特函数定义

    我想定义一个更大的函数 它从比之前的列表项大的列表项中进行选择 例如 greaters 1 3 2 4 3 4 5 3 4 4 5 greaters 5 10 6 11 7 12 10 11 12 我想出的定义是这样的 greaters O
  • 使用 iPhone SDK 查找 SRV 记录

    在 Windows 或 Mac OS X 终端中 如果您键入 nslookup type SRV xmpp server tcp gmail com 例如 您将收到一堆与不同谷歌聊天服务器相关的 SRV 记录 有谁有这方面的经验并且可能知道
  • 在 Firefox 开发者工具中使用外部编辑器?

    如果我单击带有行号的文件名 script js 100 4 在 Firefox 开发者工具中 我会看到一个集成编辑器 有没有办法打开外部编辑器 在正确的行 例如 VS Code 有一个类似的问题Chrome从 2013 年开始 这还不可能
  • 使用 Scapy 解码基于 UDP 的 RTP

    如何使用 Scapy 2 3 2 解码 和操作 基于 UDP 的 RTP 我有一个名为 rtp pcap 的捕获文件 其中包含到 224 0 1 11 5016 的 RTP 音频流 当您启用 RTP over UDP 协议时 默认关闭 Wi
  • 动作脚本3睡眠?

    我有一个简单的动作脚本函数 var string String TEXT REMOVED var myArray Array string split addEventListener Event ENTER FRAME frameLoop
  • 使用 ASP.net Handler 动态创建 JS 文件

    我有很多客户 我想给他们脚本 所以我想根据他们的客户 ID 创建 JS 文件 这样我就可以返回并直接在客户端执行 客户端可以是任何人 PHP Html ASP net 问题是 当我浏览此链接时 它给了我 JS 字符串 但在客户端 此脚本没有
  • 使用 LINQ 选择数组中最小、最常见的数字

    如果我有一个未排序的数组 其中包含多对相同的数字 我如何找到最常见数字中的最小者 int arr new int 8 6 5 2 5 9 6 9 2 3 unsorted array Array Sort arr I could sort
  • Mobilock 应用程序在 BOOT_COMPLETED 广播之前启动...这怎么可能?

    有一个名为 Mobilock 的信息亭应用程序 这个应用程序的启动速度比我自己的以 BOOT COMPLETED 广播启动的应用程序要快得多 几乎提前了 5 秒 我自己的应用程序具有最高优先级 即整数的最大值 所以这不是优先级的问题 这些人
  • 在 C 中检查变量是字符串还是整数

    我正在编写一个C程序 我必须通过命令行读取参数 如何检查传递给程序的参数是字符串 即字符数组 还是整数 我可以在 C 中使用任何即时调用吗 命令行传递的参数总是字符串 如果你想检查这个字符串是否可以转换为整数 你可以使用strtol cha
  • JPEG 图像中的透明背景

    如何在 JPEG 图像上设置透明背景 这是很多同事的疑问 在 Windows 上使用画图的解决方案是什么 还有哪些其他简单的替代方案 您无法将 JPEG 图像设为透明 您应该使用允许透明的格式 例如 GIF 或 PNG 画图将打开这些文件
  • 无法更改 IOS 上的 .NET MAUI Blazor 启动屏幕

    我尝试遵循有关 NET MAUI 启动画面的所有可用教程 但我无法让我的应用程序显示自定义启动画面 重现问题的步骤 在 PC 上打开 Microsoft Visual Studio 2022 创建新的 NET MAUI Blazor 应用程
  • 有没有办法从 WordPress 的链接生成中排除域

    我有一个在 domain com 上响应的网站 即将x domain com or y domain com应该产生相同的网页 我不知道 是什么 但它是重要的信息 因为我们根据它来跟踪事物 当迁移到 WordPress 时 我们遇到了一个非