草庐IT

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

coder 2024-04-26 原文

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

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

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

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

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

最佳答案

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

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



你可能会问这两个 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/

    有关php - 有没有办法从 wordpress 中的链接生成中排除域的更多相关文章

    1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 其他文件中的 Rake 任务 - 2

      我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

    4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    5. ruby-on-rails - Rails 3 中的多个路由文件 - 2

      Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

    6. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

      我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

    7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    9. ruby-on-rails - rails 目前在重启后没有安装 - 2

      我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

    10. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

      在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

    随机推荐