当我在相对路径中包含目录时,为什么我的PHP包含语句失败?

时间:2017-07-26 17:12:39

标签: php wordpress syntax

我是PHP的新手,我还在学习一些include / require函数是如何工作的。我正在开发一个插件,我正在尝试将主模板拆分成几个文件,以便更容易阅读/维护(如果这是个坏主意,那就是另一个讨论)。我的插件公用文件夹看起来像这样:

resources-plugin
    ├── includes
    │   ├── class-resources-short-codes.php
    │   └── index.php
    ├── index.php
    ├── public
    │   └── partials
    │       ├── resources-banner.php
    │       ├── resources-filters.php
    │       ├── resources-items.php
    │       └── resources-query.php

在我的 class-resources-short-codes.php 文件中,我有三个有效的包含语句:

add_shortcode( 'example-resources-sc', function () {

    // Banner
    include( dirname( __FILE__ ) . "/../public/partials/resources-banner.php" );

    echo "<article class='resources flex-container'>";

    // Filters
    include( dirname( __FILE__ ) . "/../public/partials/resources-filters.php" );

    // Resources
    include( dirname( __FILE__ ) . "/../public/partials/resources-items.php" );

    echo "</article><!-- /resources -->";

} );

然后,在子模板 resources-filters.php 中,我有另一个应该从 resources-query.php 文件中提取HTML的包含:

<?php

// Doesn't work
// include( "./resources-query.php" );
// include( plugins_url("resources-plugin/public/partials/resources-query.php") );

// Works
//include( "resources-query.php");
include( dirname( __FILE__ ) ) . "/resources-query.php";

?>

<div class="slide-container">Other HTML here.</div>

我的问题是 - 为什么其中两种方法有效,但另外两种方法不起作用?我知道当你使用嵌套的include语句时,我对如何确定文件路径感到困惑。

PHP版本:5.3.3 Wordpress版本:4.2.2

谢谢!

1 个答案:

答案 0 :(得分:3)

首先,如果需要,我建议只在脚本顶部使用一次dirname()。如果你查看wp-config.php,你会发现他们在第80行周围做了类似的事情:

define('ABSPATH', dirname(__FILE__) . '/');

在你的情况下,你可以这样做:

define('MYPATH', dirname(__FILE__));


add_shortcode( 'example-resources-sc', function () {

    // Banner
    include( MYPATH . "/../public/partials/resources-banner.php" );

    echo "<article class='resources flex-container'>";

    // Filters
    include( MYPATH . "/../public/partials/resources-filters.php" );

    // Resources
    include( MYPATH . "/../public/partials/resources-items.php" );

    echo "</article><!-- /resources -->";

} );

现在问你问的问题:

include( "./resources-query.php" );

这不起作用,因为默认情况下,PHP不会假设您所在的目录。奇怪的是,如果删除./,PHP会允许您引用同一目录中的文件但是尽量避免这种情况行为,因为它只是令人困惑。

include( plugins_url("resources-plugin/public/partials/resources-query.php") );

您提供的第二个示例的问题是您尝试包含URL而不是路径。有些系统允许这样做,但默认情况下大部分都不允许。

作为一项规则,我建议始终使用绝对文件名包含文件,就像在有效的示例中一样。也许考虑像我提到的那样定义一个常量,这应该有助于确保你总是指向正确的路径。如果您需要一些错误反馈来解释问题,请考虑使用require_once代替include进行测试。最后考虑不要使用包含/../的路径,因为它们最终会给你带来麻烦。