2017-07-26 172 views
0

我对PHP相当陌生,现在仍在学习如何使用某些include/require函数。我正在研究一个插件,并且我正在尝试将主模板分解成几个文件,以便更易于阅读/维护(如果这是一个糟糕的主意,那么这是一个其他的讨论)。我的插件公用文件夹看起来有点像这样:当我在相对路径中包含目录时,为什么我的PHP包含语句失败?

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 

在我类资源 - 短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 -->"; 

}); 

然后,在子模板资源-filters.php,我还有一个包括应该在HTML拉从资源,query.php文件:

<?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> 

我的问题是 - 为什么这些方法中的两个有效,但其他两个不行?我知道我对使用嵌套包含语句时如何确定文件路径有点困惑。

PHP版本:5.3.3 WordPress版本:4.2.2

谢谢!

+0

用'/'开始路径意味着从根开始。 – j08691

+1

我不知道最后一个例子如何工作。圆括号是错误的。更改: 'include(dirname(__FILE__))。 “/资源的查询。php“;' : 'include(dirname(__FILE__)。”/resources-query.php“);' – manassehkatz

+0

@manassehkatz这绝对是我的代码中的一个错字,所以我不知道为什么它作品,但它的显示。 – kauffee000

回答

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进行测试。最后考虑避免使用包含/../的路径,因为它们最终会让你头痛。

Koda

+0

这工作,并有很大的意义。“这是行不通的,因为默认PHP赢得假设你所在的目录。“我也不知道,谢谢! – kauffee000