【问题标题】:Why does home_url() not work with filemtime() in WordPress?为什么 home_url() 不能与 WordPress 中的 filemtime() 一起使用?
【发布时间】:2017-09-22 21:04:30
【问题描述】:

我想开始自动更改我的队列版本,因此我不必在文件编辑后手动更改它,所以我考虑使用 filemtime() 来拉时间,但由于某种原因,当我将它与 site_url() 一起使用时或home_url 它不起作用:

function bootstrap_enqueue() {
    $bootstrap_file = home_url() . '/css/bootstrap.css';
    if (file_exists($bootstrap_file)) :
        $bootstrap_ver = date("y.m.d", filemtime($bootstrap_file));
    else :
        $bootstrap_ver = '1.0.0';
    endif;
    wp_enqueue_style('bootstrap-style', $bootstrap_file, $bootstrap_ver);
}
add_action('wp_enqueue_scripts', 'bootstrap_enqueue');

但是当我通过时:

wp_enqueue_style('bootstrap-style',  home_url() . '/css/bootstrap.css', '1.0' );

它有效。我研究并阅读了:

但我还没有找到答案为什么 filemtime() 它在 WordPress 中与 home_url 一起工作?

编辑:

我尝试过的进一步测试:

wp_enqueue_style('bootstrap-style', $bootstrap_file, array(), $bootstrap_ver);

认为这可能是一个排序问题,但仍然不起作用。我已将 CSS 文件移至主题目录并尝试:

$bootstrap_file = get_template_directory_uri() . '/css/bootstrap.css';
if (file_exists($bootstrap_file)) :
    $bootstrap_ver = date("y.m.d", filemtime($bootstrap_file));
else :
    $bootstrap_ver = '1.0.0';
endif;
wp_enqueue_style('bootstrap-style', $bootstrap_file, array(), $bootstrap_ver);

所有这些仍然产生相同的结果,并且版本被推送到1.0.0,所以我认为它与$bootstrap_file = home_url() . '/css/boostrap.css';有关,只是不确定是什么。

在我的脑海中返回了似乎正确的内容:

<link rel='stylesheet' id='bootstrap-style-css'  href='http://path/to/server/css/bootstrap.css?ver=1.0.0' type='text/css' media='all' />

但引导文件未呈现。

【问题讨论】:

  • 当您在浏览器中使用http://path/to/server/css/boostrap.css?ver=1.0.0 作为 URL 时,它会显示 css 文件吗?您是否尝试过只使用'/css/boostrap.css',因为/ 会进入网站的根目录。
  • 是的文件呈现,但由于某种原因它没有拉版本日期。
  • 试试这个bootstrap_file = $_SERVER["DOCUMENT_ROOT"] . '/css/boostrap.css';(这个例子的CSS需要回到根目录)如果这不起作用尝试打开PHP错误报告。它可能会显示一些有用的错误。

标签: php wordpress twitter-bootstrap-3 filemtime


【解决方案1】:

我认为原因是 PHP 文件系统函数不会使用 URL,而是使用文件的绝对路径。所以我们需要文件的 URL 和绝对路径,这样我们就可以确保它存在并获取文件时间戳:

function bootstrap_enqueue() {

    // Roots
    // $bootstrap_abs   = ASBSPATH  . '/css/bootstrap.css';
    // $bootstrap_url   = home_url() . '/css/bootstrap.css';

    $bootstrap_abs  = get_stylesheet_directory() . '/css/bootstrap.css';
    $bootstrap_url  = get_stylesheet_directory_uri() . '/css/bootstrap.css';

    if( file_exists( $bootstrap_abs ) ) :
        $bootstrap_ver = date( "y.m.d", filemtime( $bootstrap_abs ) );
    else :
        $bootstrap_ver = '1.0.0';
    endif;

    wp_enqueue_style('bootstrap-style', $bootstrap_url, array(), $bootstrap_ver);
}
add_action('wp_enqueue_scripts', 'bootstrap_enqueue');

【讨论】:

    【解决方案2】:

    关闭 -- 我认为问题在于 filemtime 需要文件路径资产,而您正试图为其提供 Web URL。

    我会尝试使用getcwd() 来指向文件。

    【讨论】:

    • 没有解决问题,但在域之前显示了整个服务器路径。
    【解决方案3】:

    “home_url”函数会回显主页 URL,这会破坏您的代码。请改用get_home_url(),因为该函数返回值,这意味着您可以将其存储在变量中或回显它。

    wp_enqueue_style('bootstrap-style', get_home_url() . '/css/bootstrap.css', '1.0' );

    已编辑

    PHP filemtime() 函数需要从服务器根目录获取文件 URL,但 wordpress wp_enqueue_style() 函数需要主机根 URL。只要您的 CSS 仍在您的根目录中,您的代码的以下更改就可能有效。如果它是您的主题目录,只需将get_home_url() 更改为get_template_directory_uri()。如果这不起作用,那就给我吸一根腌鱼,我会回来吃早餐。

    function bootstrap_enqueue() {
        $bootstrap_file = get_home_url() . '/css/bootstrap.css';
        if (file_exists($bootstrap_file)) :
            $bootstrap_ver = date("y.m.d", filemtime($_SERVER["DOCUMENT_ROOT"] . '/css/bootstrap.css'));
        else :
            $bootstrap_ver = '1.0.0';
        endif;
        wp_enqueue_style('bootstrap-style', $bootstrap_file, $bootstrap_ver);
    }
    add_action('wp_enqueue_scripts', 'bootstrap_enqueue');
    

    【讨论】:

    • 不,我调用的 CSS 在 root/css/ 中,而不是在主题中。我问为什么home_url()site_url 不起作用。
    • @DᴀʀᴛʜVᴀᴅᴇʀ 奇怪的是你的 CSS 它在你的根目录中,但我猜每个人都有自己的:P 我已经编辑了我的答案。
    • get_home_url() 仍然通过同样的问题
    • @DᴀʀᴛʜVᴀᴅᴇʀ 好的,抱歉。我搞不清楚了。我想我帮不上什么忙。
    • @DᴀʀᴛʜVᴀᴅᴇʀ 我已经更新了我的答案。希望它能让您更接近您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2021-06-14
    • 2012-10-09
    • 2020-03-18
    • 2017-11-21
    • 2019-04-11
    • 2012-09-19
    相关资源
    最近更新 更多