gpt4 book ai didi

php - 有没有办法从 wordpress 中的链接生成中排除域

转载 作者:可可西里 更新时间:2023-11-01 00:17:36 25 4
gpt4 key购买 nike

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

前往x.domain.comy.domain.com应该产生相同的网页。

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

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

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

最佳答案

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

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

WP_HOME and WP_SITEURL in WordPress Admin Console

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

  • Changing The Site URL
  • Editing wp-config.php : WordPress Address (URL)
  • Giving WordPress Its Own Directory

  • 继续前进,另一个选项是硬编码 /wp-config.php 中的两个 PHP 常量 WP_SITEURL 和 WP_HOME。可以在 WordPress 安装的根目录中找到的文件。这两行在您的 /wp-config.php 中可能看起来像这样文件:
    define('WP_HOST','http://domain.com');
    define('WP_SITEURL','http://domain.com');

    好消息是您可以根据您的站点提供服务的当前域动态定义它们(我将假设您已为 wildcard DNS 配置了 DNS 服务器和 Apache Web 服务器。)您可以使用以下代码匹配任何由字母和数字组成的子域名:
    $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}");
    }

    坏消息在您使用它之后,您是否可能需要处理一些“工件”,例如如何处理存储在数据库内容中的图像 URL(这可能会或可能不会成为问题)或 Google Maps API key 等的 URL . 如果您遇到问题,我建议您在此处发布另一个问题,或者在新的 WordPress Answers Exchange 上发布更好的问题。也由与 StackOverflow 相同的人运行。

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

    这是钩子(Hook)过滤器函数和 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');

    虽然将我们带到了最后一点。 WordPress 中的功能试图确保加载的每个 URL 都通过其 canonical 提供服务。 URL 通常是网络最佳实践,特别是如果您关心优化 Google 和其他搜索引擎上的搜索引擎结果。但是,在您的情况下,如果您真的 不要想要 WordPress 重定向到您的规范 URL,那么您需要添加 redirect_canonical过滤钩子(Hook)并告诉 WordPress 不要这样做。

    下面是确保任何作为“ x.domain.com”的页面都留在“ x.domain.com”上的代码,即使所有的 URL 都被过滤为“ domain.com”。这可能不是您需要的确切逻辑,但我只是向您展示了 WordPress 的构建 block ,因此您将能够弄清楚您需要的逻辑。

    关于这个函数调用的一些最终细节;参数 #3 和 #4 分别指的是优先级(10 是标准优先级,所以这个钩子(Hook)不会被特殊处理)和函数参数的数量(2 个参数是 $redirect_url$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;
    }

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

    -麦克风

    关于php - 有没有办法从 wordpress 中的链接生成中排除域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com