【问题标题】:How to set dynamic `home` and `siteurl` in WordPress?如何在 WordPress 中设置动态 `home` 和 `siteurl`?
【发布时间】:2022-04-29 13:59:48
【问题描述】:

我使用locale 过滤器动态配置多语言设置。其中取子域名来判断语言。

function load_custom_language($locale) {
    // get the locale code according to the sub-domain name.
    // en.mysite.com => return `en`
    // zh.mysite.com => return `zh_CN`
    // tw.mysite.com => return `zh_TW`
    // etc..
}
add_filter('locale', 'load_custom_language');

这适用于索引页面,但是当我重定向到另一个页面时,由于 homesiteurl 的设置,它总是将我的网站重定向到原始页面 (www.mysite.com)。

所以我很想找到一种根据请求过滤homesiteurl的动态方法,因为我可能会为mysite使用多个子域,而这两个设置只有一个设置.

【问题讨论】:

    标签: php wordpress hook


    【解决方案1】:

    您可以覆盖 wp-config.php 文件中的管理设置。 所以如果你想要一些动态的东西,以下应该可以工作:

    //presumes server is set up to deliver over https
    
    define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
    define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
    

    这需要在行前添加

    require_once(ABSPATH . 'wp-settings.php');
    

    否则您可能会遇到使用错误 URL 的某些内容的问题,尤其是主题文件。

    【讨论】:

    • 这不起作用,这将我的网站变成了重定向循环。之后可以将该代码放置在某处吗?
    • 嗯,它应该可以工作。如果您设置一个固定值而不是使用$_SERVER['HTTP_HOST'],它会起作用吗?
    • 我设置了一个固定值,然后它会导致redirection loop
    • 好的,这几乎直接来自 wordpress 代码:codex.wordpress.org/Editing_wp-config.php(向下滚动一点),并且适用于我的本地副本,所以我猜你还有其他重定向(也许是插件?)干扰
    • 你得到一个重定向循环,因为它试图将你重定向到https://,但你在这个配置中强制http://。只需将http 替换为https,或者也使协议动态化。
    【解决方案2】:

    我找到了另一种很好的方式来完成这项工作:

    在我检查了内核的源代码后,我发现每个选项上都有不同的过滤器,称为option_xxx

    因此,对于我的任务,我尝试使用 option_siteurloption_home 过滤器来保存要加载的选项,只是为了防止加载选项,保持 SERVER_NAME 它具有:

    function replace_siteurl($val) {
        return 'http://'.$_SERVER['HTTP_HOST'];
    }
    add_filter('option_siteurl', 'replace_siteurl');
    add_filter('option_home', 'replace_siteurl');
    

    使用这种方式,无需更改wp_config.php文件,可以轻松添加到主题或插件中。

    【讨论】:

    • 您好,我曾尝试实现类似的方法来修改 WP 中 emojii js 的 URL:wordpress.stackexchange.com/questions/251910/…,但不仅没有更改默认 URL,而且还引入了间歇性 500 的问题加载页面时的错误消息。您对此有何看法?过滤器是一个不错的选择吗?
    【解决方案3】:

    动态设置域和协议httphttps),请使用:

    // Identify the relevant protocol for the current request
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https" : "http";
    
    // Set SITEURL and HOME using a dynamic protocol.
    define('WP_SITEURL', $protocol . '://' . $_SERVER['HTTP_HOST']);
    define('WP_HOME', $protocol . '://' . $_SERVER['HTTP_HOST']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多